[注意事項]
這適用於任何橢圓弧不僅僅是軸線對齊。
[EDIT1] C++示例
double x0,y0,rx,ry,a0,a1; // elliptic arc center,semi-axises,start/end angles CW
void ellarc_closest_point(double &x_out,double &y_out,double x_in,double y_in)
{
int e,i;
double ll,l,aa,a,da,x,y,b0,b1;
while (a0>=a1) a0-=pi2; // just make sure a0<a1
b0=a0; b1=a1; da=(b1-b0)/25.0; // 25 sample points in first iteration
ll=-1; aa=a0; // no best solution yet
for (i=0;i<3;i++) // recursions more means more accurate result
{
// sample arc a=<b0,b1> with step da
for (e=1,a=b0;e;a+=da)
{
if (a>=b1) { a=b1; e=0; }
// elliptic arc sampled point
x=x0+rx*cos(a);
y=y0-ry*sin(a); // mine y axis is in reverse order therefore -
// distance^2 to x_in,y_in
x-=x_in; x*=x;
y-=y_in; y*=y; l=x+y;
// remember best solution
if ((ll<0.0)||(ll>l)) { aa=a; ll=l; }
}
// use just area near found solution aa
b0=aa-da; if (b0<a0) b0=a0;
b1=aa+da; if (b1>a1) b1=a1;
// 10 points per area stop if too small area already
da=0.1*(b1-b0); if (da<1e-6) break;
}
x_out=x0+rx*cos(aa);
y_out=y0-ry*sin(aa); // mine y axis is in reverse order therefore -
}
和視覺輸出:
謝謝 - 我的工作在目前的分析解決方案,並計劃如果我得到的時間將其與這種「二分法」的方法進行比較。 –
@RobB解析解和橢圓/橢圓弧在大多數情況下不適用。你通常能做的最好的事情就是針對不同偏心度的可疑錯誤進行一些近似... – Spektre
情況並非如此 - 我鏈接的pdf給出了一種分析方法(儘管在混合中引入了根發現近似)。正因如此,我希望能夠比較二分法,給予足夠的時間:) –