二次贝塞尔曲线插值

3

我希望得到一些AS2代码,以插值二次贝塞尔曲线。节点应该保持彼此间的距离恒定。基本上是让一个球沿着由3个点定义的非双曲二次贝塞尔曲线以恒定的速度动画化。

谢谢!


我已经看过一些复杂的数学内容,但它涉及到积分,而我不知道如何在AS2中进行。 - user132295
3个回答

6

贝塞尔曲线的数学公式非常简单,我会帮助你理解它,然后你可以将其翻译成ActionScript。

一个二维的二次贝塞尔曲线由三个(x,y)坐标定义。我将它们命名为P0 = (x0,y0), P1 = (x1,y1)P2 = (x2,y2)。此外,参数值t用于指定曲线上的任意位置,该值范围从01。所有的x,yt变量都是实数(浮点数)。

二次贝塞尔曲线的方程为:

P(t) = P0*(1-t)^2 + P1*2*(1-t)*t + P2*t^2

因此,使用伪代码,我们可以像这样平滑地跟踪贝塞尔曲线:
for i = 0 to step_count
    t = i / step_count
    u = 1 - t
    P = P0*u*u + P1*2*u*t + P2*t*t
    draw_ball_at_position( P )

假设您已经按上述定义了点P0P1P2。如果您均匀分布控制点,则应沿曲线获得漂亮的均匀步骤。只需将step_count定义为您想要看到的曲线上的步数即可。


1

Naaff提出的解决方案是P(t) = P0*(1-t)^2 + P1*2*(1-t)*t + P2*t^2,这将为您提供正确的“形状”,但在[0:1]区间中选择均匀间隔的t将不会产生均匀间隔的P(t)。换句话说,速度不是恒定的(您可以对先前的方程式关于t进行微分来查看它)。

通常,以恒定速度遍历参数曲线的常见方法是通过弧长重新参数化。这意味着将P表示为P(s),其中s是沿着曲线遍历的长度。显然,s从零变化到曲线的总长度。对于二次贝塞尔曲线,有一个封闭形式的解来表示弧长作为t的函数,但它有点复杂。在计算上,使用您喜欢的方法进行数值积分通常更快。但请注意,这个想法是计算反向关系,即t(s),以便将P表示为P(t(s))。然后,选择均匀间隔的s将产生均匀间隔的P

1
请注意数学上可以更有效率地完成表达式。
P(t) = P0*(1-t)^2 + P1*2*(1-t)*t + P2*t^2

P = P0*u*u + P1*2*u*t + P2*t*t

两个式子都包含了乘法,可以简化。

例如:

C = A*t + B(1-t) = A*t + B - B*t = t*(A-B) + B = 你省去了一次乘法 = 性能翻倍。


4
虽然可能可以节省一些计算,但伯恩斯坦基础是本质上更加数值稳定的。因此,如果精度是一个关注点,多项式应该被重新组织。诚然,在制作动画时这并不重要,但在CAD软件中却非常重要。 - Naaff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接