三点画圆弧的问题(急:200分)(200分)

  • 主题发起人 JackieLee1979
  • 开始时间
J

JackieLee1979

Unregistered / Unconfirmed
GUEST, unregistred user!
已知平面上三个点P1(X1,Y1),P2(X2,Y2),P3(X3,Y3),做一个圆弧,以P1,P2为圆弧的起始点和终止点,当然圆弧还要过P3点。现在我能够通过三点求出圆心C(Xc,Yc)和半径R,求各位帮帮忙能不能给出Delphi画这个圆弧的算法。拜托了,只要能够实现,必定给分。
 
F

fanboynet

Unregistered / Unconfirmed
GUEST, unregistred user!
这个汲及图像学的,帮不上忙了.
换位想想,如果是要画在纸上,要怎么画..
 
P

power255

Unregistered / Unconfirmed
GUEST, unregistred user!
函数:Canvas.Arc(x1,y1,x2,y2,x3,y3,x4,y4 : Integer);
x1,y1 椭圆的左上角的坐标
x2,y2 椭圆的右下角的坐标
x3,y3 椭圆弧的起始点坐标
x4,y4 椭圆弧的终止点坐标
 
J

JackieLee1979

Unregistered / Unconfirmed
GUEST, unregistred user!
power255 大哥啊,这谁都知道啊!可能我说的不明白,最关键的我是要求出圆弧的起始角和终止角
 
J

JackieLee1979

Unregistered / Unconfirmed
GUEST, unregistred user!
而且我是用GDI+做的,gdi+的函数是:DrawArc(Pen,X,Y,Width,Height,StartAngle,EndAngle) 关键是哪位好心的大哥能够给我求出:StartAngle和EndAngle
 
P

power255

Unregistered / Unconfirmed
GUEST, unregistred user!
放三个BitBtn上去。


procedure TForm1.ArcFx(x1, y1, x2, y2, x3, y3: Integer);
var
X0, Y0, r : Integer;
Xt, Yt, rt : extended;
begin
Xt := ((y3 - Y1) * (Y2 * Y2 - Y1 * Y1 + X2 * X2 - X1 * X1) + (Y2 - Y1) * (Y1
* Y1 - y3 * y3 + X1 * X1 - x3 * x3)) / (2 * (X2 - X1) * (y3 - Y1) - 2 * (x3
-
X1) * (Y2 - Y1));
Yt := ((x3 - X1) * (X2 * X2 - X1 * X1 + Y2 * Y2 - Y1 * Y1) + (X2 - X1) * (X1
* X1 - x3 * x3 + Y1 * Y1 - y3 * y3)) / (2 * (Y2 - Y1) * (x3 - X1) - 2 * (y3
-
Y1) * (X2 - X1));
X0 := Round(Xt);
Y0 := Round(Yt);
rt := sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0));
r := Round(rt);
Button1.Top := Y0;
Button1.Left := X0;
Button1.Caption := '圆心Left:' + inttostr(Button1.Left) + 'Top:' +
inttostr(Button1.Top);
Canvas.Arc(X0 - r, Y0 - r, X0 + r, Y0 + r, x2, y2, x3, y3);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
BitBtn1.Caption := 'A点Left:' + inttostr(BitBtn1.Left) + 'Top:' +
inttostr(BitBtn1.Top);
BitBtn2.Caption := 'B点Left:' + inttostr(BitBtn2.Left) + 'Top:' +
inttostr(BitBtn2.Top);
BitBtn3.Caption := 'C点Left:' + inttostr(BitBtn3.Left) + 'Top:' +
inttostr(BitBtn3.Top);
ArcFx(BitBtn1.Left, BitBtn1.Top, BitBtn2.Left, BitBtn2.Top,
BitBtn3.Left, BitBtn3.Top);
end;
 
J

JackieLee1979

Unregistered / Unconfirmed
GUEST, unregistred user!
power255大侠的方法的确可行,但是我要求的是三点都在圆弧上。你只是通过三点确定了半径和圆心,用其中两点为起始点和终止点做出弧线,没有考虑三点全在圆弧上的情况。
帮帮忙,能不能继续修改一下。小弟必定重重有赏
 
P

power255

Unregistered / Unconfirmed
GUEST, unregistred user!
三点全在圆弧上的情况有三种情况的...如何指定唯一的一个?
 
F

fhb

Unregistered / Unconfirmed
GUEST, unregistred user!
TCAD支持这样的画法
可到这里下载
http://www.codeidea.com/cn/
 
J

JackieLee1979

Unregistered / Unconfirmed
GUEST, unregistred user!
power255 以P1,P2为弦过P3点的情况
 
H

hwljerry

Unregistered / Unconfirmed
GUEST, unregistred user!
通过点到直线的距离可以判断出P1,P2使用哪一个点作起点,哪个做终点。
这样用GDI的话就可以直接用。
if GetPtToLineDistance(p1, p2, p3) > 0 then
begin
Swap(p1, p2);
end;
Arc(DC, cx-r, cy-r, cx+r, cy+r, p1.x, p1.y, p2.x, p2.y);

用GDI+的话,已经知道起点和终点了,就可以计算出起始角和终止角了。

最重要的就是点到直线的距离,
距离为|ax+by+c|/根号(a平方+b平方),去掉前面的绝对值就是判断点在直线的哪一边了。
 
P

power255

Unregistered / Unconfirmed
GUEST, unregistred user!
画二条圆弧,P1到P3,P3到P2
 
J

JackieLee1979

Unregistered / Unconfirmed
GUEST, unregistred user!
很感谢power255,我自己已经解决了,通过利用的矢量叉积加上求圆心和半径的公式可以搞定
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
652
import
I
顶部