3 回答

TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個(gè)贊
多邊形化數(shù)據(jù)
找到點(diǎn)的順序,這樣你就可以找到彼此最近的點(diǎn),并嘗試連接“按線”。避免回到原點(diǎn)
計(jì)算沿路徑的推導(dǎo)
它是“線”的方向變化,你達(dá)到局部最小值或最大值就有你的控制點(diǎn)......這樣做是為了減少輸入數(shù)據(jù)(只留下控制點(diǎn))。
曲線
現(xiàn)在使用這些點(diǎn)作為控制點(diǎn)。我強(qiáng)烈建議兩者的插值多項(xiàng)式x和y單獨(dú)的插值多項(xiàng)式,例如:
x=a0+a1*t+a2*t*t+a3*t*t*t
y=b0+b1*t+b2*t*t+b3*t*t*t
在哪里a0..a3計(jì)算如下:
d1=0.5*(p2.x-p0.x);
d2=0.5*(p3.x-p1.x);
a0=p1.x;
a1=d1;
a2=(3.0*(p2.x-p1.x))-(2.0*d1)-d2;
a3=d1+d2+(2.0*(-p2.x+p1.x));
b0 .. b3 以相同的方式計(jì)算,但當(dāng)然使用y坐標(biāo)
p0..p3 是三次插值曲線的控制點(diǎn)
t =<0.0,1.0>是曲線參數(shù)從。p1到p2
這確保了位置和第一次推導(dǎo)是連續(xù)的(c1),你也可以使用BEZIER,但它不會(huì)像這樣好。
[edit1]過(guò)于尖銳的邊緣是一個(gè)很大的問(wèn)題
要解決此問(wèn)題,您可以在獲取控制點(diǎn)之前從數(shù)據(jù)集中刪除點(diǎn)。我現(xiàn)在可以想到兩種方法:選擇對(duì)你更好的方法
從第一個(gè)推導(dǎo)過(guò)高的數(shù)據(jù)集中刪除點(diǎn)
dx/dl或者坐標(biāo)dy/dl在哪里x,y,l是曲線長(zhǎng)度(沿著它的路徑)。從曲線推導(dǎo)精確計(jì)算曲率半徑是棘手的
從數(shù)據(jù)集中刪除導(dǎo)致曲率半徑太小的點(diǎn)
計(jì)算相鄰線段(黑線)中點(diǎn)的交點(diǎn)。像圖像上的垂直軸(紅線)它的距離和連接點(diǎn)(藍(lán)線)是曲率半徑。當(dāng)曲率半徑小時(shí),你的極限移除那個(gè)點(diǎn)......
曲率半徑
現(xiàn)在,如果你真的只需要BEZIER立方體,那么你可以將我的插值立方體轉(zhuǎn)換為BEZIER立方體,如下所示:
// ---------------------------------------------------------------------------
// x=cx[0]+(t*cx[1])+(tt*cx[2])+(ttt*cx[3]); // cubic x=f(t), t = <0,1>
// ---------------------------------------------------------------------------
// cubic matrix bz4 = it4
// ---------------------------------------------------------------------------
// cx[0]= ( x0) = ( X1)
// cx[1]= (3.0*x1)-(3.0*x0) = (0.5*X2) -(0.5*X0)
// cx[2]= (3.0*x2)-(6.0*x1)+(3.0*x0) = -(0.5*X3)+(2.0*X2)-(2.5*X1)+( X0)
// cx[3]= ( x3)-(3.0*x2)+(3.0*x1)-( x0) = (0.5*X3)-(1.5*X2)+(1.5*X1)-(0.5*X0)
// ---------------------------------------------------------------------------
const double m=1.0/6.0;
double x0,y0,x1,y1,x2,y2,x3,y3;
x0 = X1; y0 = Y1;
x1 = X1-(X0-X2)*m; y1 = Y1-(Y0-Y2)*m;
x2 = X2+(X1-X3)*m; y2 = Y2+(Y1-Y3)*m;
x3 = X2; y3 = Y2;

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
我不認(rèn)為它回答了我的問(wèn)題。為了使我的問(wèn)題更清楚,我添加了另一個(gè)圖形示例。更確切地說(shuō),我不認(rèn)為你的解決方案可以遵守曲率約束,因?yàn)樗x擇路徑的點(diǎn)作為曲線的控制點(diǎn)。我的例子表明,對(duì)于一些非常尖的路徑,有必要選擇除輸入路徑之外的控制點(diǎn)。
添加回答
舉報(bào)