Animation 二次贝塞尔插值

Animation 二次贝塞尔插值,animation,actionscript-2,bezier,Animation,Actionscript 2,Bezier,我想在AS2中获得一些代码来插值二次贝塞尔曲线。节点之间的距离是恒定的。基本上,它是沿着由3点定义的非双曲二次贝塞尔曲线以恒定速度为球设置动画。 谢谢 贝塞尔曲线数学非常简单,所以我会帮你解决这个问题,你可以把它转换成ActionScript 二维二次贝塞尔曲线由三个(x,y)坐标定义。我将把它们称为P0=(x0,y0),P1=(x1,y1)和P2=(x2,y2)。此外,参数值t,范围从0到1,用于指示曲线上的任何位置。所有x、y和t变量均为实值(浮点) 二次贝塞尔曲线的方程式为: P(t) =

我想在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定义为您希望看到的沿曲线的步数。

请注意,该表达式可以在数学上更有效地完成

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

两者都有可以简化的t乘法

例如:


C=A*t+B(1-t)=A*t+B-B*t=t*(A-B)+B
=您保存了一次乘法=双重性能。

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

我已经看到了一些复杂的数学知识,但它涉及到积分,我不知道如何在AS2中进行积分。虽然可以节省一些乘法,但伯恩斯坦基在数值上更稳定。因此,如果需要考虑精度,则不应重新组织多项式。诚然,这对设置球的动画没有多大影响,但这在CAD软件包中是一件大事。
P = P0*u*u + P1*2*u*t + P2*t*t