小编典典

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

algorithm

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

我有两个问题:

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

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

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


阅读 471

收藏
2020-07-28

共1个答案

小编典典

第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**

其中粗体表示向量。随着 X给出(T),我们有:

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

其中 v X是的x分量 v

根据二次方程式

     -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]的适当子区间,而不是生成与第一条曲线的一部分重合的第二条Bezier曲线(我现在不喜欢对符号进行运算)。也就是说,使用第1部分来找到x的两个不同值的t值;将这些t值称为i和j。为t∈[i,j]
绘制 B (t)。等效地,为t∈[0,1] 绘制 B (t(ji)+ i)。

2020-07-28