DanZer напутал с координатами по

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.

Задачка из геометрии: кто подскажет?