1

将三次贝塞尔曲线 p1,p2,p3,p4 投影到线 p1,p4 上。当 p2 或 p3 没有投影到 p1 和 p4 之间的线段上时,曲线将从锚点凸出。有没有办法计算曲线的切线垂直于锚线的T值?

这也可以说是找到投影曲线离线段 p1、p4 中心最远的 T 值。当 p2 和 p3 投影到线段上时,解分别为 0 和 1。是否有一个方程可以解决更有趣的情况?

T 值似乎仅取决于映射的控制点与锚线段的距离。

我可以通过改进猜测来确定价值,但我希望有更好的方法。

编辑:

从 2d 中的 p1,..,p4 开始,值为 x1,y1, ..., x4,y4 我根据 Philippe 的回答使用以下代码:

dx = x4 - x1;
dy = y4 - y1;
d2 = dx*dx + dy*dy;
p1 = ( (x2-x1)*dx + (y2-y1)*dy ) / d2;
p2 = ( (x3-x1)*dx + (y3-y1)*dy ) / d2;
tr = sqrt( p1*p1 - p1*p2 - p1 + p2*p2 );
t1 = ( 2*p1 - p2 - tr ) / ( 3*p1 - 3*p2 + 1 );
t2 = ( 2*p1 - p2 + tr ) / ( 3*p1 - 3*p2 + 1 );

在我查看的示例中,必须从 1.0 中减去 t2 才能正确。

4

1 回答 1

1

假设你有一个一维三次贝塞尔曲线,P0 = 0然后P3 = 1曲线是:

P(t) = b0,3(t)*0 + b1,3(t)*P1 + b2,3(t)*P2 + b3,3(t)*1

3 次Bernstein 多项式在哪里。然后我们bi,3(t)正在寻找最小和最大的值,因此我们得出:tP(t)

P'(t) = b1,3'(t)*P1 + b2,3'(t)*P2 + b3,3'(t)
      = (3 - 12t + 9t^2)*P1 + (6t - 9t^2)*P2 + 3t^2
      = 0

这有一个封闭形式但非平凡的解决方案。根据 WolframAlpha 的说法,当3P1 - 3P2 +1 != 0它是:

t = [2*P1 - P2 +/- sqrt(P1^2-P1*P2-P1+P2^2)] / (3*P1 - 3*P2 + 1)

否则是:

t = 3P1 / (6P1 - 2)

对于一般的 n 维三次贝塞尔 P0*、P1*、P2*、P3* 计算:

P1 = proj(P1*, P03*) / |P3* - P0*|
P2 = proj(P2*, P03*) / |P3* - P0*|

哪里是从到投影在通过和的线上的点proj(P, P03*)的有符号距离。P0*PP0*P3*

(我没有检查这个,所以请确认我的推理没有错。)

于 2010-04-20T05:42:04.053 回答