3 回答

TA貢獻1770條經驗 獲得超3個贊
多邊形化數據
找到點的順序,這樣你就可以找到彼此最近的點,并嘗試連接“按線”。避免回到原點
計算沿路徑的推導
它是“線”的方向變化,你達到局部最小值或最大值就有你的控制點......這樣做是為了減少輸入數據(只留下控制點)。
曲線
現在使用這些點作為控制點。我強烈建議兩者的插值多項式x和y單獨的插值多項式,例如:
x=a0+a1*t+a2*t*t+a3*t*t*t
y=b0+b1*t+b2*t*t+b3*t*t*t
在哪里a0..a3計算如下:
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 以相同的方式計算,但當然使用y坐標
p0..p3 是三次插值曲線的控制點
t =<0.0,1.0>是曲線參數從。p1到p2
這確保了位置和第一次推導是連續的(c1),你也可以使用BEZIER,但它不會像這樣好。
[edit1]過于尖銳的邊緣是一個很大的問題
要解決此問題,您可以在獲取控制點之前從數據集中刪除點。我現在可以想到兩種方法:選擇對你更好的方法
從第一個推導過高的數據集中刪除點
dx/dl或者坐標dy/dl在哪里x,y,l是曲線長度(沿著它的路徑)。從曲線推導精確計算曲率半徑是棘手的
從數據集中刪除導致曲率半徑太小的點
計算相鄰線段(黑線)中點的交點。像圖像上的垂直軸(紅線)它的距離和連接點(藍線)是曲率半徑。當曲率半徑小時,你的極限移除那個點......
曲率半徑
現在,如果你真的只需要BEZIER立方體,那么你可以將我的插值立方體轉換為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貢獻2039條經驗 獲得超8個贊
我不認為它回答了我的問題。為了使我的問題更清楚,我添加了另一個圖形示例。更確切地說,我不認為你的解決方案可以遵守曲率約束,因為它選擇路徑的點作為曲線的控制點。我的例子表明,對于一些非常尖的路徑,有必要選擇除輸入路徑之外的控制點。
添加回答
舉報