您可以轻松地将 BEZIER 三次控制点转换为插值三次。只需将其反转:
所以:
/* bezier = interpol
1 | ( x0)=X1;
t | (3.0*x1)-(3.0*x0)=(0.5*(X2-X0));
tt | (3.0*x2)-(6.0*x1)+(3.0*x0)=(3.0*(X2-X1))-(X2-X0)-(0.5*(X3-X1));
ttt|( x3)-(3.0*x2)+(3.0*x1)-( x0)=(0.5*(X2-X0))+(0.5*(X3-X1))+(2.0*(-X2+X1));
1 | ( y0)=Y1;
t | (3.0*y1)-(3.0*y0)=(0.5*(Y2-Y0));
tt | (3.0*y2)-(6.0*y1)+(3.0*y0)=(3.0*(Y2-Y1))-(Y2-Y0)-(0.5*(Y3-Y1));
ttt|( y3)-(3.0*y2)+(3.0*y1)-( y0)=(0.5*(Y2-Y0))+(0.5*(Y3-Y1))+(2.0*(-Y2+Y1));
*/
// input: x0,y0,..x3,y3 ... Bezier control points
// output: X0,Y0,..X3,Y3 ... interpolation control points
double x0,y0,x1,y1,x2,y2,x3,y3,m=1.0/9.0;
X0=x0-(x1-x0)/m; Y0=y0-(y1-y0)/m;
X1=x0; Y1=y0;
X2=x3; Y2=y3;
X3=x3+(x3-x2)/m; Y3=y3+(y3-y2)/m;
希望我没有犯任何代数错误。这会将所有控制点直接移动到您的曲线中,而形状将保持不变。请注意,对于 BBOX 计算,您应该只使用 (X1,Y1) 和 (X2,Y2),因为使用的参数 t=<0,1> 在它们之间进行插值!!!。
但即使这样也可能会导致不准确,因为您可能会遇到一些没有控制点的极端情况。如果这是一个问题(BBOX 比应该的小一点),您可以通过一些步骤(0.1)重新对曲线上的点集(例如每立方 10 个)进行形状采样并执行 BBOX从那些点。这将更精确但较粗略...