我有一个描述为(startX,startY)到(anchorX,anchorY)并使用控制点(controlX,controlY)的二次贝塞尔曲线。
我有两个问题:
(1)我想根据x点确定该曲线上的y点。
(2)然后,在我的bezier上给出一个线段(由我的bezier曲线上的两个中间点定义(startX',startY',anchorX',anchorY')),我想知道控制点线段,使其与原始贝塞尔完全重叠。
为什么呢?我想要这些信息进行优化。我画了许多水平贝塞尔。当beziers大于屏幕时,性能会受到影响,因为渲染引擎最终渲染超出了可见范围。这个问题的答案将让我只渲染可见的内容。
答案 0 :(得分: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
其中粗体表示矢量。在给出 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)的其他分量。
您可以简单地将参数参数的域限制为[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