代码之家  ›  专栏  ›  技术社区  ›  jedierikb grijalvaromero

二次贝塞尔曲线分段定义参数的计算

  •  5
  • jedierikb grijalvaromero  · 技术社区  · 15 年前

    我有一条二次贝塞尔曲线,描述为(startx,starty)到(anchorx,anchory)并使用控制点(controlx,controly)。

    我有两个问题:

    (1)我想根据X点确定曲线上的Y点。

    (2)然后,给定贝塞尔曲线上的一个线段(由贝塞尔曲线上的两个中间点(startx'、starty'、anchorx'、anchory')定义),我想知道该线段的控制点,以便它与原始贝塞尔曲线完全重叠。

    为什么?我需要这些信息进行优化。我画了很多水平边框。当Bezier大于屏幕时,性能会受到影响,因为渲染引擎的渲染结果超出了可见范围。这个问题的答案会让我呈现出可见的东西。

    2 回复  |  直到 7 年前
        1
  •  13
  •   outis    12 年前

    第1部分

    二次贝塞尔曲线的公式是:

    B(t) = a(1-t)2    + 2bt(1-t)   + ct2
         = a(1-2t+t2) + 2bt - 2bt2 + ct2
         = (a-2b+c)t2+2(b-a)t + a

    其中,粗体表示矢量。用 X (t)鉴于,我们已经:

    x = (ax-2bx+cx)t2+2(bx-ax)t + ax

    哪里 V X 是的X分量 V .

    根据二次公式,

         -2(bx-ax) ± 2√((bx-ax)2 - ax(ax-2bx+cx))
    t = -----------------------------------------
                 (2ax(ax-2bx+cx))
    
         ax-bx ± √(bx2 - axcx)
      = ----------------------
             ax(ax-2bx+cx)

    假设存在一个解,把这个t代入原始方程,得到 (t)在给定的x处。

    第2部分

    与其生成与第一部分重合的第二个贝塞尔曲线(我现在不想处理符号),不如简单地将参数参数的域限制为适当的子区间[0,1]。也就是说,使用第1部分来查找x的两个不同值的t值;调用这些t值i和j。 (t)对于t_[i,j]。等价地,画 (t(j-i)+i)对于t[0,1]。

        2
  •  1
  •   Alex Arm.    7 年前

    t方程是错误的,你需要用公式(1)

    (1) x = (ax-2bx+cx)t2+2(bx-ax)t + ax
    

    并用根的二次公式(2)求解。

               -b ± √(b^2 - 4ac)
      (2)  x = -----------------
                  2a
    

    在哪里?

    a = ax-2bx+cx
    b = 2(bx-ax)
    c = ax - x
    
    推荐文章