unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus, ComCtrls, MATH, sSkinProvider, sSkinManager; type TForm1 = class(TForm) MainMenu1: TMainMenu; N1: TMenuItem; N3: TMenuItem; N4: TMenuItem; N5: TMenuItem; Label3: TLabel; N6: TMenuItem; PageControl1: TPageControl; TabSheet1: TTabSheet; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; TabSheet2: TTabSheet; TabSheet3: TTabSheet; Edit7: TEdit; UpDown1: TUpDown; Edit8: TEdit; Edit9: TEdit; Button1: TButton; Label2: TLabel; N7: TMenuItem; N8: TMenuItem; N9: TMenuItem; N10: TMenuItem; Memo1: TMemo; Edit10: TEdit; N11: TMenuItem; N12: TMenuItem; N13: TMenuItem; Edit11: TEdit; Edit12: TEdit; Memo2: TMemo; Label4: TLabel; Edit13: TEdit; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; Edit14: TEdit; Label20: TLabel; Label21: TLabel; Label22: TLabel; Edit15: TEdit; Label23: TLabel; Edit16: TEdit; Label24: TLabel; N14: TMenuItem; N15: TMenuItem; N16: TMenuItem; TabSheet4: TTabSheet; Label1: TLabel; Edit19: TEdit; UpDown2: TUpDown; Memo3: TMemo; Label26: TLabel; Label27: TLabel; Edit20: TEdit; n17: TMenuItem; N18: TMenuItem; Button2: TButton; Edit17: TEdit; Label25: TLabel; N19: TMenuItem; Edit18: TEdit; Edit21: TEdit; N20: TMenuItem; N21: TMenuItem; N22: TMenuItem; Memo4: TMemo; Label28: TLabel; Label29: TLabel; Label30: TLabel; Edit22: TEdit; Label31: TLabel; CheckBox1: TCheckBox; CheckBox2: TCheckBox; Error: TButton; Button3: TButton; N2: TMenuItem; N23: TMenuItem; sSkinManager1: TsSkinManager; sSkinProvider1: TsSkinProvider; Button4: TButton; Edit23: TEdit; Label32: TLabel; N24: TMenuItem; procedure Button1Click(Sender: TObject); procedure N2Click(Sender: TObject); procedure N4Click(Sender: TObject); procedure N3Click(Sender: TObject); procedure N5Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure N8Click(Sender: TObject); procedure N9Click(Sender: TObject); procedure N10Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure N11Click(Sender: TObject); procedure N12Click(Sender: TObject); procedure N13Click(Sender: TObject); procedure N15Click(Sender: TObject); procedure N16Click(Sender: TObject); procedure N18Click(Sender: TObject); procedure N19Click(Sender: TObject); procedure N20Click(Sender: TObject); procedure N22Click(Sender: TObject); procedure ErrorClick(Sender: TObject); procedure Button3Click(Sender: TObject); procedure N21Click(Sender: TObject); procedure N23Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure N24Click(Sender: TObject); private { Private declarations } public xmax,xmin,ymax,ymin:real; ColorL:tcolor; widthL:integer; { Public declarations } end; procedure sys_coord; var Form1: TForm1; xy:array[1..1000,1..2] of real; k,n:integer; dir:string; msg:array [1..100] of pansichar; pb:boolean; ColorL:tcolor; wigthL:integer; ro,rv:real; implementation uses Unit2, Unit3, Unit4; {$R *.dfm} procedure sys_coord; var xn1,xn2,yn1,yn2:integer; widthX,heightY:integer; xmin,xmax,ymin,ymax:real; begin widthX:=form2.image1.Width; heightY:=form2.image1.Height; form2.image1.Canvas.Pen.Color:=clwhite; form2.image1.Canvas.Brush.Style:=bssolid; form2.image1.Canvas.Brush.Color:=clwhite; //If not(form1.checkbox1.Checked)and not(form1.checkbox2.Checked) then //form2.image1.Canvas.Rectangle(0,0,widthX,heightY); form2.image1.Canvas.Pen.Color:=clblack; form2.image1.Canvas.Pen.Width:=1; xmin:=form1.xmin; ymin:=form1.ymin; xmax:=form1.xmax; ymax:=form1.ymax; form2.Image1.Canvas.pen.Color:=clblack; xn1:=round ((0-xmin)/(xmax-xmin)*widthX); xn2:=round ((0-xmin)/(xmax-xmin)*widthX); yn1:=round (heightY-(ymin-ymin)/(ymax-ymin)*heightY); yn2:=round (heightY-(ymax-ymin)/(ymax-ymin)*heightY); form2.image1.canvas.MoveTo(xn1,yn1); form2.image1.canvas.LineTo(xn2,yn2); form2.image1.canvas.LineTo(xn2+5,yn2+5); form2.image1.canvas.LineTo(xn2-5,yn2+5); form2.image1.canvas.LineTo(xn2,yn2); form2.Image1.Canvas.TextOut(xn2-10,yn2+5,'Y'); form2.Image1.Canvas.Brush.Color:=clblack; form2.Image1.Canvas.FloodFill(xn2-1,yn2+4,clblack,fsborder); form2.Image1.Canvas.FloodFill(xn2+1,yn2+4,clblack,fsborder); form2.Image1.Canvas.Brush.Color:=clwhite; xn1:=round ((xmin-xmin)/(xmax-xmin)*widthX); xn2:=round ((xmax-xmin)/(xmax-xmin)*widthX); yn1:=round (heightY-(0-ymin)/(ymax-ymin)*heightY); yn2:=round (heightY-(0-ymin)/(ymax-ymin)*heightY); form2.image1.canvas.MoveTo(xn1,yn1); form2.image1.canvas.LineTo(xn2,yn2); form2.image1.canvas.LineTo(xn2-5,yn2+5); form2.image1.canvas.LineTo(xn2-5,yn2-5); form2.image1.canvas.LineTo(xn2,yn2); form2.Image1.Canvas.Brush.Color:=clblack; form2.Image1.Canvas.FloodFill(xn2-4,yn2+1,clblack,fsborder); form2.Image1.Canvas.FloodFill(xn2-4,yn2-1,clblack,fsborder); form2.Image1.Canvas.Brush.Color:=clwhite; form2.Image1.Canvas.TextOut(xn2-10,yn2+5,'X'); xn1:=round ((1-xmin)/(xmax-xmin)*widthX); yn1:=round (heightY-(0-ymin)/(ymax-ymin)*heightY); form2.image1.canvas.MoveTo(xn1,yn1-2); form2.image1.canvas.LineTo(xn1,yn1+2); form2.Image1.Canvas.TextOut(xn1,yn1+5,'1'); xn1:=round ((-1-xmin)/(xmax-xmin)*widthX); yn1:=round (heightY-(0-ymin)/(ymax-ymin)*heightY); form2.image1.canvas.MoveTo(xn1,yn1-2); form2.image1.canvas.LineTo(xn1,yn1+2); form2.Image1.Canvas.TextOut(xn1,yn1+5,'-1'); xn1:=round ((0-xmin)/(xmax-xmin)*widthX); yn1:=round (heightY-(-1-ymin)/(ymax-ymin)*heightY); form2.image1.canvas.MoveTo(xn1-2,yn1); form2.image1.canvas.LineTo(xn1+2,yn1); form2.Image1.Canvas.TextOut(xn1+5,yn1,'-1'); xn1:=round ((0-xmin)/(xmax-xmin)*widthX); yn1:=round (heightY-(1-ymin)/(ymax-ymin)*heightY); form2.image1.canvas.MoveTo(xn1-2,yn1); form2.image1.canvas.LineTo(xn1+2,yn1); form2.Image1.Canvas.TextOut(xn1+5,yn1,'1'); end; procedure TForm1.Button1Click(Sender: TObject); var f:boolean; l,i:integer; tr:string; begin n:=strtoint(edit7.Text); edit7.ReadOnly:=false; updown1.Enabled:=false; // перевырка на число f:=true; tr:=edit8.Text; if tr='' then f:=false; if tr<>'' then begin for i:=2 to length(tr) do if not(tr[i] in ['0'..'9',',']) then f:=false; if not(tr[1] in ['0'..'9','+','-',' ',',']) then f:=false; l:=0; for i:=1 to length(tr) do if tr[i]=',' then l:=l+1; if l>1 then f:=false; end; tr:=edit9.Text; if tr='' then f:=false; if tr<>'' then begin for i:=2 to length(tr) do if not(tr[i] in ['0'..'9',',']) then f:=false; if not(tr[1] in ['0'..'9','+','-',' ',',']) then f:=false; l:=0; for i:=1 to length(tr) do if tr[i]=',' then l:=l+1; if l>1 then f:=false; end; if not(f) then messageBox(Handle,'Не правильно введені координати','Помилка', mb_Ok); if (kc) and (a+c>b) and(b+c>a) then label2.caption:='Трикутник існує' else label2.caption:='Трикутник не існує'; end; procedure TForm1.N4Click(Sender: TObject); var w,h,x1,y1,x2,y2,x3,y3,xn,yn:integer; a,b,c,p,s:real; xt,yt:integer; begin n:=3; x1:=strtoint(edit1.text); y1:=strtoint(edit2.text); x2:=strtoint(edit3.text); y2:=strtoint(edit4.text); x3:=strtoint(edit5.text); y3:=strtoint(edit6.text); xy[1,1]:=x1; xy[1,2]:=y1; xy[2,1]:=x2; xy[2,2]:=y2; xy[3,1]:=x3; xy[3,2]:=y3; n8.Click; {form2.Button1.Click; form2.visible:=true; w:=form2.image1.Width; h:=form2.image1.Height; form2.image1.Canvas.Pen.Color:=clred; xmin:=x1; if x2xmax then xmax:=x2; if x3>xmax then xmax:=x3; ymax:=y1; if y2>ymax then ymax:=y2; if y3>ymax then ymax:=y3; xmin:=xmin-1; ymin:=ymin-1; xmax:=xmax+1; ymax:=ymax+1; sys_coord; form2.image1.Canvas.Pen.Color:=rgb(255,0,0); x1:=strtoint(edit1.text); y1:=strtoint(edit2.text); xn:=round((x1-xmin)/(xmax-xmin)*w); yn:=round(h-(y1-ymin)/(ymax-ymin)*h); xt:=xn;yt:=yn; form2.Image1.Canvas.TextOut(xt,yt,'A'); form2.image1.Canvas.moveto(xn,yn); x2:=strtoint(edit3.text); y2:=strtoint(edit4.text); xn:=round((x2-xmin)/(xmax-xmin)*w); yn:=round(h-(y2-ymin)/(ymax-ymin)*h); form2.image1.Canvas.lineto(xn,yn); xt:=xn;yt:=yn; form2.Image1.Canvas.TextOut(xt,yt,'B'); x3:=strtoint(edit5.text); y3:=strtoint(edit6.text); xn:=round((x3-xmin)/(xmax-xmin)*w); yn:=round(h-(y3-ymin)/(ymax-ymin)*h); form2.image1.Canvas.lineto(xn,yn); xt:=xn;yt:=yn; form2.Image1.Canvas.TextOut(xt,yt,'C'); xn:=round((x1-xmin)/(xmax-xmin)*w); yn:=round(h-(y1-ymin)/(ymax-ymin)*h); form2.image1.Canvas.lineto(xn,yn);} end; procedure TForm1.N3Click(Sender: TObject); var ni,ne,x,y,w,h,x1,y1,x2,y2,x3,y3,xn,yn,xmax,xmin,ymax,ymin:integer; s1,s2,s3,a,b,c,p,s:real; begin x1:=strtoint(edit1.text); y1:=strtoint(edit2.text); x2:=strtoint(edit3.text); y2:=strtoint(edit4.text); x3:=strtoint(edit5.text); y3:=strtoint(edit6.text); n:=3; xy[1,1]:=x1; xy[1,2]:=y1; xy[2,1]:=x2; xy[2,2]:=y2; xy[3,1]:=x3; xy[3,2]:=y3; form1.Error.Click; a:=sqrt(sqr(x1-x2)+sqr(y1-y2)); b:=sqrt(sqr(x2-x3)+sqr(y2-y3)); c:=sqrt(sqr(x1-x3)+sqr(y1-y3)); p:=(a+b+c)/2; s:=sqrt(p*(p-b)*(p-c)*(p-a)); Ro:=(a*b*c)/(4*s); rv:=s/p ; Edit16.Text:=floattostr(RoundTo(s,-2)); s:=1/2*abs(x1*y2-x2*y1+x2*y3-x3*y2+x3*y1-x1*y3); Edit18.text:=floattostr(RoundTo(s,-2)); // формула Піка xmin:=x1; if x2xmax then xmax:=x2; if x3>xmax then xmax:=x3; ymin:=y1; if y2ymax then ymax:=y2; if y3>ymax then ymax:=y3; ni:=0; ne:=0; //memo4.Lines.Add(inttostr(xmin)+' '+inttostr(xmax)); //memo4.Lines.Add(inttostr(ymin)+' '+inttostr(ymax)); for x:=xmin to xmax do for y:=ymin to ymax do begin s:=1/2*abs(x1*y2-x2*y1+x2*y3-x3*y2+x3*y1-x1*y3); s1:=1/2*abs(x1*y2-x2*y1+x2*y-x*y2+x*y1-x1*y); s2:=1/2*abs(x1*y-x*y1+x*y3-x3*y+x3*y1-x1*y3); s3:=1/2*abs(x*y2-x2*y+x2*y3-x3*y2+x3*y-x*y3); if (s=s1+s2+s3)and(s1*s2*s3<>0) then ni:=ni+1; if (s=s1+s2+s3)and(s1*s2*s3=0) then ne:=ne+1; end; if s>0 then s:=Ni+1/2*Ne-1; Edit21.text:=floattostr(RoundTo(s,-2)); end; procedure TForm1.N5Click(Sender: TObject); var w,h,x1,y1,x2,y2,x3,y3:integer; a,b,c:real; begin x1:=strtoint(edit1.text); y1:=strtoint(edit2.text); x2:=strtoint(edit3.text); y2:=strtoint(edit4.text); x3:=strtoint(edit5.text); y3:=strtoint(edit6.text); a:=sqrt(sqr(x1-x2)+sqr(y1-y2)); b:=sqrt(sqr(x2-x3)+sqr(y2-y3)); c:=sqrt(sqr(x1-x3)+sqr(y1-y3)); label3.Caption:='AB='+floattostr(RoundTo(a,-2)); label3.Caption:=label3.Caption+' BC='+floattostr(RoundTo(b,-2)); label3.Caption:=label3.Caption+' AC='+floattostr(RoundTo(c,-2)); end; procedure TForm1.FormCreate(Sender: TObject); begin form1.ColorL:=clred; form1.widthL:=1; pb:=false; dir:=ExtractFilePath(ParamStr(0))+'skins'; sSkinManager1.Active:=false; sSkinManager1.SkinDirectory:=dir; sSkinManager1.SkinName:='BlueGauze'; sSkinManager1.Active:=true; memo1.Clear; //memo1.Lines.Add(dir); k:=0; end; procedure TForm1.N8Click(Sender: TObject); var w,h,i,xn,yn:integer; r:real; xk1,yk1,xk2,yk2:integer; xt,yt:integer; begin form1.Error.Click; if pb then begin if form2.CheckBox2.Checked then form2.Button1.Click; form2.visible:=true; w:=form2.image1.Width; h:=form2.image1.Height; form2.image1.Canvas.Pen.Color:=clwhite; form2.image1.Canvas.Brush.Style:=bssolid; form2.image1.Canvas.Brush.Color:=clwhite; form2.image1.Picture.Bitmap.Width:=form2.image1.Width; form2.image1.Picture.Bitmap.height:=form2.image1.height; if form2.CheckBox2.Checked then form2.image1.Canvas.Rectangle(0,0,form2.image1.Width,form2.image1.Height); form2.image1.Canvas.Pen.Color:=clblack; xmin:=maxint; for i:=1 to n do if xy[i,1]xmax then xmax:=xy[i,1]; for i:=1 to n do if xy[i,2]>xmax then xmax:=xy[i,2]; xmax:=xmax+1; ymax:=xmax; if form2.CheckBox1.Checked then begin xmin:=strtofloat(form2.Edit3.text); xmax:=strtofloat(form2.Edit4.text); ymin:=xmin; ymax:=xmax; end; form2.Edit3.text:=floattostr(RoundTo(xmin,-2)); form2.Edit4.text:=floattostr(RoundTo(xmax,-2)); // описане коло If checkbox1.Checked then begin r:=strtofloat(edit20.text)/(2*sin(pi/n)); //memo3.Lines.add(floattostr(r)); xk1:=round((-r-xmin)/(xmax-xmin)*w); yk1:=round(h-(-r-ymin)/(ymax-ymin)*h); xk2:=round((r-xmin)/(xmax-xmin)*w); yk2:=round(h-(r-ymin)/(ymax-ymin)*h); //memo3.Lines.add(inttostr(xk1)+' '+inttostr(yk1)+' '+inttostr(xk2)+' '+inttostr(yk2)); form2.image1.Canvas.Ellipse(xk1,yk1,xk2,yk2); end; //вписане коло If checkbox2.Checked then begin r:=strtofloat(edit20.text)/(2*tan(pi/n)); //memo3.Lines.add(floattostr(r)); xk1:=round((-r-xmin)/(xmax-xmin)*w); yk1:=round(h-(-r-ymin)/(ymax-ymin)*h); xk2:=round((r-xmin)/(xmax-xmin)*w); yk2:=round(h-(r-ymin)/(ymax-ymin)*h); //memo3.Lines.add(inttostr(xk1)+' '+inttostr(yk1)+' '+inttostr(xk2)+' '+inttostr(yk2)); form2.image1.Canvas.Ellipse(xk1,yk1,xk2,yk2); end; sys_coord; form2.image1.Canvas.Pen.Color:=form1.Colorl; form2.image1.Canvas.Pen.Width:=form1.widthL; xy[n+1,1]:=xy[1,1]; xy[n+1,2]:=xy[1,2]; xn:=round((xy[1,1]-xmin)/(xmax-xmin)*w); yn:=round(h-(xy[1,2]-ymin)/(ymax-ymin)*h); form2.image1.Canvas.moveto(xn,yn); //form2.image1.Canvas.TextOut(xn,yn,chr(65)); for i:=1 to n+1 do begin xn:=round((xy[i,1]-xmin)/(xmax-xmin)*w); yn:=round(h-(xy[i,2]-ymin)/(ymax-ymin)*h); form2.image1.Canvas.lineto(xn,yn); end; for i:=1 to n do begin xn:=round((xy[i,1]-xmin)/(xmax-xmin)*w); yn:=round(h-(xy[i,2]-ymin)/(ymax-ymin)*h); xt:=xn+10;yt:=yn+10; form2.image1.Canvas.TextOut(xt,yt,chr(i+64)); end; end; end; procedure TForm1.N9Click(Sender: TObject); var s:real; i:integer; begin xy[n+1,1]:=xy[1,1]; xy[n+1,2]:=xy[1,2]; for i:=1 to n do s:=s+xy[i,1]*xy[i+1,2]-xy[i+1,1]*xy[i,2]; s:=1/2*abs(s); edit15.Text:=floattostr(RoundTo(s,-2)); end; procedure TForm1.N10Click(Sender: TObject); var a,b,vd:array [1..1000] of real; i,k:integer; begin {Визначення координат векторів} xy[n+1,1]:=xy[1,1]; xy[n+1,2]:=xy[1,2]; for i:=1 to n do begin a[i]:=xy[i+1,1]-xy[i,1]; b[i]:=xy[i+1,2]-xy[i,2]; end; {Підрахунок кількості від'ємних добутків} a[n+1]:=a[1]; b[n+1]:=b[1]; k:=0; for i:=1 to n do begin vd[i]:=a[i]*b[i+1]-a[i+1]*b[i]; if vd[i]>=0 then k:=k+1; end; {Виведення результату} if (k=n)or(k=0) then edit10.Text:='Опуклий' else edit10.Text:='Неопуклий'; end; procedure TForm1.Button2Click(Sender: TObject); begin n:=4; if kxmax then xmax:=xy[i,1]; for i:=1 to n do if xy[i,2]>xmax then xmax:=xy[i,2]; xmax:=xmax+1; ymax:=xmax; memo2.Lines.Add(floattostr(xmin)+' '+floattostr(xmax)); form2.Canvas.Pen.Color:=clred; xy[n+1,1]:=xy[1,1]; xy[n+1,2]:=xy[1,2]; xn:=round((xy[1,1]-xmin)/(xmax-xmin)*w); yn:=round(h-(xy[1,2]-ymin)/(ymax-ymin)*h); form2.Canvas.moveto(xn,yn); for i:=1 to n+1 do begin xn:=round((xy[i,1]-xmin)/(xmax-xmin)*w); yn:=round(h-(xy[i,2]-ymin)/(ymax-ymin)*h); form2.Canvas.lineto(xn,yn); end;} end; procedure TForm1.N12Click(Sender: TObject); var a,b,vd:array [1..1000] of real; i,kk:integer; begin form1.Error.Click; {Визначення координат векторів} xy[n+1,1]:=xy[1,1]; xy[n+1,2]:=xy[1,2]; for i:=1 to n do begin a[i]:=xy[i+1,1]-xy[i,1]; b[i]:=xy[i+1,2]-xy[i,2]; end; {Підрахунок кількості від'ємних добутків} a[n+1]:=a[1]; b[n+1]:=b[1]; kk:=0; for i:=1 to n do begin vd[i]:=a[i]*b[i+1]-a[i+1]*b[i]; if vd[i]>=0 then kk:=kk+1; end; {Виведення результату} if (kk=n)or(kk=0) then edit13.Text:='Опуклий' else edit13.Text:='Неопуклий'; end; procedure TForm1.N13Click(Sender: TObject); var s:real; i:integer; begin xy[n+1,1]:=xy[1,1]; xy[n+1,2]:=xy[1,2]; for i:=1 to n do s:=s+xy[i,1]*xy[i+1,2]-xy[i+1,1]*xy[i,2]; s:=1/2*abs(s); edit14.Text:=floattostr(RoundTo(s,-2)); end; procedure TForm1.N15Click(Sender: TObject); begin form3.visible:=true; end; procedure TForm1.N16Click(Sender: TObject); var f:string; i:integer; begin form4.visible:=true; dir:=ExtractFilePath(ParamStr(0)); f:=dir+'help.htm'; for i:=1 to length(f) do if f[i]='\' then f[i]:='/' ; //memo1.Lines.Add(f); form4.WebBrowser1.Navigate(f); end; procedure TForm1.N18Click(Sender: TObject); var i:integer; d,f:real; begin if form2.CheckBox2.Checked then form2.Button1.Click; //memo3.Clear; n:=strtoint(edit19.Text); k:=1; d:=strtofloat(edit20.text)/(2*sin(pi/n)); F:=strtofloat(edit22.text)*pi/180; xy[k,1]:=d*cos(f); xy[k,2]:=d*sin(f); memo3.Lines.add(floattostr(RoundTo(xy[k,1],-2))+' '+floattostr(roundto(xy[k,2],-2))); f:=f+2*pi/n; for i:=2 to n do begin xy[i,1]:=d*cos(f); xy[i,2]:=d*sin(f); f:=f+2*pi/n; memo3.Lines.add(floattostr(RoundTo(xy[i,1],-2))+' '+floattostr(roundto(xy[i,2],-2))); end; //mainmenu1.Items. n8.Click; end; procedure TForm1.N19Click(Sender: TObject); var s:real; i:integer; d,f:real; begin memo3.Clear; n:=strtoint(edit19.Text); k:=1; d:=strtofloat(edit20.text); xy[k,1]:=d; xy[k,2]:=0; memo3.Lines.add(floattostr(RoundTo(xy[k,1],-2))+' '+floattostr(roundto(xy[k,2],-2))); f:=2*pi/n; for i:=2 to n do begin xy[i,1]:=d*cos(f); xy[i,2]:=d*sin(f); f:=f+2*pi/n; memo3.Lines.add(floattostr(RoundTo(xy[i,1],-2))+' '+floattostr(roundto(xy[i,2],-2))); end; xy[n+1,1]:=xy[1,1]; xy[n+1,2]:=xy[1,2]; for i:=1 to n do s:=s+xy[i,1]*xy[i+1,2]-xy[i+1,1]*xy[i,2]; s:=1/2*abs(s); edit17.Text:=floattostr(RoundTo(s,-2)); end; procedure TForm1.N20Click(Sender: TObject); var x,y:array[1..1000] of real; r,v:array[1..1000] of integer; s,p,xmin:real; start,finish,lich,i,j,k:integer; poisk:boolean; begin {Задання координат вершин многокутника} for i:=1 to n do begin x[i]:=xy[i,1];y[i]:=xy[i,2]; end; {Пошук крайньої л_вої точки} xmin:=x[1]; start:=1; for i:=2 to n do if x[i]0)and((m1/l1)-(m2/l2)<>0)and(l2<>0)) then begin pp:=true; X:= ((m1/l1)*x01-y01-(m2/l2)*x02+y02)/((m1/l1)-(m2/l2)); Y:= (m1*X-m1*x01+l1*y01)/l1; form2.Image1.Canvas.Pen.Color:=form1.ColorL; form2.Image1.Canvas.Pen.Width :=form1.widthL; xk1:=round(((x-r)-form1.xmin)/(form1.xmax-form1.xmin)*w); yk1:=round(h-(y-r-form1.xmin)/(form1.xmax-form1.xmin)*h); xk2:=round((x+r-form1.xmin)/(form1.xmax-form1.xmin)*w); yk2:=round(h-(y+r-form1.xmin)/(form1.xmax-form1.xmin)*h); form2.image1.Canvas.arc(xk1,yk1,xk2,yk2,0,0,0,0);//рисуем окружность end; end; //функция нахождения периметра треугоника. //входные параметры - стороны треугольника function Perimetr (s1, s2, s3:real):real; begin perimetr:=(s1+s2+s3); end; //функция нахождения площади треугольника (по формуле Герона) //входные параметры - стороны треугольника function Sqare (s1, s2,s3:real):real; var p:real; begin p:=(Perimetr(s1, s2, s3))/2; Sqare:=sqrt((p*(p-s1)*(p-s2)*(p-s3))); end; //функция нахождения радиуса вписанной окружности //входные параметры - площадь и полупериметр треугольника function radius1(S,p:real):real; begin radius1:=S/p; end; //функция нахождения радиуса описанной окружности //входные параметры - площадь и стороны треугоника function Radius2(S, s1, s2, s3:real):real; begin Radius2:=(s1*s2*s3)/(4*S); end; begin n:=3; x1:=strtofloat(edit1.text); y1:=strtofloat(edit2.text); x2:=strtofloat(edit3.text); y2:=strtofloat(edit4.text); x3:=strtofloat(edit5.text); y3:=strtofloat(edit6.text); a[0].x:=x1; a[0].y:=y1; a[1].x:=x2; a[1].y:=y2; a[2].x:=x3; a[2].y:=y3; xy[1,1]:=x1; xy[1,2]:=y1; xy[2,1]:=x2; xy[2,2]:=y2; xy[3,1]:=x3; xy[3,2]:=y3; w:=form2.Image1.Width; h:=form2.Image1.Height; n8.Click; //упорядочиваем вершины треугольника по возрастанию их y-координаты if(a[0].y>a[1].y) then begin t:=a[0]; a[0]:=a[1]; a[1]:=t;end; if(a[1].y>a[2].y) then begin t:=a[1]; a[1]:=a[2]; a[2]:=t;end; if(a[0].y>a[2].y) then begin t:=a[0]; a[0]:=a[2]; a[2]:=t;end; if(a[0].y>a[1].y) then begin t:=a[0]; a[0]:=a[1]; a[1]:=t;end; //Находим длины сторон треугольника s1:=SideLength(a[0].x,a[0].y, a[1].x,a[1].y); s2:=SideLength(a[1].x,a[1].y, a[2].x,a[2].y); s3:=SideLength(a[2].x,a[2].y, a[0].x,a[0].y); // Находим полупериметр треугольника и его площадь p := (Perimetr(s1, s2, s3))/2; S := Sqare (s1, s2, s3); //Находим радиус вписанной и описанной окружности r1:= radius1(S, p); R2:=Radius2(S, s1, s2, s3); //Находим углы треугольника ang1 := Angles(a[2],a[0],a[1]); ang2 := Angles(a[0],a[1],a[2]); ang3 := Angles(a[1],a[2],a[0]); //ищем середины сторон s1 и s2 m1.x := (a[0].x+a[1].x)/2; m1.y := (a[0].y+a[1].y)/2; m2.x := (a[1].x+a[2].x)/2; m2.y := (a[1].y+a[2].y)/2; //поворачиваем точку а[2] вокруг середины стороны s2 на угол 90 градусов x1 := a[2].x; y1 := a[2].y; x1 :=x1- m2.x; y1 :=y1- m2.y; b1.x := x1*cos(PI/2)-y1*sin(PI/2); b1.y := x1*sin(PI/2)+y1*cos(PI/2); b1.x :=b1.x + m2.x; b1.y :=b1.y + m2.y; v1.x := b1.x - m2.x; v1.y := b1.y - m2.y; //поворачиваем точку а[0] вокруг середины стороны s1 на угол 90 градусов x1 := a[0].x; y1 := a[0].y;//временные переменные x1 :=x1- m1.x; y1 :=y1- m1.y; b2.x := x1*cos(PI/2)-y1*sin(PI/2); b2.y := x1*sin(PI/2)+y1*cos(PI/2); b2.x :=b2.x+ m1.x; b2.y :=b2.y+m1.y; v2.x := b2.x - m1.x; v2.y := b2.y - m1.y; //строим описанную окружность(с центром в точке пересечения серединных перепендикуляров) DescrCircle(R2, m1.x, m1.y, m2.x, m2.y, v2.x, v2.y, v1.x, v1.y); coef1:=1; coef2:=1;//коэффициенты,указывающие напрвление поворота //вычисляем знак третьей координаты векторного произведения векторов, между которыми строится биссектриса det:=(a[1].x-a[0].x)*(a[2].y-a[0].y)-(a[2].x-a[0].x)*(a[1].y-a[0].y); if(det>0) then coef1:=-1; //если плюс, то поворачивать необходимо по часовой стрелке(т.к. полученная тройка векторов всегда правая) det:=(a[1].x-a[2].x)*(a[0].y-a[2].y)-(a[0].x-a[2].x)*(a[1].y-a[2].y); if(det>0) then coef2:=-1; //поворачиваем a[2] вокруг a[0] на угол равный половине угла ang2 x1 := a[2].x; y1 := a[2].y; //временные переменные x1 :=x1- a[0].x; y1 :=y1- a[0].y; b1.x := x1*cos(coef1*ang2/2)-y1*sin(coef1*ang2/2); b1.y := x1*sin(coef1*ang2/2)+y1*cos(coef1*ang2/2); b1.x :=b1.x+ a[0].x; b1.y :=b1.y+ a[0].y; v1.x := b1.x - a[0].x; v1.y := b1.y - a[0].y; x2 := a[0].x; y2 := a[0].y; x2 :=x2- a[2].x; y2 :=y2- a[2].y; b2.x := x2*cos(coef2*ang1/2)-y2*sin(coef2*ang1/2); b2.y := x2*sin(coef2*ang1/2)+y2*cos(coef2*ang1/2); b2.x :=b2.x+a[2].x; b2.y :=b2.y+ a[2].y; //b1 - a[2] после поворота v2.x := b2.x - a[2].x; v2.y := b2.y - a[2].y; //v1.x v1.y- координаты направляющего вектора биссектрисы //строим вписанную окружность(с центром в точке пересечения биссектрисс) // DescrCircle(r1, a[2].x, a[2].y, a[0].x, a[0].y, v2.x, v2.y, v1.x, v1.y); w:=form2.Image1.Width; h:=form2.Image1.Height; n8.Click; x1:=strtofloat(edit1.text); y1:=strtofloat(edit2.text); x2:=strtofloat(edit3.text); y2:=strtofloat(edit4.text); x3:=strtofloat(edit5.text); y3:=strtofloat(edit6.text); x11:=(x1+x2)/2; y11:=(y1+y2)/2; x22:=(x2+x3)/2; y22:=(y2+y3)/2; if pp=false then begin yy:=((x2-x1)*(x22*(x3-x2)+y22*(y3-y2)-x11*(x3-x2))-y11*(y2-y1)*(x3-x2))/((y3-y2)*(x2-x1)-(y2-y1)); xx:=x11-yy*(y2-y1)/(x2-x1)+y11*(y2-y1)/(x2-x1); ro:=sqrt(sqr(xx-x1)+sqr(yy-y1)); form2.Image1.Canvas.Pen.Color:=form1.ColorL; form2.Image1.Canvas.Pen.Width :=form1.widthL; xk1:=round(((xx-ro)-form1.xmin)/(form1.xmax-form1.xmin)*w); yk1:=round(h-(yy-ro-form1.xmin)/(form1.xmax-form1.xmin)*h); xk2:=round((xx+ro-form1.xmin)/(form1.xmax-form1.xmin)*w); yk2:=round(h-(yy+ro-form1.xmin)/(form1.xmax-form1.xmin)*h); form2.image1.Canvas.arc(xk1,yk1,xk2,yk2,0,0,0,0); pp:=true; end; end; procedure TForm1.ErrorClick(Sender: TObject); var a,b,vd:array [1..1000] of real; j,i,k:integer; f,p,ff:boolean; r:string; pov:pansichar; x1,x2,x3,x4,x,y,y1,y2,y3,y4:real; begin ff:=false; for i:=1 to 10 do msg[i]:=''; //*************************************************** 1 // Перевірка на опуклусть {Визначення координат векторів} xy[n+1,1]:=xy[1,1]; xy[n+1,2]:=xy[1,2]; for i:=1 to n do begin a[i]:=xy[i+1,1]-xy[i,1]; b[i]:=xy[i+1,2]-xy[i,2]; end; {Підрахунок кількості від'ємних добутків} a[n+1]:=a[1]; b[n+1]:=b[1]; k:=0; for i:=1 to n do begin vd[i]:=a[i]*b[i+1]-a[i+1]*b[i]; if vd[i]>=0 then k:=k+1; end; {Виведення результату} if (k>0)and(kj)and (xy[i,1]=xy[j,1]) and(xy[i,2]=xy[j,2]) then f:=true; if (f) then begin msg[2]:=' співбадання точок ';ff:=true;end; //memo1.Lines.Add(msg[2]) ; // Перевірка на перетинання сторін f:=false; xy[n+1,1]:=xy[1,1]; xy[n+1,2]:=xy[1,2]; for i:=1 to n do for j:=i+1 to n do if (i<>j) then begin x1:=xy[i,1]; y1:=xy[i,2]; x2:=xy[i+1,1]; y2:=xy[i+1,2]; x3:=xy[j,1]; y3:=xy[j,2]; x4:=xy[j+1,1]; y4:=xy[j+1,2]; p:=false; if (((x2-x1)*(y4-y3)-(x4-x3)*(y2-y1))<>0) and (y2-y1<>0) then begin y:=((x3-x1)*(y2-y1)*(y4-y3)+y1*(x2-x1)*(y4-y3)-y3*(x4-x3)*(y2-y1))/((x2-x1)*(y4-y3)-(x4-x3)*(y2-y1)); x:=(y-y1)*(x2-x1)/(y2-y1)+x1; p:=true; end; p:=false; if (((y2-y1)*(x4-x3)-(y4-y3)*(x2-x1))<>0)and (x2-x1<>0)then begin x:=((y3-y1)*(x2-x1)*(x4-x3)+x1*(y2-y1)*(x4-x3)-x3*(y4-y3)*(x2-x1))/ ((y2-y1)*(x4-x3)-(y4-y3)*(x2-x1)); y:=(x-x1)*(y2-y1)/(x2-x1)+y1; p:=true; end; if p then begin p:=false; x1:=roundto(x1,-2); x2:=roundto(x2,-2); x:=roundto(x,-2); if (x1<=x2)and(x>x1)and(xx2)and(x'' then begin r:=r+msg[i];f:=true;end; r:='Многокутник: '+r+' Виконувати?'; pov:=pchar(r); pb:=true; if ff then If messageBox(Handle,pov,'Перевірка', mb_YesNo or mb_iconquestion)=mrYes then begin pb:=true; end else begin // початковий стан n:=0; button1.Enabled:=true; button2.Enabled:=true; memo1.Lines.Clear; edit7.Text:='3'; edit8.Text:=''; edit9.Text:=''; edit7.ReadOnly:=true; updown1.Enabled:=true; pb:=false; k:=0; memo1.Clear; memo2.Clear; memo3.Clear; end; end; procedure TForm1.Button3Click(Sender: TObject); begin n:=0; button1.Enabled:=true; button2.Enabled:=true; memo1.Lines.Clear; edit7.Text:='3'; edit8.Text:=''; edit9.Text:=''; edit7.ReadOnly:=true; updown1.Enabled:=true; pb:=false; k:=0; memo1.Clear; memo2.Clear; memo3.Clear; end; procedure TForm1.N21Click(Sender: TObject); type Pt=record x,y:real;end; var flag,i:integer; s1,s2,s3,S,p,r1,R2,ang1,ang2,ang3, x1, x2, y1, y2,x3,y3, det:real; t,m1,m2, v1, v2, v3, n1, n2, n3, b1, b2,Bb1,Bb2:pt; a:array[0..2] of pt; coef1,coef2, w,h,xk1,xk2,yk1,yk2:integer; //функция нахождения длины стороны треугольника. // входными параметрами служат координаты конца и начала стороны. function SideLength(x1,y1,x2,y2:real) :real; begin SideLength:= sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); end; //функция нахождения углов треугольника, находим cos угла по формуле скалярного произведения векторов //входные параметры - вершины треугольника - function Angles(p1,p2,p3:pt):real; var a,exp:real; begin a:=(p2.x-p1.x)*(p3.x-p1.x)+(p2.y-p1.y)*(p3.y-p1.y); exp:=a/SideLength(p1.x,p1.y,p2.x,p2.y)/SideLength(p1.x,p1.y,p3.x,p3.y); angles:=arccos(exp); end; //функция, рисующая обе окружности вписанную и описанную //входные параметры - радиус окружности; координаты точки,лежащей на прямой; координаты направляющего вектора прямой. procedure DescrCircle(R:real; x01,y01,x02,y02, l1, m1, l2, m2:real); var x,y:real; begin //вычисление координат точки пересечения прямых, заданных координатами точки на прямой и координатами направляющих векторов if ((l1<>0)and((m1/l1)-(m2/l2)<>0)and(l2<>0)) then begin X:= ((m1/l1)*x01-y01-(m2/l2)*x02+y02)/((m1/l1)-(m2/l2)); Y:= (m1*X-m1*x01+l1*y01)/l1; form2.Image1.Canvas.Pen.Color:=form1.ColorL; form2.Image1.Canvas.Pen.Width :=form1.widthL; xk1:=round(((x-r)-form1.xmin)/(form1.xmax-form1.xmin)*w); yk1:=round(h-(y-r-form1.xmin)/(form1.xmax-form1.xmin)*h); xk2:=round((x+r-form1.xmin)/(form1.xmax-form1.xmin)*w); yk2:=round(h-(y+r-form1.xmin)/(form1.xmax-form1.xmin)*h); form2.image1.Canvas.arc(xk1,yk1,xk2,yk2,0,0,0,0);//рисуем окружность end; end; //функция нахождения периметра треугоника. //входные параметры - стороны треугольника function Perimetr (s1, s2, s3:real):real; begin perimetr:=(s1+s2+s3); end; //функция нахождения площади треугольника (по формуле Герона) //входные параметры - стороны треугольника function Sqare (s1, s2,s3:real):real; var p:real; begin p:=(Perimetr(s1, s2, s3))/2; Sqare:=sqrt((p*(p-s1)*(p-s2)*(p-s3))); end; //функция нахождения радиуса вписанной окружности //входные параметры - площадь и полупериметр треугольника function radius1(S,p:real):real; begin radius1:=S/p; end; //функция нахождения радиуса описанной окружности //входные параметры - площадь и стороны треугоника function Radius2(S, s1, s2, s3:real):real; begin Radius2:=(s1*s2*s3)/(4*S); end; begin n:=3; x1:=strtoint(edit1.text); y1:=strtoint(edit2.text); x2:=strtoint(edit3.text); y2:=strtoint(edit4.text); x3:=strtoint(edit5.text); y3:=strtoint(edit6.text); xy[1,1]:=x1; xy[1,2]:=y1; xy[2,1]:=x2; xy[2,2]:=y2; xy[3,1]:=x3; xy[3,2]:=y3; n8.Click; a[0].x:=x1; a[0].y:=y1; a[1].x:=x2; a[1].y:=y2; a[2].x:=x3; a[2].y:=y3; w:=form2.Image1.Width; h:=form2.Image1.Height; //упорядочиваем вершины треугольника по возрастанию их y-координаты if(a[0].y>a[1].y) then begin t:=a[0]; a[0]:=a[1]; a[1]:=t;end; if(a[1].y>a[2].y) then begin t:=a[1]; a[1]:=a[2]; a[2]:=t;end; if(a[0].y>a[2].y) then begin t:=a[0]; a[0]:=a[2]; a[2]:=t;end; if(a[0].y>a[1].y) then begin t:=a[0]; a[0]:=a[1]; a[1]:=t;end; //Находим длины сторон треугольника s1:=SideLength(a[0].x,a[0].y, a[1].x,a[1].y); s2:=SideLength(a[1].x,a[1].y, a[2].x,a[2].y); s3:=SideLength(a[2].x,a[2].y, a[0].x,a[0].y); // Находим полупериметр треугольника и его площадь p := (Perimetr(s1, s2, s3))/2; S := Sqare (s1, s2, s3); //Находим радиус вписанной и описанной окружности r1:= radius1(S, p); R2:=Radius2(S, s1, s2, s3); //Находим углы треугольника ang1 := Angles(a[2],a[0],a[1]); ang2 := Angles(a[0],a[1],a[2]); ang3 := Angles(a[1],a[2],a[0]); //ищем середины сторон s1 и s2 m1.x := (a[0].x+a[1].x)/2; m1.y := (a[0].y+a[1].y)/2; m2.x := (a[1].x+a[2].x)/2; m2.y := (a[1].y+a[2].y)/2; //поворачиваем точку а[2] вокруг середины стороны s2 на угол 90 градусов x1 := a[2].x; y1 := a[2].y; x1 :=x1- m2.x; y1 :=y1- m2.y; b1.x := x1*cos(PI/2)-y1*sin(PI/2); b1.y := x1*sin(PI/2)+y1*cos(PI/2); b1.x :=b1.x + m2.x; b1.y :=b1.y + m2.y; v1.x := b1.x - m2.x; v1.y := b1.y - m2.y; //поворачиваем точку а[0] вокруг середины стороны s1 на угол 90 градусов x1 := a[0].x; y1 := a[0].y;//временные переменные x1 :=x1- m1.x; y1 :=y1- m1.y; b2.x := x1*cos(PI/2)-y1*sin(PI/2); b2.y := x1*sin(PI/2)+y1*cos(PI/2); b2.x :=b2.x+ m1.x; b2.y :=b2.y+m1.y; v2.x := b2.x - m1.x; v2.y := b2.y - m1.y; //строим описанную окружность(с центром в точке пересечения серединных перепендикуляров) DescrCircle(R2, m1.x, m1.y, m2.x, m2.y, v2.x, v2.y, v1.x, v1.y); coef1:=1; coef2:=1;//коэффициенты,указывающие напрвление поворота //вычисляем знак третьей координаты векторного произведения векторов, между которыми строится биссектриса det:=(a[1].x-a[0].x)*(a[2].y-a[0].y)-(a[2].x-a[0].x)*(a[1].y-a[0].y); if(det>0) then coef1:=-1; //если плюс, то поворачивать необходимо по часовой стрелке(т.к. полученная тройка векторов всегда правая) det:=(a[1].x-a[2].x)*(a[0].y-a[2].y)-(a[0].x-a[2].x)*(a[1].y-a[2].y); if(det>0) then coef2:=-1; //поворачиваем a[2] вокруг a[0] на угол равный половине угла ang2 x1 := a[2].x; y1 := a[2].y; //временные переменные x1 :=x1- a[0].x; y1 :=y1- a[0].y; b1.x := x1*cos(coef1*ang2/2)-y1*sin(coef1*ang2/2); b1.y := x1*sin(coef1*ang2/2)+y1*cos(coef1*ang2/2); b1.x :=b1.x+ a[0].x; b1.y :=b1.y+ a[0].y; v1.x := b1.x - a[0].x; v1.y := b1.y - a[0].y; x2 := a[0].x; y2 := a[0].y; x2 :=x2- a[2].x; y2 :=y2- a[2].y; b2.x := x2*cos(coef2*ang1/2)-y2*sin(coef2*ang1/2); b2.y := x2*sin(coef2*ang1/2)+y2*cos(coef2*ang1/2); b2.x :=b2.x+a[2].x; b2.y :=b2.y+ a[2].y; //b1 - a[2] после поворота v2.x := b2.x - a[2].x; v2.y := b2.y - a[2].y; //v1.x v1.y- координаты направляющего вектора биссектрисы //строим вписанную окружность(с центром в точке пересечения биссектрисс) DescrCircle(r1, a[2].x, a[2].y, a[0].x, a[0].y, v2.x, v2.y, v1.x, v1.y); end; procedure TForm1.N23Click(Sender: TObject); type Pt=record x,y:real;end; var flag,i:integer; s1,s2,s3,S,p,r1,R2,ang1,ang2,ang3, x1, x2, y1, y2,x3,y3, det:real; t,m1,m2, v1, v2, v3, n1, n2, n3, b1, b2,Bb1,Bb2:pt; a:array[0..2] of pt; coef1,coef2, w,h,xk1,xk2,yk1,yk2:integer; //функция нахождения длины стороны треугольника. // входными параметрами служат координаты конца и начала стороны. function SideLength(x1,y1,x2,y2:real) :real; begin SideLength:= sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); end; //функция нахождения углов треугольника, находим cos угла по формуле скалярного произведения векторов //входные параметры - вершины треугольника - function Angles(p1,p2,p3:pt):real; var a,exp:real; begin a:=(p2.x-p1.x)*(p3.x-p1.x)+(p2.y-p1.y)*(p3.y-p1.y); exp:=a/SideLength(p1.x,p1.y,p2.x,p2.y)/SideLength(p1.x,p1.y,p3.x,p3.y); angles:=arccos(exp); end; //функция, рисующая обе окружности вписанную и описанную //входные параметры - радиус окружности; координаты точки,лежащей на прямой; координаты направляющего вектора прямой. procedure DescrCircle(R:real; x01,y01,x02,y02, l1, m1, l2, m2:real); var x,y:real; begin //вычисление координат точки пересечения прямых, заданных координатами точки на прямой и координатами направляющих векторов if ((l1<>0)and((m1/l1)-(m2/l2)<>0)and(l2<>0)) then begin X:= ((m1/l1)*x01-y01-(m2/l2)*x02+y02)/((m1/l1)-(m2/l2)); Y:= (m1*X-m1*x01+l1*y01)/l1; form2.Image1.Canvas.Pen.Color:=form1.ColorL; form2.Image1.Canvas.Pen.Width :=form1.widthL; xk1:=round(((x-r)-form1.xmin)/(form1.xmax-form1.xmin)*w); yk1:=round(h-(y-r-form1.xmin)/(form1.xmax-form1.xmin)*h); xk2:=round((x+r-form1.xmin)/(form1.xmax-form1.xmin)*w); yk2:=round(h-(y+r-form1.xmin)/(form1.xmax-form1.xmin)*h); form2.image1.Canvas.arc(xk1,yk1,xk2,yk2,0,0,0,0);//рисуем окружность end; end; //функция нахождения периметра треугоника. //входные параметры - стороны треугольника function Perimetr (s1, s2, s3:real):real; begin perimetr:=(s1+s2+s3); end; //функция нахождения площади треугольника (по формуле Герона) //входные параметры - стороны треугольника function Sqare (s1, s2,s3:real):real; var p:real; begin p:=(Perimetr(s1, s2, s3))/2; Sqare:=sqrt((p*(p-s1)*(p-s2)*(p-s3))); end; //функция нахождения радиуса вписанной окружности //входные параметры - площадь и полупериметр треугольника function radius1(S,p:real):real; begin radius1:=S/p; end; //функция нахождения радиуса описанной окружности //входные параметры - площадь и стороны треугоника function Radius2(S, s1, s2, s3:real):real; begin Radius2:=(s1*s2*s3)/(4*S); end; begin n:=3; x1:=strtofloat(edit1.text); y1:=strtofloat(edit2.text); x2:=strtofloat(edit3.text); y2:=strtofloat(edit4.text); x3:=strtofloat(edit5.text); y3:=strtofloat(edit6.text); a[0].x:=x1; a[0].y:=y1; a[1].x:=x2; a[1].y:=y2; a[2].x:=x3; a[2].y:=y3; xy[1,1]:=x1; xy[1,2]:=y1; xy[2,1]:=x2; xy[2,2]:=y2; xy[3,1]:=x3; xy[3,2]:=y3; w:=form2.Image1.Width; h:=form2.Image1.Height; n8.Click; //упорядочиваем вершины треугольника по возрастанию их y-координаты if(a[0].y>a[1].y) then begin t:=a[0]; a[0]:=a[1]; a[1]:=t;end; if(a[1].y>a[2].y) then begin t:=a[1]; a[1]:=a[2]; a[2]:=t;end; if(a[0].y>a[2].y) then begin t:=a[0]; a[0]:=a[2]; a[2]:=t;end; if(a[0].y>a[1].y) then begin t:=a[0]; a[0]:=a[1]; a[1]:=t;end; //Находим длины сторон треугольника s1:=SideLength(a[0].x,a[0].y, a[1].x,a[1].y); s2:=SideLength(a[1].x,a[1].y, a[2].x,a[2].y); s3:=SideLength(a[2].x,a[2].y, a[0].x,a[0].y); // Находим полупериметр треугольника и его площадь p := (Perimetr(s1, s2, s3))/2; S := Sqare (s1, s2, s3); //Находим радиус вписанной и описанной окружности r1:= radius1(S, p); R2:=Radius2(S, s1, s2, s3); //Находим углы треугольника ang1 := Angles(a[2],a[0],a[1]); ang2 := Angles(a[0],a[1],a[2]); ang3 := Angles(a[1],a[2],a[0]); //ищем середины сторон s1 и s2 m1.x := (a[0].x+a[1].x)/2; m1.y := (a[0].y+a[1].y)/2; m2.x := (a[1].x+a[2].x)/2; m2.y := (a[1].y+a[2].y)/2; //поворачиваем точку а[2] вокруг середины стороны s2 на угол 90 градусов x1 := a[2].x; y1 := a[2].y; x1 :=x1- m2.x; y1 :=y1- m2.y; b1.x := x1*cos(PI/2)-y1*sin(PI/2); b1.y := x1*sin(PI/2)+y1*cos(PI/2); b1.x :=b1.x + m2.x; b1.y :=b1.y + m2.y; v1.x := b1.x - m2.x; v1.y := b1.y - m2.y; //поворачиваем точку а[0] вокруг середины стороны s1 на угол 90 градусов x1 := a[0].x; y1 := a[0].y;//временные переменные x1 :=x1- m1.x; y1 :=y1- m1.y; b2.x := x1*cos(PI/2)-y1*sin(PI/2); b2.y := x1*sin(PI/2)+y1*cos(PI/2); b2.x :=b2.x+ m1.x; b2.y :=b2.y+m1.y; v2.x := b2.x - m1.x; v2.y := b2.y - m1.y; //строим описанную окружность(с центром в точке пересечения серединных перепендикуляров) DescrCircle(R2, m1.x, m1.y, m2.x, m2.y, v2.x, v2.y, v1.x, v1.y); coef1:=1; coef2:=1;//коэффициенты,указывающие напрвление поворота //вычисляем знак третьей координаты векторного произведения векторов, между которыми строится биссектриса det:=(a[1].x-a[0].x)*(a[2].y-a[0].y)-(a[2].x-a[0].x)*(a[1].y-a[0].y); if(det>0) then coef1:=-1; //если плюс, то поворачивать необходимо по часовой стрелке(т.к. полученная тройка векторов всегда правая) det:=(a[1].x-a[2].x)*(a[0].y-a[2].y)-(a[0].x-a[2].x)*(a[1].y-a[2].y); if(det>0) then coef2:=-1; //поворачиваем a[2] вокруг a[0] на угол равный половине угла ang2 x1 := a[2].x; y1 := a[2].y; //временные переменные x1 :=x1- a[0].x; y1 :=y1- a[0].y; b1.x := x1*cos(coef1*ang2/2)-y1*sin(coef1*ang2/2); b1.y := x1*sin(coef1*ang2/2)+y1*cos(coef1*ang2/2); b1.x :=b1.x+ a[0].x; b1.y :=b1.y+ a[0].y; v1.x := b1.x - a[0].x; v1.y := b1.y - a[0].y; x2 := a[0].x; y2 := a[0].y; x2 :=x2- a[2].x; y2 :=y2- a[2].y; b2.x := x2*cos(coef2*ang1/2)-y2*sin(coef2*ang1/2); b2.y := x2*sin(coef2*ang1/2)+y2*cos(coef2*ang1/2); b2.x :=b2.x+a[2].x; b2.y :=b2.y+ a[2].y; //b1 - a[2] после поворота v2.x := b2.x - a[2].x; v2.y := b2.y - a[2].y; //v1.x v1.y- координаты направляющего вектора биссектрисы //строим вписанную окружность(с центром в точке пересечения биссектрисс) DescrCircle(r1, a[2].x, a[2].y, a[0].x, a[0].y, v2.x, v2.y, v1.x, v1.y); end; procedure TForm1.Button4Click(Sender: TObject); var i:integer; begin n:=strtoint(edit7.Text); randomize; for i:=1 to n do begin xy[i,1]:=50-random(100); xy[i,2]:=50-random(100); memo1.Lines.add(floattostr(RoundTo(xy[i,1],-2))+' '+floattostr(roundto(xy[i,2],-2))); end; end; procedure TForm1.N24Click(Sender: TObject); //Наведемо програму вирішення даної задачі алгоритмом Джарвіса: type vv = record x,y: real; end; myArray = array[1..100] of vv; var a, b: myArray; min,m,i,j,k:integer; s,p:real; function vect(a1,a2,b1,b2:vv):real; begin vect:=(a2.x - a1.x)*(b2.y-b1.y)-(b2.x-b1.x)*(a2.y-a1.y) end; function dist2(a1,a2:vv):real; {Квадрат длины вектора} begin dist2:=sqr(a2.x-a1.x)+sqr(a2.y-a1.y); end;{dist2} procedure Solve(a:myArray; var k: integer; var b:myArray); {Построение выпуклой оболочки} var i, j, m: integer; begin {ищем правую нижнюю точку} m:=1; for i:= 2 to n do if a[i].y < a[m].y then m := i else if (a[i].y = a[m].y) and (a[i].x > a[m].x) then m:=i; {запишем ее в массив b и переставим на первое место в массиве a} b[1] := a[m]; a[m]:= a[1]; a[1]:= b[1]; k:= 1; min:= 2; // writeln(b[1].x, b[1].y); repeat {ищем очередную вершину оболочки} for j := 2 to n do if (Vect(b[k],a[min],b[k],a[j])< 0) or ((Vect(b[k],a[min],b[k],a[j])=0) and (dist2(b[k],a[min])< dist2(b[k],a[j]))) then min:=j; k:=k+1; {записана очередная вершина} b[k]:=a[min]; min:=1; until (b[k].x = b[1].x)and (b[k].y = b[1].y); {пока ломаная не замкнется} end; {Solve} begin{main} for i:= 1 to n do begin a[i].x:=xy[i,1]; a[i].y:=xy[i,2]; end; solve(a, k, b); {Виведення результату} n:=k-1; memo1.Clear; memo1.Lines.add(inttostr(n)); for i:=1 to n do begin xy[i,1]:=b[i].x; xy[i,2]:=b[i].y; memo1.Lines.add(floattostr(RoundTo(xy[i,1],-2))+' '+floattostr(roundto(xy[i,2],-2))); end; xy[n+1,1]:=xy[1,1]; xy[n+1,2]:=xy[1,2]; s:=0; for i:=1 to n do s:=s+xy[i,1]*xy[i+1,2]-xy[i+1,1]*xy[i,2]; s:=1/2*abs(s); edit15.Text:=floattostr(RoundTo(s,-2)); p:=0; for i:=1 to n-1 do p:=p+sqrt(sqr(xy[i,1]-xy[i+1,1])+sqr(xy[i,2]-xy[i+1,2])); edit23.Text:=floattostr(RoundTo(p,-2)); n8.Click; end; end.