在Delphi / Lazarus中绘制二次方程

时间:2014-12-06 01:14:39

标签: delphi animation math quadratic

我正在尝试使用二次方程对对象的位置进行动画处理以获得快速启动 - 慢速停止类型的移动。

Delphi XE6已经提供了这个功能,但我使用的是Delphi XE2和Lazarus,我创建了自己的动画处理系统,实际上非常有用。

我已经有了线性公式和半正窦公式,但现在我想要一个二次公式。

半窦公式实际上确实在开始时快速移动我的物体然后减速,但我想要一个更加夸张的曲线,它在开始时非常快速,然后很快减速并最终停止。

不幸的是,我没有可用的代码,因为它是我正在寻找的代码。

我曾经使用我们亲爱的朋友谷歌,但没有运气找到我能理解的任何信息。

基本上需要的是一个公式,它给出一个从0到1的浮点数rangin。

然后我接受需要移动的对象位置的增量并将其乘以所需的公式。

在我的动画系统中,我有两个关于动画过程的值:

var CurrentPos, Resolution: single;

值“CurrentPos”表示公式的位置。 例如,对于Sinus,我可以将“CurrentPos”应用为绘图的角度或X轴, 并且“分辨率”将是X轴上的最大角度(360度)或整个绘图视图。

我目前为二次方程找到的当前公式如下:

formula := (-b+(Sqr(Power10(b, 2)-4*(a*c))))/(2*a);

我在该公式中的哪个位置加上“CurrentPos”的值?

或者是真正的问题,我是否完全错误地完成了整个数学过程?

1 个答案:

答案 0 :(得分:1)

您想要一个未知的 x 中的等式:

  1. x 中的二次方。
  2. x = 0 时,其值 0
  3. x = 1 时,其值 1
  4. x 接近 0 时快速变化,当 x 接近 1 时不会快速变化。
  5. 因此,你的二次方可以是这样的形式: 1 - (1-x) 2

    x = 1 时, x = 1 2 x

    您需要将输入变量转换为 0 1 的范围。完成后,将其作为 x 添加到上面的公式中。

    如果你想使用不同的指数,你可以简单地替换指数。例如,立方体版本将是: 1 - (1-x) 3

    在代码中你可以这样写:

    function OutPoly(x: Real, exponent: Integer): Real;
    begin
      Result := 1 - IntPower(1-x, exponent);
    end;