将一个三次贝塞尔曲线p1,p2,p3,p4投影到p1,p4线上。当p2或p3未投影到p1和p4之间的线段上时,曲线将从锚点凸出。有没有办法计算曲线的切线垂直于锚线的T值?
这也可以表示为找到T值,其中投影曲线离线段p1,p4的中心最远。当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 );
在我看过的样本中,t2必须从1.0中减去才能正确。
答案 0 :(得分:1)
假设你得到一条带有P0 = 0
和P3 = 1
的1D立方贝塞尔曲线,那么曲线就是:
P(t) = b0,3(t)*0 + b1,3(t)*P1 + b2,3(t)*P2 + b3,3(t)*1
其中bi,3(t)
是学位3的Bernstein polynomials。然后我们要查找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ézierP0*,P1 *,P2 *,P3 *计算:
P1 = proj(P1*, P03*) / |P3* - P0*|
P2 = proj(P2*, P03*) / |P3* - P0*|
proj(P, P03*)
是P0*
与通过P
和P0*
的广告系列P3*
投影点之间的签名距离。
(我没有检查过,所以请确认我的推理没有错。)