DanZer напутал с координатами по Y
при выводе везде надо 'ymax-' подставлять, и ёще вроде где-то индексы перепутал. вот попробуй, тока с делением на ноль сам уж доведи...
дебаг версия:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
a:array [1..6] of array [1..2] of integer; // координаты точек закинуты в массив a[1,1]=x1, a[1,2]=y1, a[2,1]=x2 и т.д.
MyMetafile: TMetafile;
b1,b2,k1,k2,xa,ya,xb,yb:real;
i:byte;
const
YMax: Integer = 400;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
{т.к. ось OY идет сверху вниз, значение Y отнимаем от Ymax,
чтобы график рисовался как положено, а не вверх ногами}
a[1,1]:=119;
a[1,2]:=ymax-85;
a[2,1]:=257;
a[2,2]:=ymax-201;
a[3,1]:=166;
a[3,2]:=ymax-271;
//****************************************
k1:=(a[3,1]-a[2,1]) / (a[2,2]-a[3,2]);
k2:=(a[1,1]-a[3,1]) / (a[3,2]-a[1,2]);
xa:=( (a[2,1] + a[3,1]) / 2 );
ya:=( (a[2,2] + a[3,2]) / 2 );
xb:=( (a[3,1] + a[1,1]) / 2 );
yb:=( (a[3,2] + a[1,2]) / 2 );
b1:=ya - k1*xa;
b2:=yb - k2*xb;
{и, наконец, вычисляем координаты центра окружности}
a[5,1]:=round( (b2 - b1) / (k1 - k2) ); {это x0}
a[5,2]:=round( k1 * a[5,1] + b1 ); {а это y0}
//***********************************
if round( k1*a[5,1]+b1) = round( k2*a[5,1]+b2)
then Label2.Caption := 'True'
else Label2.Caption := 'False';
//**********************
k1:=(a[1,1]-a[3,1]) / (a[3,2]-a[1,2]);
k2:=(a[2,1]-a[1,1]) / (a[1,2]-a[2,2]);
xa:=( (a[3,1] + a[1,1]) / 2 );
ya:=( (a[3,2] + a[1,2]) / 2 );
xb:=( (a[1,1] + a[2,1]) / 2 );
yb:=( (a[1,2] + a[2,2]) / 2 );
b1:=ya-k1*xa;
b2:=yb-k2*xb;
{и, наконец, вычисляем координаты центра окружности}
a[6,1]:=round( (b2 - b1) / (k1 - k2) ); {это x0}
a[6,2]:=round( k1 * a[6,1] + b1 ); {а это y0}
//***********************************
if round( k1*a[6,1]+b1) = round( k2*a[6,1]+b2)
then Label3.Caption := 'True'
else Label3.Caption := 'False';
if a[1,2] <> a[2,2]
then k1:=(a[2,1]-a[1,1]) / (a[1,2]-a[2,2])
else k1:= 0;
if a[3,2] <> a[2,2]
then k2:=(a[3,1]-a[2,1]) / (a[2,2]-a[3,2])
else k2:= 0;
xa:=( (a[1,1] + a[2,1]) / 2 );
ya:=( (a[1,2] + a[2,2]) / 2 );
xb:=( (a[2,1] + a[3,1]) / 2 );
yb:=( (a[2,2] + a[3,2]) / 2 );
b1:=ya-k1*xa;
b2:=yb-k2*xb;
{и, наконец, вычисляем координаты центра окружности}
a[4,1]:= round( (b2 - b1) / (k1 - k2) ); {это x0}
a[4,2]:= round( k1 * a[4,1] + b1 ); {а это y0}
if round( k1*a[4,1]+b1) = round( k2*a[4,1]+b2)
then Label1.Caption := 'True'
else Label1.Caption := 'False';
//**********************
{и выводим результаты на экран}
MyMetafile := TMetafile.Create;
for i:=6 downto 1 do
begin
with TMetafileCanvas.Create(MyMetafile, 0) do
try
if i<4 then Brush.Color := clRed else Brush.Color := clYellow;
if i=5 then Brush.Color := clBlue;
if i=6 then Brush.Color := clGreen;
Ellipse(a[i,1]-i*4,ymax-a[i,2]-i*4,a[i,1]+i*4,ymax-a[i,2]+i*4);
if i<3
then
begin
MoveTo(a[i,1],ymax-a[i,2]);
LineTo(a[i+1,1], ymax-a[i+1,2]);
end;
if i=3
then
begin
MoveTo(a[i,1],ymax-a[i,2]);
LineTo(a[1,1], ymax-a[1,2]);
end;
if i=1
then
begin
MoveTo( round(xa),ymax-round(ya) );
LineTo( round(xa-50),ymax-round(k1*(xa-50)+b1) );
MoveTo( round(xb),ymax-round(yb) );
LineTo( round(xb-50),ymax-round(k2*(xb-50)+b2) );
end;
finally
Free;
end;
Form1.Canvas.Draw(0,0,MyMetafile);
end;
end;
end.
DanZer напутал с координатами по Y
при выводе везде надо 'ymax-' подставлять, и ёще вроде где-то индексы перепутал. вот попробуй, тока с делением на ноль сам уж доведи...
дебаг версия: