简单问题---关于画圆的 ( 积分: 20 )

  • 主题发起人 主题发起人 sahara110
  • 开始时间 开始时间
S

sahara110

Unregistered / Unconfirmed
GUEST, unregistred user!
我想取三个点画一个圆,然后得到这个圆的直径,有这样的函数吗,
哪位大侠给个例子啊.
 
我想取三个点画一个圆,然后得到这个圆的直径,有这样的函数吗,
哪位大侠给个例子啊.
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
StartColor, StopColor: TColor;
i, FNumOfColor: Integer;
StartRed, StartGreen, StartBlue: Integer;
StopRed, StopGreen, StopBlue: Integer;
Red, Green, Blue: Integer;
begin
StartColor := $0014097B;
StopColor := $00D8D5FD;
FNumOfColor := 50;
StartRed := StartColor and $FF;
StartGreen := (StartColor and $FF00) shr 8;
StartBlue := (StartColor and $FF0000) shr 16;
StopRed := StopColor and $FF;
StopGreen := (StopColor and $FF00) shr 8;
StopBlue := (StopColor and $FF0000) shr 16;
for i := 0 to FNumOfColor do
begin
Red := Round((i/FNumOfColor*StopRed + (FNumOfColor-i)/FNumOfColor*StartRed ));
Green := Round((i/FNumOfColor*StopGreen + (FNumOfColor-i)/FNumOfColor*StartGreen));
Blue := Round((i/FNumOfColor*StopBlue + (FNumOfColor-i)/FNumOfColor*StartBlue ));
Canvas.Pen.Color := Red + Green shl 8 + Blue shl 16;
Canvas.Ellipse(FNumOfColor+i,FNumOfColor+i,150-i,150-i);
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
StartColor, StopColor: TColor;
i, FNumOfColor: Integer;
StartRed, StartGreen, StartBlue: Integer;
StopRed, StopGreen, StopBlue: Integer;
Red, Green, Blue: Integer;
begin
StartColor := $0014097B;
StopColor := $00D8D5FD;
FNumOfColor := 50;
StartRed := StartColor and $FF;
StartGreen := (StartColor and $FF00) shr 8;
StartBlue := (StartColor and $FF0000) shr 16;
StopRed := StopColor and $FF;
StopGreen := (StopColor and $FF00) shr 8;
StopBlue := (StopColor and $FF0000) shr 16;
for i := 0 to FNumOfColor do
begin
Red := Round((i/FNumOfColor*StopRed + (FNumOfColor-i)/FNumOfColor*StartRed ));
Green := Round((i/FNumOfColor*StopGreen + (FNumOfColor-i)/FNumOfColor*StartGreen));
Blue := Round((i/FNumOfColor*StopBlue + (FNumOfColor-i)/FNumOfColor*StartBlue ));
Canvas.Pen.Color := Red + Green shl 8 + Blue shl 16;
Canvas.Ellipse(FNumOfColor+i,FNumOfColor+i,150-i,150-i);
end;

end;
procedure TForm1.Button2Click(Sender: TObject);
var
i, j: Integer;
Dct: TRect;
begin
j := Form1.height;
for i := 0 to 255 do
begin
if i<128 then
Canvas.Brush.Color := RGB(i*2, 0, 0)
else
Canvas.Brush.Color := RGB(255, (i-128)*2, (i-128)*2) ;
Dct := Rect(i*2, 0, (i+1)*2, j);
Canvas.FillRect(Dct);
end;

end;
procedure TForm1.FormPaint(Sender: TObject);
var i:word;dy,y:real;
begin
dy:=(clientheight/256)*1/2;
y:=0;
for i:=0 to 255 do
begin//rgb(0,0,0)->rgb(0,255,0)
canvas.Brush.color:=RGB(0,i,0);//$00000000+i*10000;
canvas.FillRect(rect(0,round(y),clientwidth,round(y+dy)));
y:=y+dy;
end;
for i:=255 downto 0 do
begin//rgb(0,255,0)->rgb(0,0,0)
canvas.Brush.color:=RGB(0,i,0);//$00000000+i*10000;
canvas.FillRect(rect(0,round(y),clientwidth,round(y+dy)));
y:=y+dy;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
r :integer;
i :integer;
x1,y1 :integer;
// x2,y2 :integer;
step :real;
StepColor:real;
begin
x1:=300;y1:=250;
// x2:=200;y2:=150;
r:=200;
StepColor:=150;
Step:=(255-StepColor)/r;
for i:=r downto 1 do
begin
StepColor:=StepColor+Step;
Form1.Canvas.Pen.Color:=rgb(Round(StepColor),0,0);
Form1.Canvas.Brush.Color:=rgb(Round(StepColor),0,0);
form1.Canvas.Ellipse(x1-i,y1-i,x1+i,y1+i);
end;
end;

