Python 沿椭圆路径将对象移动设定的距离

Python 沿椭圆路径将对象移动设定的距离,python,python-3.x,math,artificial-intelligence,game-development,Python,Python 3.x,Math,Artificial Intelligence,Game Development,我希望能创造出优雅的人工智能。为了计算拐角处的路径,我有一组2d点开始和结束,它们只作为90度角对存在,如下图所示 每个点都位于椭圆的“北”、“南”、“东”或“西”大部分,我可以沿着这些点推断椭圆长轴和短轴的a和b值 模拟在网格上播放,因此椭圆永远不会旋转——长轴和短轴将与x轴和y轴平行 将点沿椭圆移动一个角度很简单: x = x + (a * math.cos(angle)) # where a is major axis y = y + (b * math.cos(angle)) #

我希望能创造出优雅的人工智能。为了计算拐角处的路径,我有一组2d点
开始
结束
,它们只作为90度角对存在,如下图所示

每个点都位于椭圆的“北”、“南”、“东”或“西”大部分,我可以沿着这些点推断椭圆长轴和短轴的
a
b

模拟在网格上播放,因此椭圆永远不会旋转——长轴和短轴将与x轴和y轴平行

将点沿椭圆移动一个角度很简单:

x = x + (a * math.cos(angle))  # where a is major axis
y = y + (b * math.cos(angle))  # where b is minor axis
但是,我想控制AI穿过椭圆上两点之间的圆弧的速度,并最终使它们停在
结束
位置

最后,我需要计算以下各项:

  • 沿椭圆的
    开始
    结束
    之间的
    剩余距离
  • 跨椭圆移动
    距离后点的新位置
  • 问题:

  • 是否有用于计算上述内容的通用工具/解决方案
  • 在AI、gamedev或其他实践中是否有更好或更常见的解决方案?例如,我在搜索中看到了贝塞尔曲线
  • 谢谢


    元:

    我在堆栈交换中发现了类似的问题,但没有一个真正适合我的用例,也没有一个通过提供特定于语言的非python解决方案来回答这个问题


    我选择在这里提问,而不是数学堆栈交换,因为我认为对于gamedev和其他编程项目中更常见的相同问题,可能会有其他解决方案。

    很难找到椭圆弧长度,因为没有解析公式,所以移动距离法似乎是错误的。也许角速度(和角速度)对于您的目的来说已经足够了。您提到模拟是在网格上进行的。你所有的椭圆大小都一样吗?在这种情况下,距离和角度之间的关系是固定的,您可以简单地使用查找表和一些线性插值。编辑:椭圆弧长的一般情况似乎并不常见。因此,我将尝试利用这样一个事实,即您可能只处理一组相当有限的不同椭圆,您可以对这些椭圆进行大量预计算。@Justian Meyer注意到,您的“角度”不是中心点和X轴之间的实际角度。它只是椭圆描述的一个参数(有时称为偏心异常)。它可能被用作非常近似的角度,但并不精确,并且看起来不适合精确的物理模拟(当微小的差异可能导致奇怪的行为时)你看过开普勒方程吗?@JustianMeyer看到简单的
    for
    将从
    M
    转换为
    E
    角度。。。但是我觉得你只需要控制从开始速度到结束速度(与重力无关),这可以通过调节椭圆角参数的角增量来实现。。。。但它需要调整以适应弧长…很难找到椭圆弧长,因为没有解析公式,所以旅行距离法似乎是错误的。也许角速度(和角速度)对于您的目的来说已经足够了。您提到模拟是在网格上进行的。你所有的椭圆大小都一样吗?在这种情况下,距离和角度之间的关系是固定的,您可以简单地使用查找表和一些线性插值。编辑:椭圆弧长的一般情况似乎并不常见。因此,我将尝试利用这样一个事实,即您可能只处理一组相当有限的不同椭圆,您可以对这些椭圆进行大量预计算。@Justian Meyer注意到,您的“角度”不是中心点和X轴之间的实际角度。它只是椭圆描述的一个参数(有时称为偏心异常)。它可能被用作非常近似的角度,但并不精确,并且看起来不适合精确的物理模拟(当微小的差异可能导致奇怪的行为时)你看过开普勒方程吗?@JustianMeyer看到简单的
    for
    将从
    M
    转换为
    E
    角度。。。但是我觉得你只需要控制从开始速度到结束速度(与重力无关),这可以通过调节椭圆角参数的角增量来实现。。。。但它需要调整以适应弧长。。。