5

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

我有两个问题:

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

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

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

4

2 回答 2

13

第1部分

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

B (t) = a (1-t) 2     + 2 b t(1-t) + c t 2 
     = a (1-2t+t 2 ) + 2 b t - 2 b t 2 + c t 2 
     = ( a -2 b + c )t 2 +2( b - a )t + a

其中粗体表示一个向量。给定B x (t),我们有:

x = ( a x -2 b x + c x )t 2 +2( b x - a x )t + a x

其中v x是 v 的 x分量

根据二次公式,

     -2( b x - a x ) ± 2√(( b x - a x ) 2 - a x ( a x -2 b x + c x ))
t = -----------------------------------------
             (2 a x ( a x -2 b x + c x ))
             
     a x - b x ± √( b x 2 - a x c x )
  = ----------
         a x ( a x -2 b x + c x )

假设存在一个解,将 t 代入原始方程,以获得给定 x 处的B (t) 的其他分量。

第2部分

您可以简单地将参数参数的域限制为 [0,1] 的适当子区间,而不是生成与第一条的一部分重合的第二条贝塞尔曲线(我现在不想处理符号)。也就是说,使用第 1 部分来找到两个不同 x 值的 t 值;将这些 t 值称为 i 和 j。为 t ∈ [i,j]画B (t)。等效地,为 t ∈ [0,1] 绘制B (t(ji)+i)。

于 2010-04-16T21:55:55.747 回答
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
于 2017-12-02T22:48:06.153 回答