delphi 已知3点坐标,需要画一个圆,并计算它的半径!

时间:2021-04-22 17:35:21
delphi 已知3点坐标,需要画一个圆,并计算它的半径!
小弟数学很差,谢谢大家了!

6 个解决方案

#1


记得2004年有同学问过这样的题目,然后,某大侠出来说,严打不经过思考就提问的。。。

现在我是否可以说:严打没经过搜索就来提问的?

#2


谢谢1楼,我是搜过本坛论还有百度,找不到啊!

#3


interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Ax,Ay,Bx,By,Cx,Cy: Single;
  Ox,Oy: Single;
  r: Single;
begin
  Ax:= StrToFloatDef(InputBox('输入A点x坐标', 'Ax =', '78.3'),78.3);
  Ay:= StrToFloatDef(InputBox('输入A点y坐标', 'Ay =', '78.3'),78.3);
  Bx:= StrToFloatDef(InputBox('输入B点x坐标', 'Bx =', '10'), 10);
  By:= StrToFloatDef(InputBox('输入B点y坐标', 'By =', '60'),60);
  Cx:= StrToFloatDef(InputBox('输入C点x坐标', 'Cx =', '60'),60);
  Cy:= StrToFloatDef(InputBox('输入C点y坐标', 'Cy =', '10'), 10);

  Ox:= ((Cy-Ay)*(By*By-Ay*Ay+Bx*Bx-Ax*Ax)+(By-Ay)*(Ay*Ay-Cy*Cy+Ax*Ax-Cx*Cx))/(2*(Bx-Ax)*(Cy-Ay)-2*(Cx-Ax)*(By-Ay));
  Oy:= ((Cx-Ax)*(Bx*Bx-Ax*Ax+By*By-Ay*Ay)+(Bx-Ax)*(Ax*Ax-Cx*Cx+Ay*Ay-Cy*Cy))/(2*(By-Ay)*(Cx-Ax)-2*(Cy-Ay)*(Bx-Ax));

  r:= Sqrt(Sqr(Ox-Bx)+Sqr(Oy-By));
  ShowMessage(FormatFloat('0.00',r));

  Canvas.Ellipse(Round(Ax)-2,Round(Ay)-2,Round(Ax)+2,Round(Ay)+2);
  Canvas.Ellipse(Round(Bx)-2,Round(By)-2,Round(Bx)+2,Round(By)+2);
  Canvas.Ellipse(Round(Cx)-2,Round(Cy)-2,Round(Cx)+2,Round(Cy)+2);

  Canvas.Ellipse(Round(Ox-r),Round(Oy-r),Round(Ox+r),Round(Oy+r));
end;

#4


  r:= Sqrt(Sqr(Ox-Bx)+Sqr(Oy-By));  //圆半径

  Canvas.Ellipse(Round(Ax)-2,Round(Ay)-2,Round(Ax)+2,Round(Ay)+2);  //标识出A点位置
  Canvas.Ellipse(Round(Bx)-2,Round(By)-2,Round(Bx)+2,Round(By)+2);  //标识出B点位置
  Canvas.Ellipse(Round(Cx)-2,Round(Cy)-2,Round(Cx)+2,Round(Cy)+2);  //标识出C点位置

  Canvas.Ellipse(Round(Ox-r),Round(Oy-r),Round(Ox+r),Round(Oy+r));  //画圆

#5


谢谢!非常感谢!

#6


嘿嘿,结贴~~

#1


记得2004年有同学问过这样的题目,然后,某大侠出来说,严打不经过思考就提问的。。。

现在我是否可以说:严打没经过搜索就来提问的?

#2


谢谢1楼,我是搜过本坛论还有百度,找不到啊!

#3


interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Ax,Ay,Bx,By,Cx,Cy: Single;
  Ox,Oy: Single;
  r: Single;
begin
  Ax:= StrToFloatDef(InputBox('输入A点x坐标', 'Ax =', '78.3'),78.3);
  Ay:= StrToFloatDef(InputBox('输入A点y坐标', 'Ay =', '78.3'),78.3);
  Bx:= StrToFloatDef(InputBox('输入B点x坐标', 'Bx =', '10'), 10);
  By:= StrToFloatDef(InputBox('输入B点y坐标', 'By =', '60'),60);
  Cx:= StrToFloatDef(InputBox('输入C点x坐标', 'Cx =', '60'),60);
  Cy:= StrToFloatDef(InputBox('输入C点y坐标', 'Cy =', '10'), 10);

  Ox:= ((Cy-Ay)*(By*By-Ay*Ay+Bx*Bx-Ax*Ax)+(By-Ay)*(Ay*Ay-Cy*Cy+Ax*Ax-Cx*Cx))/(2*(Bx-Ax)*(Cy-Ay)-2*(Cx-Ax)*(By-Ay));
  Oy:= ((Cx-Ax)*(Bx*Bx-Ax*Ax+By*By-Ay*Ay)+(Bx-Ax)*(Ax*Ax-Cx*Cx+Ay*Ay-Cy*Cy))/(2*(By-Ay)*(Cx-Ax)-2*(Cy-Ay)*(Bx-Ax));

  r:= Sqrt(Sqr(Ox-Bx)+Sqr(Oy-By));
  ShowMessage(FormatFloat('0.00',r));

  Canvas.Ellipse(Round(Ax)-2,Round(Ay)-2,Round(Ax)+2,Round(Ay)+2);
  Canvas.Ellipse(Round(Bx)-2,Round(By)-2,Round(Bx)+2,Round(By)+2);
  Canvas.Ellipse(Round(Cx)-2,Round(Cy)-2,Round(Cx)+2,Round(Cy)+2);

  Canvas.Ellipse(Round(Ox-r),Round(Oy-r),Round(Ox+r),Round(Oy+r));
end;

#4


  r:= Sqrt(Sqr(Ox-Bx)+Sqr(Oy-By));  //圆半径

  Canvas.Ellipse(Round(Ax)-2,Round(Ay)-2,Round(Ax)+2,Round(Ay)+2);  //标识出A点位置
  Canvas.Ellipse(Round(Bx)-2,Round(By)-2,Round(Bx)+2,Round(By)+2);  //标识出B点位置
  Canvas.Ellipse(Round(Cx)-2,Round(Cy)-2,Round(Cx)+2,Round(Cy)+2);  //标识出C点位置

  Canvas.Ellipse(Round(Ox-r),Round(Oy-r),Round(Ox+r),Round(Oy+r));  //画圆

#5


谢谢!非常感谢!

#6


嘿嘿,结贴~~