Animation 二次贝塞尔插值
我想在AS2中获得一些代码来插值二次贝塞尔曲线。节点之间的距离是恒定的。基本上,它是沿着由3点定义的非双曲二次贝塞尔曲线以恒定速度为球设置动画。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) =
谢谢 贝塞尔曲线数学非常简单,所以我会帮你解决这个问题,你可以把它转换成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