Geometry 计算切线垂直于锚定线的三次贝塞尔T值

Geometry 计算切线垂直于锚定线的三次贝塞尔T值,geometry,bezier,equation,Geometry,Bezier,Equation,将三次贝塞尔曲线p1、p2、p3、p4投影到线p1、p4上。当p2或p3未投影到p1和p4之间的线段上时,曲线将从定位点凸出。当曲线的切线垂直于锚定线时,是否有方法计算T值 这也可以表示为在投影曲线距离线段p1、p4中心最远的位置查找T值。当p2和p3投影到线段上时,解分别为0和1。有一个方程式可以解决更有趣的问题吗 T值似乎仅取决于映射控制点与锚线段的距离 我可以通过完善猜测来确定价值,但我希望有更好的方法 编辑: 从值为x1、y1、…、x4、y4的2d中的p1、…、p4开始,我根据Phili

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

这也可以表示为在投影曲线距离线段p1、p4中心最远的位置查找T值。当p2和p3投影到线段上时,解分别为0和1。有一个方程式可以解决更有趣的问题吗

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

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

编辑:

从值为x1、y1、…、x4、y4的2d中的p1、…、p4开始,我根据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 );

在我观察的样本中,t2必须从1.0中减去才是正确的。

假设你得到了一条1D三次贝塞尔曲线,其中
P0=0
P3=1
,那么曲线是:

P(t) = b0,3(t)*0 + b1,3(t)*P1 + b2,3(t)*P2 + b3,3(t)*1
式中,
bi,3(t)
为3级。然后我们寻找
t
的值,其中
P(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维三次Bézier P0*,P1*,P2*,P3*计算:

P1 = proj(P1*, P03*) / |P3* - P0*|
P2 = proj(P2*, P03*) / |P3* - P0*|
其中
proj(p,P03*)
是从
P0*
到通过
P0*
P3*
的直线上投影的点
p
的有符号距离


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

让我们假设你得到了一条一维三次贝塞尔曲线,其中
P0=0
P3=1
,那么曲线是:

P(t) = b0,3(t)*0 + b1,3(t)*P1 + b2,3(t)*P2 + b3,3(t)*1
式中,
bi,3(t)
为3级。然后我们寻找
t
的值,其中
P(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维三次Bézier P0*,P1*,P2*,P3*计算:

P1 = proj(P1*, P03*) / |P3* - P0*|
P2 = proj(P2*, P03*) / |P3* - P0*|
其中
proj(p,P03*)
是从
P0*
到通过
P0*
P3*
的直线上投影的点
p
的有符号距离


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

你也可以试试你也可以试试sqrt(…P2*2)应该是P2^2谢谢,这是预期的效果。在我的试验中,当从+/-中获得两个有效值时,需要从1.0中减去+结果。有时可能是相反的。它可能来自于您计算
proj()
的方式。它需要是距离
P0*
的有符号距离,这意味着如果它投影到
P0*
的一侧,远离
P3*
它应该是负数。sqrt(…P2*2)应该是P2^2谢谢,这是可以预期的。在我的试验中,当从+/-中获得两个有效值时,需要从1.0中减去+结果。有时可能是相反的。它可能来自于您计算
proj()
的方式。它需要是距离
P0*
的有符号距离,这意味着如果它投影到
P0*
的一侧,远离
P3*
,它应该是负数。