如何将curveTo()转换为Points列表?

Mar*_*rty 10 math actionscript-3

使用以下AS3绘制曲线curveTo():

var line:Shape = new Shape();

line.x = line.y = 20;
line.graphics.lineStyle(2, 0xFF0000);
line.graphics.curveTo(200, 200, 200, 0);

addChild(line);
Run Code Online (Sandbox Code Playgroud)

由此产生的视觉效果是

在此输入图像描述

现在我想要一些能够遵循这条道路的东西; 如何将此视觉转换为坐标列表?我努力学习任何高级数学,但我假设有一个明显的(某些)公式curveTo()用于创建上面的我可以复制和修改以创建我想要的列表.

结果可能看起来像这样(假设点之间的偏移约为5px).

Vector.<Point> = [
    new Point(20, 20),
    new Point(23, 23),
    new Point(27, 28),
    new Point(33, 32),
    new Point(40, 37)
    /* ...etc... */
];
Run Code Online (Sandbox Code Playgroud)

结果将用于诸如创建遵循以下路径的射弹雨的事物,例如:

在此输入图像描述

kap*_*aki 14

通过阅读actionscript文档,我了解到动作脚本中的curveTo方法会生成二次贝塞尔曲线.

曲线由您在代码中指定的三个"控制点"组成:

control point 1 (p1) = (20,20)
control point 2 (p2) = (200,200)
control point 3 (p3) = (200,0)
Run Code Online (Sandbox Code Playgroud)

要沿着曲线在0到1范围内的值u内插值(0为起点,1为终点),可以使用所谓的Bernstein多项式.对于二次曲线(您的情况),多项式是:

B1 = (1 - u) * (1 - u)
B2 = 2 * u * (1 - u)
B3 = u * u
Run Code Online (Sandbox Code Playgroud)

只需计算参数值u的这些数字,并将控制点加上相应的Bernstein多项式.

point on curve at parameter *u* = p1 * B1 + p2 * b2 + p3 * B3
Run Code Online (Sandbox Code Playgroud)

因此,例如,如果要沿曲线获得5个点,则可以在参数值0,0.25,0.5,0.75和1.0处计算曲线上的点

  • 我喜欢你在同一句话中随便使用"简单"和"多项式"的方式! (5认同)