Скачиваний:
26
Добавлен:
01.05.2014
Размер:
133.12 Кб
Скачать

5. L1c4list.H

#ifndef IIIlistIII

#define IIIlistIII

#include "l1c3liel.cpp"

#include <stdio.h>

template <class Typer>

class List

{

ListEl<Typer>* First;

ListEl<Typer>* current;

public:

List();

void tobegin();

void move();

void add(Typer F);

void del();

void out();

void GetCur(Typer &F);

void GetInf(Typer &F);

void SetInf(const Typer F);

int GetNum();

int Empty();

~List();

};

#endif

6. L1c4list.Cpp

#ifndef IIIlistcppIII

#define IIIlistcppIII

#include "l1c4list.h"

template <class Typer>

List<Typer>::List()

{

First = NULL;

}

template <class Typer>

void List<Typer>::tobegin()

{

current=First;

};

template <class Typer>

void List<Typer>::move()

{

current=(*current).GetNext();

};

template <class Typer>

void List<Typer>::add(Typer F)

{

ListEl<Typer>* pNewEl;

pNewEl = new ListEl<Typer>;

(*pNewEl).SetFig(F);

if (Empty())

{

First = pNewEl;

(*First).SetNext(First);

}

else

{

ListEl<Typer>* P=First;

ListEl<Typer>* XY=(*First).GetNext();

tobegin();

while ((*P).GetNext() != First)

P = (*P).GetNext();

(*P).SetNext(pNewEl);

(*pNewEl).SetNext(First);

First = pNewEl;

};

tobegin();

};

template <class Typer>

void List<Typer>::del()

{

if (!Empty())

{

if (First == (*First).GetNext())

{

delete First;

First = NULL;

}

else

{

ListEl<Typer> *P=First;

while ((*P).GetNext() != current)

P = (*P).GetNext();

if (current == First)

First = P;

(*P).SetNext((*((*P).GetNext())).GetNext());

delete current;

};

tobegin();

}

};

template <class Typer>

void List<Typer>::out()

{

if (Empty())

cout<<"empty list";

else

{

ListEl<Typer> *P=First;

Typer F;

do

{

(*P).GetFig(F);

F.Out();

P = (*P).GetNext();

}

while (P != First);

};

};

template <class Typer>

void List<Typer>::GetCur(Typer &F)

{

(*current).GetFig(F);

del();

};

template <class Typer>

void List<Typer>::GetInf(Typer &F)

{

(*current).GetFig(F);

}

template <class Typer>

int List<Typer>::Empty()

{

return (First == NULL);

}

template <class Typer>

void List<Typer>::SetInf(const Typer F)

{

(*current).SetFig(F);

}

template <class Typer>

List<Typer>::~List()

{

delete First;

delete current;

}

#endif

7. L1c2triangle.H

#include <graphics.h>

#ifndef IIItriangleIII

#define IIItriangleIII

#include "l1c1point.h"

#include "l1c4list.cpp"

class cTriangle

{

private:

List<cPoint> Tr;

void Center(double &X,double &Y);

public:

cTriangle();

cTriangle(const cPoint P1,const cPoint P2,const cPoint P3);

void Set(const int i, const cPoint& F);

float GetX(const int i);

float GetY(const int i);

int getquantity();

int rb();

int correct();

void move(const float dx, const float dy);

void rotate(const float x0,const float y0, const float al);

void Set(cTriangle &F);

void scale(const float coef);

~cTriangle();

void Out();

void Draw();

};

#endif

8. L1c4triangle.Cpp

#ifndef IIItrianglecppIII

#define IIItrianglecppIII

#include "l1c2trgl.h"

cTriangle::~cTriangle(){};

void cTriangle::Set(const int i, const cPoint& F)

{

Tr.tobegin();

int k;

for (k=1;k<=i-1;k++)

Tr.move();

Tr.del();

Tr.add(F);

}

void cTriangle::Set(cTriangle &F)

{

int k;

Tr.del();

Tr.del();

Tr.del();

cPoint P;

for (k=1;k<=3;k++)

{

P.SetXY(F.GetX(k),F.GetY(k));

Set(k,P);

};

}

float cTriangle::GetX(const int i)

{

int k;

Tr.tobegin();

for (k=1;k<=i-1;k++)

Tr.move();

cPoint P;

Tr.GetInf(P);

return P.GetX();

}

float cTriangle::GetY(const int i)

{

int k;

Tr.tobegin();

for (k=1;k<=i-1;k++)

Tr.move();

cPoint P;

Tr.GetInf(P);

return P.GetY();

}

int cTriangle::rb()

{

float X1,X2,X3,Y1,Y2,Y3,a,b,c;

X1 = GetX(1);

X2 = GetX(2);

X3 = GetX(3);

Y1 = GetY(1);

Y2 = GetY(2);

Y3 = GetY(3);

a = (X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1);

b = (X3-X2)*(X3-X2)+(Y3-Y2)*(Y3-Y2);

c = (X3-X1)*(X3-X1)+(Y3-Y1)*(Y3-Y1);

return ((fabs(a-b)<0.01)||(fabs(a-c)<0.01)||(fabs(c-b)<0.01));

};

int cTriangle::correct()

