我有一个描述为(startX,startY)到(anchorX,anchorY)的二次贝塞尔曲线,并使用一个控制点(controlX,controlY)。
我有两个问题:
(1)我想基于x点确定该曲线上的y点。
(2)然后,给定贝塞尔曲线上的线段(由贝塞尔曲线上的两个中间点定义(startX’,startY’,anchorX’,anchorY’)),我想知道该线段的控制点使其与原始贝塞尔曲线完全重叠。
为什么?我需要这些信息以进行优化。我正在绘制许多水平贝塞尔曲线。当贝塞尔曲线大于屏幕时,性能会受到影响,因为渲染引擎最终会渲染超出可见范围的渲染。这个问题的答案将使我仅呈现可见的内容。
二次贝塞尔曲线的公式为:
**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)的其他分量。
您可以仅将参数参数的域限制为[0,1]的适当子区间,而不是生成与第一条曲线的一部分重合的第二条Bezier曲线(我现在不喜欢对符号进行运算)。也就是说,使用第1部分来找到x的两个不同值的t值;将这些t值称为i和j。为t∈[i,j] 绘制 B (t)。等效地,为t∈[0,1] 绘制 B (t(ji)+ i)。