我想在AS2中获得一些代码来插值二次贝塞尔曲线。节点意味着彼此之间保持恒定的距离。基本上它是沿着由3点定义的非双曲线二次贝塞尔曲线以恒定速度对球进行动画制作。 谢谢!
答案 0 :(得分:5)
Bezier曲线数学非常简单,所以我会帮你解决这个问题,你可以把它翻译成ActionScript。
2D二次贝塞尔曲线由三个(x,y)
坐标定义。我将这些称为P0 = (x0,y0)
,P1 = (x1,y1)
和P2 = (x2,y2)
。此外,参数值t
(范围从0
到1
)用于指示沿曲线的任何位置。所有x
,y
和t
变量都是实值(浮点数)。
二次贝塞尔曲线的等式是:
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 )
这假定您已经如上所述定义了点P0
,P1
和P2
。如果你将控制点均匀分布,那么你应该沿曲线走得很好。只需将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
。