Скачиваний:
135
Добавлен:
08.05.2014
Размер:
5.46 Кб
Скачать
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.
Соседние файлы в папке задание №1