Добавил:
Eatmore
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:написанные программы / задание №1 / POLYGON
.PAS Program Lab2_Polygons;
{ +++ ‡ Ђ „ Ђ Ќ € … +++ }
{ - 2 ¬®Ј®гЈ®«мЁЄ (ўлЇгЄ«ле) § ¤ л Ї«®бЄ®бвЁ ЇҐаҐзЁб«ҐЁҐ¬ - }
{ - Є®®а¤Ё в ўҐаиЁ ў Ї®ап¤ЄҐ ®Ўе®¤ Ја Ёжл(Ї® з б®ў®© бв५ЄҐ). - }
{ - ЋЇаҐ¤Ґ«Ёвм Ї«®й ¤Ё ¬®Ј®гЈ®«мЁЄ®ў Ё Їа®ўҐаЁвм, «Ґ¦Ёв «Ё ®¤Ё - }
{ - Ё§ Ёе бва®Ј® ўгваЁ ¤агЈ®Ј® - }
{ +++ ђ … … Ќ € … +++ }
{ - Ќ 宦¤ҐЁҐ Ї«®й ¤Ё: а §ЎЁў Ґ¬ ¬®Ј®гЈ®«мЁЄ ваҐгЈ®«мЁЄЁ Ё - }
{ - ўлзЁб«пҐ¬ Ї«®й ¤м Є ¦¤®Ј® ваҐгЈ®«мЁЄ Ї® д®а¬г«Ґ ѓҐа® - }
{ - Џа®ўҐаЄ «Ґ¦Ёв «Ё ®¤Ё ¬®Ј®гЈ®«мЁЄ ўгваЁ ¤агЈ®Ј®: Ґб«Ё ўбҐ - }
{ - в®зЄЁ ўгв॥Ј® «Ґ¦ в бЇа ў ®в Їаאַ©, Їа®е®¤п饩 зҐаҐ§ - }
{ - аҐЎа ўҐиҐЈ®, в® ¬®Ј®гЈ®«мЁЄ «Ґ¦Ёв ўгваЁ. “Ј®« ¬Ґ¦¤г - }
{ - ўҐЄв®а ¬Ё ®жҐЁў Ґвбп б Ї®¬®ймо ўҐЄв®а®Ј® Їа®Ё§ўҐ¤ҐЁп. - }
Const
NMax=1000;
Type
TCoord = Record { - Љ®®а¤Ё вл© вЁЇ - }
X, Y: Real;
End;
TCoordArray = Array[1..NMax] of TCoord;
Polygon = Object { - ЋЎкҐЄв ¬®Ј®гЈ®«мЁЄ - }
NPoint: Word; { - Љ®«ЁзҐбвў® ўҐаиЁ - }
PCoord: ^TCoordArray; { - Љ®®а¤Ё вл ўҐаиЁ - }
VCoord: ^TCoordArray; { - Љ®®а¤Ё вл ўҐЄв®а®ў, «Ґ¦ йЁе ॡа е - }
Square: Real; { - Џ«®й ¤м ¬®Ј®гЈ®«мЁЄ - }
Comment: String; { - Џа®Ё§ў®«м п бва®Є - }
Constructor Init(FileName: String); { - €ЁжЁ «Ё§ жЁп Ё ўў®¤ ўҐ«ЁзЁ - }
Destructor Done(FileName: String); { - ‚лў®¤ ўҐ«ЁзЁ - }
Procedure GetCoordVec; { - Ќ 宦¤ҐЁҐ Є®®а¤Ё в ўҐЄв®а®ў, «Ґ¦ йЁе ॡа е - }
Procedure GetSquare; { - Ќ 宦¤ҐЁҐ Ї«®й ¤Ё - }
End;
{ --------------------- €ЁжЁ «Ё§ жЁп Ё ўў®¤ ўҐ«ЁзЁ ---------------- }
Constructor Polygon.Init(FileName: String );
Var
Fin: Text;
i: Word;
Begin
Square:=0;
Comment:='';
Assign(Fin,FileName);
Reset(Fin);
Read(Fin, NPoint);
GetMem( PCoord, NPoint*SizeOf(TCoord) );
GetMem( VCoord, NPoint*SizeOf(TCoord) );
For i:=1 To NPoint Do
Begin
Read(Fin,PCoord^[i].X);
Read(Fin,PCoord^[i].Y);
End;
Close(Fin);
End;
{ ----------------- ‡ ўҐа襨Ґ а Ў®вл Ё ўлў®¤ ўҐ«ЁзЁ --------------- }
Destructor Polygon.Done(FileName: String);
Var
Fout: Text;
Begin
FreeMem( PCoord, NPoint*SizeOf(TCoord) );
FreeMem( VCoord, NPoint*SizeOf(TCoord) );
Assign(Fout,FileName);
Rewrite(Fout);
WriteLn(Fout,'Џ«®й ¤м ¬®Ј®гЈ®«мЁЄ : ',Square:0:3,' Єў.Ґ¤.');
WriteLn(Fout,Comment);
Close(Fout);
End;
{ --------------------- ‚лзЁб«ҐЁҐ ¤«Ёл ®в१Є -------------------- }
Function LOtr(P1, P2: TCoord): Real;
Begin
LOtr:=Sqrt( Sqr(P1.X-P2.X) + Sqr(P1.Y-P2.Y) );
End;
{ --------- ‚лзЁб«ҐЁҐ Ї«®й ¤Ё ваҐгЈ®«мЁЄ Ї® д®а¬г«Ґ ѓҐа® ------- }
Function STriangle(a, b, c: Real): Real;
Var
P: Real;
Begin
P:=(a+b+c)/2;
STriangle:=Sqrt( P*(P-a)*(P-b)*(P-c) );
End;
{ --------------------- ‚лзЁб«ҐЁҐ ¤«Ёл ЈЁЇ®вҐг§л ----------------- }
Function Pifagor(Var A,B: Real): Real;
Begin
Pifagor:=Sqrt( Sqr(A) + Sqr(B) );
End;
{ -------------- Ќ 宦¤ҐЁҐ бЁгб гЈ« ¬Ґ¦¤г ўҐЄв®а ¬Ё ------------- }
Function SinVec(CVec1, CVec2: TCoord): Real;
Begin
SinVec:=( CVec1.X*CVec2.Y - CVec2.X*CVec1.Y ) /
( Pifagor(CVec1.X,CVec1.Y) * Pifagor(CVec2.X,CVec2.Y) );
End;
{ ------------------- Ќ 宦¤ҐЁҐ Є®®а¤Ё в ўҐЄв®а ------------------ }
Procedure CoordVec(Var P1, P2, Res: TCoord);
Begin
Res.X:=P2.X - P1.X;
Res.Y:=P2.Y - P1.Y;
End;
{ ---------- Ќ 宦¤ҐЁҐ Є®®а¤Ё в ўҐв®а®ў, «Ґ¦ йЁе ॡа е -------- }
Procedure Polygon.GetCoordVec;
Var
i: Integer;
Begin
For i:=1 To NPoint-1 Do
CoordVec(PCoord^[i], PCoord^[i+1], VCoord^[i]);
CoordVec(PCoord^[NPoint], PCoord^[1], VCoord^[NPoint]);
End;
{ ------------------------- Ќ 宦¤ҐЁҐ Ї«®й ¤Ё ---------------------- }
Procedure Polygon.GetSquare;
Var
i: Integer;
A, B, C: Real;
Begin
For i:=1 To NPoint-2 Do
Begin
A:=LOtr( PCoord^[1] , PCoord^[i+1] );
B:=LOtr( PCoord^[1] , PCoord^[i+2] );
C:=LOtr( PCoord^[i+1] , PCoord^[i+2] );
Square:=Square+STriangle( A, B, C );
End;
End;
{ ------------------------ Ћ‘ЌЋ‚ЌЂџ ЏђЋѓђЂЊЊЂ ---------------------- }
Var
Mn1, Mn2: Polygon;
CurVecCoord: TCoord;
isPointInto: Boolean;
i, j: Integer;
Begin
Mn1.Init('input1.txt');
Mn1.GetSquare;
Mn1.GetCoordVec;
Mn2.Init('input2.txt');
Mn2.GetSquare;
isPointInto:=True;
For i:=1 To Mn1.NPoint Do
For j:=1 To Mn2.NPoint Do
Begin
CoordVec(Mn2.PCoord^[j], Mn1.PCoord^[i], CurVecCoord);
If (CurVecCoord.X<>0) And (CurVecCoord.Y<>0) Then
If SinVec(Mn1.VCoord^[i],CurVecCoord) < 0 Then
Begin
isPointInto:=False;
Break;
End;
End;
If isPointInto Then
Mn2.Comment:='Њ®Ј®гЈ®«мЁЄ «Ґ¦Ёв ўгваЁ ЇҐаў®Ј®'
Else
Mn2.Comment:='Њ®Ј®гЈ®«мЁЄ Ґ «Ґ¦Ёв ўгваЁ ЇҐаў®Ј®';
Mn1.Done('output1.txt');
Mn2.Done('output2.txt');
{ ------------------------------ ЉЋЌ…– ------------------------------ }
End.
{ +++ ‡ Ђ „ Ђ Ќ € … +++ }
{ - 2 ¬®Ј®гЈ®«мЁЄ (ўлЇгЄ«ле) § ¤ л Ї«®бЄ®бвЁ ЇҐаҐзЁб«ҐЁҐ¬ - }
{ - Є®®а¤Ё в ўҐаиЁ ў Ї®ап¤ЄҐ ®Ўе®¤ Ја Ёжл(Ї® з б®ў®© бв५ЄҐ). - }
{ - ЋЇаҐ¤Ґ«Ёвм Ї«®й ¤Ё ¬®Ј®гЈ®«мЁЄ®ў Ё Їа®ўҐаЁвм, «Ґ¦Ёв «Ё ®¤Ё - }
{ - Ё§ Ёе бва®Ј® ўгваЁ ¤агЈ®Ј® - }
{ +++ ђ … … Ќ € … +++ }
{ - Ќ 宦¤ҐЁҐ Ї«®й ¤Ё: а §ЎЁў Ґ¬ ¬®Ј®гЈ®«мЁЄ ваҐгЈ®«мЁЄЁ Ё - }
{ - ўлзЁб«пҐ¬ Ї«®й ¤м Є ¦¤®Ј® ваҐгЈ®«мЁЄ Ї® д®а¬г«Ґ ѓҐа® - }
{ - Џа®ўҐаЄ «Ґ¦Ёв «Ё ®¤Ё ¬®Ј®гЈ®«мЁЄ ўгваЁ ¤агЈ®Ј®: Ґб«Ё ўбҐ - }
{ - в®зЄЁ ўгв॥Ј® «Ґ¦ в бЇа ў ®в Їаאַ©, Їа®е®¤п饩 зҐаҐ§ - }
{ - аҐЎа ўҐиҐЈ®, в® ¬®Ј®гЈ®«мЁЄ «Ґ¦Ёв ўгваЁ. “Ј®« ¬Ґ¦¤г - }
{ - ўҐЄв®а ¬Ё ®жҐЁў Ґвбп б Ї®¬®ймо ўҐЄв®а®Ј® Їа®Ё§ўҐ¤ҐЁп. - }
Const
NMax=1000;
Type
TCoord = Record { - Љ®®а¤Ё вл© вЁЇ - }
X, Y: Real;
End;
TCoordArray = Array[1..NMax] of TCoord;
Polygon = Object { - ЋЎкҐЄв ¬®Ј®гЈ®«мЁЄ - }
NPoint: Word; { - Љ®«ЁзҐбвў® ўҐаиЁ - }
PCoord: ^TCoordArray; { - Љ®®а¤Ё вл ўҐаиЁ - }
VCoord: ^TCoordArray; { - Љ®®а¤Ё вл ўҐЄв®а®ў, «Ґ¦ йЁе ॡа е - }
Square: Real; { - Џ«®й ¤м ¬®Ј®гЈ®«мЁЄ - }
Comment: String; { - Џа®Ё§ў®«м п бва®Є - }
Constructor Init(FileName: String); { - €ЁжЁ «Ё§ жЁп Ё ўў®¤ ўҐ«ЁзЁ - }
Destructor Done(FileName: String); { - ‚лў®¤ ўҐ«ЁзЁ - }
Procedure GetCoordVec; { - Ќ 宦¤ҐЁҐ Є®®а¤Ё в ўҐЄв®а®ў, «Ґ¦ йЁе ॡа е - }
Procedure GetSquare; { - Ќ 宦¤ҐЁҐ Ї«®й ¤Ё - }
End;
{ --------------------- €ЁжЁ «Ё§ жЁп Ё ўў®¤ ўҐ«ЁзЁ ---------------- }
Constructor Polygon.Init(FileName: String );
Var
Fin: Text;
i: Word;
Begin
Square:=0;
Comment:='';
Assign(Fin,FileName);
Reset(Fin);
Read(Fin, NPoint);
GetMem( PCoord, NPoint*SizeOf(TCoord) );
GetMem( VCoord, NPoint*SizeOf(TCoord) );
For i:=1 To NPoint Do
Begin
Read(Fin,PCoord^[i].X);
Read(Fin,PCoord^[i].Y);
End;
Close(Fin);
End;
{ ----------------- ‡ ўҐа襨Ґ а Ў®вл Ё ўлў®¤ ўҐ«ЁзЁ --------------- }
Destructor Polygon.Done(FileName: String);
Var
Fout: Text;
Begin
FreeMem( PCoord, NPoint*SizeOf(TCoord) );
FreeMem( VCoord, NPoint*SizeOf(TCoord) );
Assign(Fout,FileName);
Rewrite(Fout);
WriteLn(Fout,'Џ«®й ¤м ¬®Ј®гЈ®«мЁЄ : ',Square:0:3,' Єў.Ґ¤.');
WriteLn(Fout,Comment);
Close(Fout);
End;
{ --------------------- ‚лзЁб«ҐЁҐ ¤«Ёл ®в१Є -------------------- }
Function LOtr(P1, P2: TCoord): Real;
Begin
LOtr:=Sqrt( Sqr(P1.X-P2.X) + Sqr(P1.Y-P2.Y) );
End;
{ --------- ‚лзЁб«ҐЁҐ Ї«®й ¤Ё ваҐгЈ®«мЁЄ Ї® д®а¬г«Ґ ѓҐа® ------- }
Function STriangle(a, b, c: Real): Real;
Var
P: Real;
Begin
P:=(a+b+c)/2;
STriangle:=Sqrt( P*(P-a)*(P-b)*(P-c) );
End;
{ --------------------- ‚лзЁб«ҐЁҐ ¤«Ёл ЈЁЇ®вҐг§л ----------------- }
Function Pifagor(Var A,B: Real): Real;
Begin
Pifagor:=Sqrt( Sqr(A) + Sqr(B) );
End;
{ -------------- Ќ 宦¤ҐЁҐ бЁгб гЈ« ¬Ґ¦¤г ўҐЄв®а ¬Ё ------------- }
Function SinVec(CVec1, CVec2: TCoord): Real;
Begin
SinVec:=( CVec1.X*CVec2.Y - CVec2.X*CVec1.Y ) /
( Pifagor(CVec1.X,CVec1.Y) * Pifagor(CVec2.X,CVec2.Y) );
End;
{ ------------------- Ќ 宦¤ҐЁҐ Є®®а¤Ё в ўҐЄв®а ------------------ }
Procedure CoordVec(Var P1, P2, Res: TCoord);
Begin
Res.X:=P2.X - P1.X;
Res.Y:=P2.Y - P1.Y;
End;
{ ---------- Ќ 宦¤ҐЁҐ Є®®а¤Ё в ўҐв®а®ў, «Ґ¦ йЁе ॡа е -------- }
Procedure Polygon.GetCoordVec;
Var
i: Integer;
Begin
For i:=1 To NPoint-1 Do
CoordVec(PCoord^[i], PCoord^[i+1], VCoord^[i]);
CoordVec(PCoord^[NPoint], PCoord^[1], VCoord^[NPoint]);
End;
{ ------------------------- Ќ 宦¤ҐЁҐ Ї«®й ¤Ё ---------------------- }
Procedure Polygon.GetSquare;
Var
i: Integer;
A, B, C: Real;
Begin
For i:=1 To NPoint-2 Do
Begin
A:=LOtr( PCoord^[1] , PCoord^[i+1] );
B:=LOtr( PCoord^[1] , PCoord^[i+2] );
C:=LOtr( PCoord^[i+1] , PCoord^[i+2] );
Square:=Square+STriangle( A, B, C );
End;
End;
{ ------------------------ Ћ‘ЌЋ‚ЌЂџ ЏђЋѓђЂЊЊЂ ---------------------- }
Var
Mn1, Mn2: Polygon;
CurVecCoord: TCoord;
isPointInto: Boolean;
i, j: Integer;
Begin
Mn1.Init('input1.txt');
Mn1.GetSquare;
Mn1.GetCoordVec;
Mn2.Init('input2.txt');
Mn2.GetSquare;
isPointInto:=True;
For i:=1 To Mn1.NPoint Do
For j:=1 To Mn2.NPoint Do
Begin
CoordVec(Mn2.PCoord^[j], Mn1.PCoord^[i], CurVecCoord);
If (CurVecCoord.X<>0) And (CurVecCoord.Y<>0) Then
If SinVec(Mn1.VCoord^[i],CurVecCoord) < 0 Then
Begin
isPointInto:=False;
Break;
End;
End;
If isPointInto Then
Mn2.Comment:='Њ®Ј®гЈ®«мЁЄ «Ґ¦Ёв ўгваЁ ЇҐаў®Ј®'
Else
Mn2.Comment:='Њ®Ј®гЈ®«мЁЄ Ґ «Ґ¦Ёв ўгваЁ ЇҐаў®Ј®';
Mn1.Done('output1.txt');
Mn2.Done('output2.txt');
{ ------------------------------ ЉЋЌ…– ------------------------------ }
End.
Соседние файлы в папке задание №1