gpt4 book ai didi

数学:使用带时间限制的 Hermite 曲线缓入、缓出置换

转载 作者:行者123 更新时间:2023-12-04 00:09:21 34 4
gpt4 key购买 nike

我正在尝试编写一种方法,随着时间的推移使用开始时的加速和结束时的减速(缓出/缓入)从 0 到 x(一维对象的位置)进行插值,唯一的约束是 提供总时间 ,以及 加减速持续时间 .运动应该复制惯性效应,我正在考虑 Hermite curve对于非线性部分。

double Interpolate(
double timeToAccel, double timeCruising, double timeToDecel,
double finalPosition,
double currentTime)
{
//...
}

有人可以指出我这样做的一部分代码吗?我不知道如何对 Hermite 曲线进行积分,因此不知道我会在加速部分或减速部分移动多少,反过来我无法弄清楚线性中的速度是多少部分。

谢谢。

Some reference来说明我的问题。

编辑:
  • 开始和结束速度为空,当前时间也是方法中的参数的一部分,我更新了签名。
  • 基本上这个想法是想象在距离 d 上以恒定速度移动,这给出了总持续时间。然后我们添加加速和减速阶段,同时保持相同的持续时间,因此我们有一个未知的新巡航速度需要确定(因为我们在 Hermite 阶段的移动比在它们所取代的线性阶段中移动的要少)。与相同持续时间的线性移动相比,在 Hermite 阶段损失的移动量可能是曲线中顶部和底部区域之间的比率,这只是非专家的想法。

  • 编辑:Roman 和 Bob10 提供了完整的工作解决方案。我实现了罗马的代码。谢谢你们,伙计们!感谢您的完美支持和详细的解决方案,您为我节省了长时间的搜索和试用。

    最佳答案

    首先,让我们创建一个三次 Hermite 样条函数:

    /*
    t - in interval <0..1>
    p0 - Start position
    p1 - End position
    m0 - Start tangent
    m1 - End tangent
    */
    double CubicHermite(double t, double p0, double p1, double m0, double m1) {
    t2 = t*t;
    t3 = t2*t;
    return (2*t3 - 3*t2 + 1)*p0 + (t3-2*t2+t)*m0 + (-2*t3+3*t2)*p1 + (t3-t2)*m1;
    }

    现在您的任务是计算缓入和缓出部分的 p0、p1、m0 和 m1。让我们添加一些变量,使数学更容易编写:
    double Interpolate(
    double timeToAccel, double timeCruising, double timeToDecel,
    double finalPosition,
    double currentTime) {

    double t1 = timeToAccel;
    double t2 = timeCruising;
    double t3 = timeToDecel;
    double x = finalPosition;
    double t = currentTime;

    我们需要指定物体在停止加速和开始减速时应该在哪里。您可以随意指定这些并仍然产生平滑的运动,但是,我们想要一个有点“自然”的解决方案。

    假设巡航速度为 v .在巡航过程中,物体移动距离 x2 = v * t2 .现在,当物体从 0 加速到速度 v 时,它会移动距离 x1 = v * t1 / 2 .减速相同 x3 = v * t3 / 2 .放在一起:

    x1 + x2 + x3 = x

    v * t1/2 + v * t2 + v * t3/2 = x

    由此我们可以计算出我们的速度和距离:
        double v = x / (t1/2 + t2 + t3/2);
    double x1 = v * t1 / 2;
    double x2 = v * t2;
    double x3 = v * t3 / 2;

    现在我们知道了一切,我们只需将它输入我们的三次 Hermite 样条插值器
        if(t <= t1) {
    // Acceleration
    return CubicHermite(t/t1, 0, x1, 0, v*t1);
    } else if(t <= t1+t2) {
    // Cruising
    return x1 + x2 * (t-t1) / t2;
    } else {
    // Deceleration
    return CubicHermite((t-t1-t2)/t3, x1+x2, x, v*t3, 0);
    }
    }

    我在 Excel 中对此进行了测试,这是可以使用的等效 VBA 代码。边界条件有一些被零除,我把这个问题留给读者作为练习

    Public Function CubicHermite(t As Double, p0 As Double, p1 As Double, _
    m0 As Double, m1 As Double) As Double
    t2 = t * t
    t3 = t2 * t
    CubicHermite = (2 * t3 - 3 * t2 + 1) * p0 + _
    (t3 - 2 * t2 + t) * m0 + (-2 * t3 + 3 * t2) * p1 + (t3 - t2) * m1
    End Function

    Public Function Interpolate(t1 As Double, t2 As Double, t3 As Double, _
    x As Double, t As Double) As Double
    Dim x1 As Double, x2 As Double, x3 As Double

    v = x / (t1 / 2 + t2 + t3 / 2)
    x1 = v * t1 / 2
    x2 = v * t2
    x3 = v * t3 / 2

    If (t <= t1) Then
    Interpolate = CubicHermite(t / t1, 0, x1, 0, v*t1)
    ElseIf t <= t1 + t2 Then
    Interpolate = x1 + x2 * (t - t1) / t2
    Else
    Interpolate = CubicHermite((t-t1-t2)/t3, x1+x2, x, v*t3, 0)
    End If
    End Function

    关于数学:使用带时间限制的 Hermite 曲线缓入、缓出置换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3367308/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com