二次贝塞尔插值

时间:2009-07-02 13:39:11

标签: animation actionscript-2 bezier

我想在AS2中获得一些代码来插值二次贝塞尔曲线。节点意味着彼此之间保持恒定的距离。基本上它是沿着由3点定义的非双曲线二次贝塞尔曲线以恒定速度对球进行动画制作。 谢谢!

3 个答案:

答案 0 :(得分:5)

Bezier曲线数学非常简单,所以我会帮你解决这个问题,你可以把它翻译成ActionScript。

2D二次贝塞尔曲线由三个(x,y)坐标定义。我将这些称为P0 = (x0,y0)P1 = (x1,y1)P2 = (x2,y2)。此外,参数值t(范围从01)用于指示沿曲线的任何位置。所有xyt变量都是实值(浮点数)。

二次贝塞尔曲线的等式是:

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 :(得分: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

都保持t乘法,这可以简化。

例如:

C = A*t + B(1-t) = A*t + B - B*t = t*(A-B) + B =您保存了一个乘法=双重演奏。

答案 2 :(得分:1)

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

通常,以恒定速度遍历参数曲线的常用方法是通过弧长重新参数化。这意味着将P表示为P(s),其中s是沿曲线遍历的长度。显然,s从零到曲线的总长度不等。在二次贝塞尔曲线的情况下,作为t的函数,弧长的闭合形式解决方案,但它有点复杂。在计算上,使用您喜欢的方法以数字方式集成通常会更快。但请注意,这个想法是计算反向关系,即t(s),以便将P表示为P(t(s))。然后,选择均匀间隔s将产生均匀空间P