jed*_*ikb 5 language-agnostic algorithm math geometry bezier
我有一个描述为(startX,startY)到(anchorX,anchorY)并使用控制点(controlX,controlY)的二次贝塞尔曲线.
我有两个问题:
(1)我想根据x点确定该曲线上的y点.
(2)然后,在我的贝塞尔给予线段(由二个中继点我贝塞尔曲线(运行startx" startY",anchorX上定义" anchorY")),我想知道的是线段的控制点这样它就会与原始贝塞尔完全重叠.
为什么?我想要这些信息进行优化.我画了许多水平贝塞尔.当beziers大于屏幕时,性能会受到影响,因为渲染引擎最终渲染超出了可见范围.这个问题的答案将让我只渲染可见的东西.
out*_*tis 13
二次贝塞尔曲线的公式为:
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)
假设存在一个解,则将其插回到原始方程中,以获得给定x处的B(t)的其他分量.
除了产生第二贝塞尔曲线与第一(我不喜欢现在运算符号)的一部分重合,你可以简单地限制你的参数参数域为[0,1]的一个适当的子区间.也就是说,使用第1部分为两个不同的x值找到t的值; 将这些t值称为i和j.绘制B(t)为t∈[i,j].等价地,绘制B(t(ji)+ i)t∈[0,1].