Java 无需舍入即可获得正确计算的双速度矢量

Java 无需舍入即可获得正确计算的双速度矢量,java,eclipse,double,collision-detection,trigonometry,Java,Eclipse,Double,Collision Detection,Trigonometry,我现在正在写一个简单的游戏,在这个游戏中,有许多城镇有一定数量的士兵,每秒钟递增一次。一个玩家拥有的城镇可以攻击另一个玩家拥有的城镇,导致原城镇中的士兵数量一分为二,另一半将攻击另一个城镇 问题是,我将进攻的士兵表示为一个朝向另一个城镇的形状,并使用碰撞检测来确定攻击何时到达。因此,重要的是,攻击用于到达城镇的向量是正确的,以便它实际到达城镇 每个城镇都有一个点字段,称为攻击点,我将其用作攻击的起点和目标。攻击点位于冲突字段的中间。 以下是初始化攻击并创建运动向量的代码: public Atta

我现在正在写一个简单的游戏,在这个游戏中,有许多城镇有一定数量的士兵,每秒钟递增一次。一个玩家拥有的城镇可以攻击另一个玩家拥有的城镇,导致原城镇中的士兵数量一分为二,另一半将攻击另一个城镇

问题是,我将进攻的士兵表示为一个朝向另一个城镇的形状,并使用碰撞检测来确定攻击何时到达。因此,重要的是,
攻击
用于到达城镇的向量是正确的,以便它实际到达城镇

每个城镇都有一个
字段,称为
攻击点
,我将其用作攻击的起点和目标。<代码>攻击点<代码>位于冲突字段的中间。

以下是初始化
攻击并创建运动向量的代码:

public Attack(int troops, Team owner, Town source, Town destination) {
    this.troops = troops;             //troops included in the attack
    this.owner = owner;               //player that who sent the attack
    this.destination = destination;   //town the attack is going towards

    Point srcPoint = source.getAttackPoint(); //attackPoint of the source
    Point destPoint = destination.getAttackPoint(); //attackPoint of the destination town

    x = srcPoint.x;           //int --- the attack originates at the src's attack point
    y = srcPoint.y;           //int

    double hypotenuse = Math.sqrt(Math.pow(destPoint.y - y, 2) + Math.pow(destPoint.x - x, 2));
    double adjacent = destPoint.x - x;
    double opposite = destPoint.y - y;
    xVelocity = 3.0 * (adjacent / hypotenuse);     //field, double
    yVelocity = 3.0 * (opposite / hypotenuse);
}
然后另一种方法实际上移动了
攻击
-

public void move() {
   x += xVelocity;
   y += yVelocity;
}
通过测试,我可以确认由
getAttackPoint()
返回的
attackPoints
都是正确的,并且我执行碰撞检测的方式工作正常。这里的问题是,似乎我的速度变量或其他一些变量正在取整,因此
攻击只能采用几个预定义的路径。例如:

//trying to attack X2     //trying to attack X1
X...............                     X------------------
.\..............                     .........X1.....
..\.............                     ................
...\............                     ................
....\...........                     ................
.....X1..X2.....                     ................
“预定义”路径似乎每隔30度左右,我可以直接向上、向下、向左和向右发送
Attack
s,这就是为什么我认为在计算向量和执行trig时会出现舍入错误。 当我有两个靠近的城镇时,无论我试图攻击哪一个,这两个城镇都遵循相同的路径(图1)。 另外,当我有一个城镇靠近源城镇东/西180度时,我发送的
攻击将直接向东/西移动(图2)


如果有人能看到出了什么问题,或者给我一个建议,如何让物体从一个点或另一个点沿直接路径移动,那将非常感谢

虽然我确实检查了你计算二维加速度的方法,但这似乎很奇怪

需要由两点(源点和目标点)定义直线的坡度


一般来说,我建议您使用向量,而不是x和y变量。您可以概括大多数操作,并使代码更具可读性和无重复性(在这种情况下,连接源和目标的段将是由目标-源给出的向量)。

因此,在进一步研究这一点并尝试几种不同的解决方案之后,我非常确信存在舍入错误-可能将
s的
int
字段转换为
double
s,但我不确定


我所做的是将所有的计算移到
move()
方法,这样每一次勾号都会重新计算一行。这对优化不太好,但我没有很多对象,这有助于
攻击朝着其他城镇移动。最初我还无法找出问题的原因,但确保计算能够通过重新计算进行自我检查解决了问题。

感谢您的回复-这似乎与我正在做的有关,尽管稍微简单一点。“归一化”是什么意思?@wizardarrac坡度只定义速度向量的方向。您可以应用规范化来设置向量的长度,这意味着在此上下文中的速度。新的配方没有帮助吗?看来我在使用新配方时仍然遇到同样的问题。然而,和你的乱搞让我意识到了一些事情。无论我用什么数字来修改速度,比如你的例子中的1或者我的代码中的3,似乎每90度之间都有很多角度。当我将“速度”修改器设置为非常高的值时,比如30,那么攻击会精确地进行。问题是,我似乎无法以较低的速度获得这种效果。@wizardarrac我猜问题是由于代码中某个地方的舍入不当造成的。
double slope = (destination.y - source.y)/(destination.x - source.x);
xVelocity = 1; // do the normalisation as you wish
yVelocity = xVelocity * slope;