代码之家  ›  专栏  ›  技术社区  ›  drawnonward

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

  •  1
  • drawnonward  · 技术社区  · 15 年前

    这也可以表示为在投影曲线距离线段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 );
    

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

    1 回复  |  直到 15 年前
        1
  •  1
  •   Philippe Beaudoin    15 年前

    假设有一条1D立方Bzier曲线 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) 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
    

    这有一个封闭的形式,但非平凡的解决方案。据沃尔夫拉马尔法说,什么时候 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维立方Bzier P0*,P1*,P2*,P3*计算:

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

    proj(P, P03*) P0* 切中要害 P P3* .

    推荐文章