-4

我之前问过这个问题,由于它不是编程问题而被关闭,这完全是因为我的措辞错误。我希望将其实现到 java 中。我正在创建一个小游戏,我有一个光子鱼雷,它从一艘船上向目标发射。现在,由于鱼雷的速度很慢,如果它们正在移动,船将永远不会击中任何目标,我想解决这个问题。我已经制定了多种理论并绘制了许多数学资料,以找出实现这一目标的最佳方法,最后我得出以下结论:

  1. 我找到了光子鱼雷到达目标所需的时间。
  2. 我发现目标在鱼雷到达的时间内走了多远。
  3. 然后我找到目标的新位置和原船之间的距离。
  4. 这让我有机会使用余弦规则 (​​SSS) 来找出子弹需要发射的轨迹才能有更高的击中机会。

这是一个图表:

我的问题示意图

现在唯一的问题是我需要将线 a 旋转到正确的方向,因为默认情况下它平行于线 c,这会弄乱整个方程。有人能帮忙吗?如果您能想出更好的方法来找到新的职位建议,我们也非常欢迎。我的 java 游戏实体机制的工作原理如下:

  1. 每个实体都有两个控制运动的向量。位置和速度。然而,速度并没有被完全正确地跟踪,因为它不是一个速度和一个方向,为了让事情变得更容易,它是一个 xSpeed 和一个 ySpeed。
  2. 实体每刻都会更新一次,发射鱼雷的船必须在这一刻而不是在多个刻中计算未来的位置。

我问这个问题不要再被关闭了,因为这一次我真的需要将答案实现到Java中。

这是我迄今为止尝试过的数学:

        double dis = level.distanceBetween(photonTargetTop, this);

        double speed = 5;

        double time = dis / speed;

        double d1 = photonTargetTop.velocity.x * time;
        double d2 = photonTargetTop.velocity.y * time;

        double dis2 = level.distanceBetween(this, photonTargetTop.pos.x + d1, photonTargetTop.pos.y + d2);

        double dis3 = level.distanceBetween(photonTargetTop, photonTargetTop.pos.x + d1, photonTargetTop.pos.y + d2);

        double cosAngle = Math.pow(dis2, 2) + Math.pow(dis, 2) - Math.pow(dis3, 2) / 2 * dis2 * dis;

        double angle = Math.acos(cosAngle);

        EntityPhoton p = new EntityPhoton(this, level);
        p.rotation = angle;
        level.addEntity(p, pos);
4

1 回答 1

1

假设目标船没有加速度,这意味着它的速度和方向没有改变。

我们还假设一旦发射,您的鱼雷就没有加速度。它总是以恒定的速度运行。

让我们也将您的鱼雷发射的点称为 (0,0)。

船描述了一条直线。在这条线上选择一个点(如果船沿着不经过 (0,0) 的航向,您可以找到离中心位置最近的点,其中包含一些您可以在维基百科上查找的几何图形)。

一旦选择了要击中敌舰的位置,您就知道 (0,0) 与该位置之间的距离,并且鉴于鱼雷的速度始终相同,您还可以知道何时发射鱼雷鱼雷。然后你还必须找到方向,这意味着在 x 和 y 上给出的速度值,但这并不难。

一般来说,这个问题是一个有多种解决方案的系统,所以假设鱼雷比目标快,你可以击中它的点是无限的,所以你必须使用一些启发式方法来选择一个对你来说方便的点。

于 2013-02-06T21:23:22.960 回答