{

float X1,X2,X3,Y1,Y2,Y3,a,b,c;

X1 = GetX(1);

X2 = GetX(2);

X3 = GetX(3);

Y1 = GetY(1);

Y2 = GetY(2);

Y3 = GetY(3);

a = sqrt((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1));

b = sqrt((X3-X2)*(X3-X2)+(Y3-Y2)*(Y3-Y2));

c = sqrt((X3-X1)*(X3-X1)+(Y3-Y1)*(Y3-Y1));

return !(((fabs(a-b-c)<0.01)||(fabs(b-c-a)<0.01)||(fabs(c-b-a)<0.01)));

};

cTriangle::cTriangle(const cPoint P1,const cPoint P2,const cPoint P3)

{

Tr.add(P1);

Tr.add(P2);

Tr.add(P3);

if (!(rb() && correct()))

{

Tr.del();

Tr.del();

Tr.del();

cPoint P4(0,0),P5(1,0),P6(0,1);

Tr.add(P4);

Tr.add(P5);

Tr.add(P6);

};

}

cTriangle::cTriangle()

{

cPoint P1(0,0),P2(1,0),P3(0,1);

Tr.add(P1);

Tr.add(P2);

Tr.add(P3);

}

void cTriangle::move(const float dx,const float dy)

{

Tr.tobegin();

int k;

cPoint P;

for (k=0;k<3;k++)

{

Tr.GetInf(P);

P.Move(dx,dy);

Tr.SetInf(P);

Tr.move();

};

if (!(rb() && correct()))

{

cout<<endl<<"incorrect conditions!";

getch();

exit(1);

};

};

void cTriangle::rotate(const float x0,const float y0,const float al)

{

Tr.tobegin();

int k;

cPoint P;

for (k=0;k<3;k++)

{

Tr.GetInf(P);

P.Rotate(x0,y0,al);

Tr.SetInf(P);

Tr.move();

};

if (!(rb() && correct()))

{

cout<<endl<<"incorrect conditions!";

getch();

exit(1);

};

};

void cTriangle::scale(const float coef)

{

Tr.tobegin();

int k;

cPoint P;

for (k=0;k<3;k++)

{

Tr.GetInf(P);

P.SetXY(coef * P.GetX(),coef * P.GetY());

Tr.SetInf(P);

Tr.move();

};

if (!(rb() && correct()))

{

cout<<endl<<"incorrect conditions!";

getch();

exit(1);

};

};

/*

void cTriangle::Center(double &X,double &Y)

{

double x0,y0,x1,y1,x2,y2,xh,yh;

x0=GetX(1);

y0=GetY(1);

x1=GetX(2);

y1=GetY(2);

x2=GetX(3);

y2=GetY(3);

float a,b,c;

a=(x0-x1)*(x0-x1)+(y0-y1)*(y0-y1);

b=(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);

c=(x0-x2)*(x0-x2)+(y0-y2)*(y0-y2);

if (fabs(a-c) <= 0.01)

{

xh = (x1 + x2) / 2;

yh = (y1 + y2) / 2;

X = (x0 + 2 * xh) / 3;

Y = (y0 + 2 * yh) / 3;

}

else

{

if (fabs(a-b) <= 0.01)

{

xh = (x0 + x2) / 2;

yh = (y0 + y2) / 2;

X = (x1 + 2 * xh) / 3;

Y = (y1 + 2 * yh) / 3;

}

else

{

xh = (x0 + x1) / 2;

yh = (y0 + y1) / 2;

X = (x2 + 2 * xh) / 3;

Y = (y2 + 2 * yh) / 3;

}

}

}

void cTriangle::Draw()

{

int gdriver = DETECT, gmode;

initgraph(&gdriver, &gmode, "");

double Xm,Ym;

Xm = getmaxx() / 2;

Ym = getmaxy() / 2;

double x0,y0;

Center(x0,y0);

double sccoef = Xm / (4 * sqrt(x0*x0+y0*y0));

cTriangle bTr;

int i;

cPoint F;

for (i=1;i<=3;i++)

{

F.SetXY(GetX(i)*sccoef+Xm,Ym-GetY(i)*sccoef);

bTr.Set(i,F);

};

setcolor(BLUE);

line(bTr.GetX(1),bTr.GetY(1),bTr.GetX(2),bTr.GetY(2));

line(bTr.GetX(2),bTr.GetY(2),bTr.GetX(3),bTr.GetY(3));

line(bTr.GetX(1),bTr.GetY(1),bTr.GetX(3),bTr.GetY(3));

setcolor(WHITE);

line(Xm-10,Ym,Xm+10,Ym);

line(Xm,Ym-10,Xm,Ym+10);

setcolor(RED);

Out();

line(Xm-sccoef,Ym-sccoef,Xm-sccoef,Ym+sccoef);

line(Xm+sccoef,Ym-sccoef,Xm+sccoef,Ym+sccoef);

line(Xm-sccoef,Ym-sccoef,Xm+sccoef,Ym-sccoef);

line(Xm-sccoef,Ym+sccoef,Xm+sccoef,Ym+sccoef);

getch();

closegraph();

}

*/

void cTriangle::Out()

{

Tr.tobegin();

cPoint F;

int k;

for (k=1;k<4;k++)

{

Tr.GetInf(F);

F.Out();

cout<<" ";

Tr.move();

};

cout<<endl;

};

#endif

Соседние файлы в папке Лабораторная работа 2