Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何预测船与物体的相遇';s在2D中的影响范围_C#_Algorithm_Math_Collision Detection_Orbital Mechanics - Fatal编程技术网

C# 如何预测船与物体的相遇';s在2D中的影响范围

C# 如何预测船与物体的相遇';s在2D中的影响范围,c#,algorithm,math,collision-detection,orbital-mechanics,C#,Algorithm,Math,Collision Detection,Orbital Mechanics,长时间侦听器,第一次调用。我在XNA做一个小游戏,是关于太空中的运输船,类似于海上的集装箱船。我需要能够在受限的2D环境中预测飞船与行星/卫星之间的相遇。船和行星/月球(简称天体)的位置由以下公式确定。船和物体都在同一个吸引中心轨道上运行 到目前为止,我设计的方法是首先对远点和近点(距离吸引中心最远和最近的点)做一些初步检查,看看是否可能遭遇。在这样的检查之间,如果飞船的轨道是开放的(双曲线,我将抛物线近似为双曲线),它可以排除许多不可能遭遇的情况 如果这些检查确定相遇是可能的,我将确定船只有资

长时间侦听器,第一次调用。我在XNA做一个小游戏,是关于太空中的运输船,类似于海上的集装箱船。我需要能够在受限的2D环境中预测飞船与行星/卫星之间的相遇。船和行星/月球(简称天体)的位置由以下公式确定。船和物体都在同一个吸引中心轨道上运行

到目前为止,我设计的方法是首先对远点和近点(距离吸引中心最远和最近的点)做一些初步检查,看看是否可能遭遇。在这样的检查之间,如果飞船的轨道是开放的(双曲线,我将抛物线近似为双曲线),它可以排除许多不可能遭遇的情况

如果这些检查确定相遇是可能的,我将确定船只有资格遭遇的距离吸引中心的最小和最大距离。然后,我得到船舶轨道与由最小值和最大值定义的两个圆的交点。这会在飞船轨道上产生0、2或4个点,定义了飞船可能遇到球体的0、1或2个周期。在这一点上,如果存在零交点,则可能整个船舶轨道都在相遇区,这可能是一种罕见的极端情况,但需要涵盖

我可以得到飞船在轨道上通过这些点的时间,给一到两个时间窗口来检查是否遭遇,但从那里我最好的解决方案是通过将时间跨度划分为几步来搜索,计算身体在这些时间的位置,然后测试遭遇

这种方法的问题在于,要知道采取何种步骤才能有效地找到遭遇。获得身体的位置在时间上有点昂贵,所以我宁愿尽可能少地做,但步子太大可能会错过这次相遇


共焦圆锥形状是否有助于减少搜索空间?或者是否有其他方法可以预测沿圆锥路径移动的点与沿共享焦点的椭圆移动的圆之间的相遇/碰撞。

使用径向碰撞检测(圆),其中一个圆表示行星的重力影响(将大于行星本身),为每艘船创建另一个圆,并使每个圆的中心点沿直线相互移动,随着距离的减小,移动幅度非常小

将每个圆圈的拉力大小应用于每艘船的移动速度。运动只需要简单的三角,cos()代表x,sin()代表y,不需要任何更复杂的数学。如果任意两个对象之间的距离小于其半径之和,则发生碰撞


但是,当在“重力圈”上进行这种形式的碰撞时,也就是说,当它们碰撞时,你可以在每次迭代中将船的速度增加一小部分,以模拟重力的拉力。

你可以尝试构造一个函数,将行星和船之间的距离(平方)描述为时间的函数,使用通常的毕达哥拉斯距离表达式。您正在查找此函数的零,因此可以应用或类似方法来查找它们

如果行星的运动速度比飞船慢得多,那么这个函数就会相对平滑,牛顿的方法也不会有收敛的困难。然而,如果行星的运动速度比飞船快得多,那么这个距离函数将上下反弹,就像叠加在抛物线状曲线上的“弹簧”,并可能与x轴相交几次。牛顿方法在处理此类函数时会遇到麻烦,因为导数的方向变化很快


希望在构造距离函数时,某些项会被抵消,或者表达式可以以其他方式简化或近似,但如果不能,则可以在垂直和水平方向上查找零。(事实上,你可以选择沿任何轴的距离——例如行星轨道的长轴。)这些函数中的零都是碰撞的必要条件,但不是充分条件,并且可能更容易计算。如果你有一个按时间排序的x方向零列表,y方向零列表也是如此,你可以通过列表合并(la mergesort)计算它们的交集来找到任何真正的碰撞。

因为这还没有得到公认的答案,而且我没有看到下面的计算,我将添加这些计算,以期对某人有所帮助。 我还没有弄清楚如何获得约会时间,但我已经弄清楚了如何获得角度。 如果您知道角度,这将获得轨道天体和soi(或船舶)之间的距离:

public static double RadiusAtAngle(double angle, double semiLatusRectum, double eccentricity)
{
    return semiLatusRectum / (1 + eccentricity * Math.Cos(angle)); 
}
更重要的是,如果您知道半乳直肠和偏心率(此处的半径是身体到soi边缘的距离),翻转该计算将获得到soi边缘的角度:

作为参考,半乳直肠可从半乳轴和偏心率中找到:

public static double SemiLatusRectum(double SemiMajorAxis, double eccentricity)
{
    if (eccentricity == 0)//ie a circle 
        return SemiMajorAxis;
    return SemiMajorAxis * (1 - eccentricity * eccentricity);
}

请注意,这些计算也适用于双曲线轨迹

既然你说的是重力和旋转,你应该看看Osmos。我已经玩了一些,特别是(其中一个)球体围绕中心旋转的关卡。这很好,一个有趣的游戏。我试图在Kerbal空间计划中创建类似于修补圆锥预测器的东西,但是在受限的2D环境中。您当前使用的是欧拉积分,这对于大多数应用程序来说都很好,假设时间步长足够小。我猜你的问题是:考虑到船的轨迹遵循一个已知的几何形状,我们能通过分析确定与另一个已知几何形状的交点吗?具体来说,共焦co
public static double SemiLatusRectum(double SemiMajorAxis, double eccentricity)
{
    if (eccentricity == 0)//ie a circle 
        return SemiMajorAxis;
    return SemiMajorAxis * (1 - eccentricity * eccentricity);
}