我希望得到一些AS2代码,以插值二次贝塞尔曲线。节点应该保持彼此间的距离恒定。基本上是让一个球沿着由3个点定义的非双曲二次贝塞尔曲线以恒定的速度动画化。
谢谢!我希望得到一些AS2代码,以插值二次贝塞尔曲线。节点应该保持彼此间的距离恒定。基本上是让一个球沿着由3个点定义的非双曲二次贝塞尔曲线以恒定的速度动画化。
谢谢!贝塞尔曲线的数学公式非常简单,我会帮助你理解它,然后你可以将其翻译成ActionScript。
一个二维的二次贝塞尔曲线由三个(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定义为您想要看到的曲线上的步数即可。
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
。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
= 你省去了一次乘法 = 性能翻倍。