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条经验 获得超7个赞
我不认为它回答了我的问题。为了使我的问题更清楚,我添加了另一个图形示例。更确切地说,我不认为你的解决方案可以遵守曲率约束,因为它选择路径的点作为曲线的控制点。我的例子表明,对于一些非常尖的路径,有必要选择除输入路径之外的控制点。
添加回答
举报