
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