计算用于定义二次贝塞尔曲线子部分的参数

时间:2010-04-16 21:19:51

标签: algorithm language-agnostic math geometry bezier

我有一个描述为(startX,startY)到(anchorX,anchorY)并使用控制点(controlX,controlY)的二次贝塞尔曲线。

我有两个问题:

(1)我想根据x点确定该曲线上的y点。

(2)然后,在我的bezier上给出一个线段(由我的bezier曲线上的两个中间点定义(startX',startY',anchorX',anchorY')),我想知道控制点线段,使其与原始贝塞尔完全重叠。

为什么呢?我想要这些信息进行优化。我画了许多水平贝塞尔。当beziers大于屏幕时,性能会受到影响,因为渲染引擎最终渲染超出了可见范围。这个问题的答案将让我只渲染可见的内容。

2 个答案:

答案 0 :(得分:13)

第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

其中粗体表示矢量。在给出 B x (t)的情况下,我们有:

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

其中 v x v 的x分量。

根据二次公式,

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

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

假设存在一个解决方案,请将其插回到原始等式中,以便在给定的x处获得 B (t)的其他分量。

第2部分

您可以简单地将参数参数的域限制为[0的正确子区间,而不是生成与第一个部分重合的第二条Bezier曲线(我现在感觉不像是处理符号)。 1]。也就是说,使用第1部分为两个不同的x值找到t的值;将这些t值称为i和j。对于t∈[i,j],绘制 B (t)。等价地,为t∈[0,1]绘制 B (t(j-i)+ i)。

答案 1 :(得分:1)

t等式错误,你需要使用eq(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