end.
 
to 漂流的云
这个不是我想要的啊.我想的是在panel上任取3个点如(x1,y1),(x2,y2),(x3,y3) 记住这3个点的坐标值.然后过这3个点做一个圆,在取出这个远的直径就行
 
Ellipse(x1,y1,x2,y2);
是两点啊,而且两点取在同一直线上根本不能画圆
 
我给你算法
先利用数学方法求出半径,求出圆心坐标
在利用delphi将这个圆画出
及利用三角形外接圆圆心为三角形任意两边的垂直平分线的交点,
写出直线方程在求解交点,说明一下求出的交点坐标有可能是浮点数,但最终画图时要转化为整形数,所以可能画出的圆最终不能完全通过这三个点,会存在一些偏差,这是无法避免的!
好了就说到这里,具体实现你就自己写吧
 
下面的链接可以满足你

http://www.delphibbs.com/delphibbs/dispq.asp?LID=936299

-------------------------转自网络
给你一种最常见的相切状态的求解公式:
圆4与另外3各圆均外切,且处于3圆的中央。

明确一个概念:两圆外切,圆心的连线通过切点!
3个未知数,3个方程!

Sqr(x1-x4)+Sqr(y1-y4)=Sqr(R1+R4);
Sqr(x2-x4)+Sqr(y2-y4)=Sqr(R2+R4);
Sqr(x3-x4)+Sqr(y3-y4)=Sqr(R3+R4);
 
chenybin,[8D]你好像偏题了啊!
 
不好意思看错了,求圆心其实还比较简单,只是可能楼主想要现成代码

3个点,其实就是两条线,然后求这两条线的中垂线,再求中垂线的交点,这个就是圆心了,半价就是任意圆心和任意一个点的距离,有了圆心和半径,画出来就简单了

TCanvas.Ellipse(X0 - R, Y0 - R, X0 + R, Y0 +R);对角线
 
to chenybin
这么复杂啊,小弟我刚学delphi还不熟呢,全都是数学公式啊,有类似的例子吗
 
[:(!]我给你说话你没看到阿!!本来想帮你写出来没心情了,自己忙把!
 
http://www.wanfangdata.com.cn/qikan/periodical.Articles/dnkfyyy/dnkf2002/0208/020821.htm
 
外圆半径 = abc / (4*面积)
内圆半径 = 2 * 面积 / 周长
计算出三个边的长度,a,b,c
 
function CalcArcRadius(const p0, p1, p2: TPoint; var Radius:integer): Boolean;
var
Lp1,Lp2:Array[0..1] of TPoint;
a,b,c,d:double;
x,y:LongWord;
FCenter:TPoint;//圆心
begin
result;=True;
if ((p0.x=p1.X) and (p1.X=p2.X)) or ((p0.Y=p1.Y) and(p1.Y=p2.Y)) then
begin
Result:=False;
Exit;
end;
if ((p0.x=p1.X) and (p1.y=p0.y)) or ((p0.x=p2.X) and (p0.y=p2.y)) or ((p2.x=p1.X) and (p1.y=p2.y)) then
begin
Result:=False;
Exit;
end;
if (p0.Y=p1.Y) then begin
Lp1[0]:=p0; lp1[1]:=p2; lp2[0]:=p1; lp2[1]:=p2;
end
else if (p1.y=p2.Y) then begin
Lp1[0]:=p0; lp1[1]:=p1; lp2[0]:=p0; lp2[1]:=p2;
end
else begin
Lp1[0]:=p0; lp1[1]:=p1; lp2[0]:=p1; lp2[1]:=p2;
end;
a:=(lp1[1].X-lp1[0].X)/(lp1[0].Y-lp1[1].Y);
c:=(lp2[1].X-lp2[0].X)/(lp2[0].Y-lp2[1].Y);
b:=(lp1[0].Y+lp1[1].Y)/2-a*(lp1[1].X+lp1[0].X)/2;
d:=(lp2[0].Y+lp2[1].Y)/2-c*(lp2[1].X+lp2[0].X)/2;
FCenter.X:=RoundEx((d-b)/(a-c));
FCenter.Y:=RoundEx(a*(d-b)/(a-c)+b);
x:=sqr(Fcenter.X-p2.X);
Y:=sqr(Fcenter.Y-p2.Y);
Radius:=RoundEx(Sqrt(X+Y));
end;
 
接受答案了
 
多人接受答案了。
 
后退
顶部