问一个关于圆弧的算法 ( 积分: 200 )

  • 主题发起人 主题发起人 bubble
  • 开始时间 开始时间
B

bubble

Unregistered / Unconfirmed
GUEST, unregistred user!
已知一个圆弧,圆心P(x0,y0),弧端点A(x1,y1),B(x2,y2)
我想求圆弧上均分圆弧成n段的点的集合。
比方说,n=2,圆弧分两段,就求一个圆弧的中点
n=3,圆弧均分三段,求圆弧上两个点
找一个简单的算法。
 
求出圆弧夹角角度,等分后再求圆弧上点等分点。
 
坐标用double型,
这个问题我想,牵扯的东西比较多。
如果谁有好的简单的答案可以说得具体一点。
不是几何卷子用尺子画两笔就行了的。
用极坐标解也可以。
 
type
TMyPoint = record
X, Y:do
uble;
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure GetEqualPoint(AStartPoint, AEndPoint, ACenterPoint: TMyPoint;
DivideValue: Integer;
AResult: array of TMyPoint);
{
.O
/|/
/ | /
/ | /
A.___|___.B
C
}
var
tmpRadius, tmpOC, tmpBC:do
uble;
tmpRadians, tmpR1: Extended;
tmpMidpoint, tmpPoint: TMyPoint;
begin
{ 1、先取C点坐标 }
tmpMidpoint.X := (AStartPoint.X + AEndPoint.X) / 2;
tmpMidpoint.Y := (AStartPoint.Y + AEndPoint.Y) / 2;
{ 2、计算夹角弧度 }
tmpOC := Sqrt((ACenterPoint.X - tmpMidpoint.X) * (ACenterPoint.X - tmpMidpoint.X) +
(ACenterPoint.Y - tmpMidpoint.Y) * (ACenterPoint.Y - tmpMidpoint.Y));
tmpBC := Sqrt((AEndPoint.X - tmpMidpoint.X) * (AEndPoint.X - tmpMidpoint.X) +
(AEndPoint.Y - tmpMidpoint.Y) * (AEndPoint.Y - tmpMidpoint.Y));
tmpRadians := 2 * Abs(ArcTan2(tmpBC, tmpOC));
{ 3、等分角度弧度 }
tmpR1 := tmpRadians / DivideValue;
{ 4、计算等分坐标 }
// ... 稍微麻烦,可能需要方程组求解,有时间再写。
end;
 
后面的不用解方程了
把一个点(x,y)绕点(x0,y0)转α角度后,新的坐标(X,Y)应该是
X=(x-x0)*cosα-(y-y0)*sinα+x0
Y=(x-x0)*sinα+(y-y0)*cosα+y0
我想这可能就是最简单的办法了
 
恩,这个倒没想到,楼主的方法比较简便。
不知道还有没有其他方法。
 
接受答案了.
 
后退
顶部