C# 找到击中移动目标的方向(向移动目标发射子弹)

C# 找到击中移动目标的方向(向移动目标发射子弹),c#,math,trigonometry,algebra,C#,Math,Trigonometry,Algebra,我在stackexchange上阅读了其他几种解决方案,但没有找到解决此问题的直接方法 我有一个源点和目标点。目标具有targetVelocity(速度和方向),震源具有sourceSpeed 我需要一种方法来计算sourceDirection(使用sourceSpeed,它会变成sourceVelocity) 我一直在研究数学,它一定是某种等式,函数有时可能返回false,即子弹无法追上目标,这取决于targetVelocity和sourceSpeed 我目前的解决方案给出了一个方向,但没有考

我在stackexchange上阅读了其他几种解决方案,但没有找到解决此问题的直接方法

我有一个源点目标点。目标具有targetVelocity(速度和方向),震源具有sourceSpeed

我需要一种方法来计算sourceDirection(使用sourceSpeed,它会变成sourceVelocity

我一直在研究数学,它一定是某种等式,函数有时可能返回false,即子弹无法追上目标,这取决于targetVelocitysourceSpeed

我目前的解决方案给出了一个方向,但没有考虑到达目标所需的额外长度,因为它是基于射击时到目标的长度

另外,如果我可以避免Sqrt/规范化,这将对性能有好处,但我正在寻找相当简单/优雅的解决方案

    /// Returns sourceVelocity
    public static Vector2 calcBullet(Vector2 source, float sourceSpeed, Vector2 target, Vector2 targetVelocity)
    {
        var diff = target - source;
        var dist = Vector2.Distance(diff, Vector2.Zero);
        diff += targetVelocity * (dist / sourceSpeed);
        diff.Normalize();
        return diff * sourceSpeed;
    }

答案取决于您希望达到目标所需的时间。试试这两个公式

子弹距离=目标距离+(目标速度*时间)

子弹速度*时间=目标距离+(目标速度*时间)​如果sourceSpeed大于targetSpeed(targetVelocity的大小),则始终至少存在一种解决方案。如果sourceSpeed小于或等于targetSpeed,则可能存在或不存在任何解决方案

您可以通过目标到达目标所需的时间t来参数化目标的路径。您需要解一个等式(结果是二次的),该等式表示子弹到达目标所需的时间(距离(t)/sourceSpeed)与目标到达所需的时间t相等,并且只有非负t的解才有效

distance(t) = magnitude(target + t*targetVelocity - source) 
            = sqrt((target.x-source.x + t*targetVelocity.x)^2 + (target.y-source.y + t*targetVelocity.y)^2)
            = sqrt(quadratic(t))
那么,你想解决这个问题吗

t = sqrt(quadratic(t))/sourceSpeed
t* sourceSpeed = sqrt(quadratic(t))
t^2 * sourceSpeed^2 = quadratic(t)
如果t^2项取消(当目标速度等于源速度时发生),则得到一个线性方程(如果尝试使用二次公式,则会得到除以0的结果)。否则,您将得到一个可以使用二次公式求解的二次方程,尽管您应该在尝试求平方根之前检查判别式b^2-4ac是否为负。如果判别式是否定的,则没有解决方案。只有非负的实解才能让你射中目标


如果有两个积极的实际解决方案,你必须选择一个。一旦你找到了正确的t,t_解的值,你就知道了目标将在哪里,(目标+t_解*目标速度),你可以从源头朝这个方向瞄准。

这是一个简单的线性方程-你的目标在一条线上移动(只需引入时间作为变量)你的源代码也是如此-现在你只需要设置两个线性方程,比如
sourcePoint=sourceOrigin+t*sourceVelo
targetPoint=targetOrigin+t*targetVelo
,然后将它们设置为相等-最后(如果你从组件角度看),你会得到两个包含3个变量的线性方程(
sourceVelo\u x
sourceVelo\u y
t
)你只需要解它们(这应该是非常简单的学校数学)顺便说一句:我刚刚看到你想要保持速度恒定-这样你就可以用另一个来表达
sourceVelo\u?
部分(这将涉及SQRT)-但你仍然应该能够用学校数学来解决这个问题-只有现在你才能得到一个二次公式,并且可以继续使用著名的公式-请至少自己尝试一下,并说出你的问题在哪里;)我不认为它像你说的那么简单,但是,我正在寻找一个射击方向,这也可能是一个不可能的解决方案。我总是可以做一个测试函数,比如说10次迭代,二进制搜索自己得到一个合适的解决方案,但这既难看又昂贵。对于一个恒定速度源(子弹)和恒定速度目标之间的精确碰撞预测,你必须经历两个平方根计算(但它只是每颗子弹一次,而不是每帧一次,因此性能不会受到太大影响)。一个在二次方程中,另一个用于确定撞击时间(通过距离计算)这是我如何实现二次方程的:但它是-非解将只是负的行列式…拿一张纸试一下,但他不知道到达目标的时间,如果他想子弹的速度是恒定的,他不能随意设定。时间可以通过知道其他变量的计算机来计算子弹速度必须大于目标速度,否则你永远无法到达目标。因此,你必须选择一个可以解方程的子弹速度。由于子弹速度可以变化,因此没有一个单一的解。因此答案实际上是沿着一条直线(子弹速度与时间).很有可能以低于目标速度的子弹速度击中目标。在这个问题中,子弹速度是固定的,但方向不是。你必须选择发射恒速子弹的方向。如果你调整子弹速度,你是在解决另一个问题,而不是这里问到的问题。这是我一直在寻找的答案,数学仍然有点难,但是在史蒂夫H林克对原始问题的帮助下,我能够让它正确工作。谢谢!