Java:我的物体不会以 0 到 45 度之间的角度行进

Java: My object won't travel at an angle between 0 and 45 degrees

我刚开始学习 java 一年多以前,所以我还是个新手。

我试图让一个物体以恒定的净速度从一个点移动到另一个点,而不管第二个点在框架中的什么位置。目前,只要我每隔几帧 运行 该方法,它就工作得很好。

唯一的问题是它只会水平移动,除非第二个点大约在 45 到 135 度之间或 225 到 315 度之间(1/2π 和 3/2π 或 5/2π 和 7/2π) .

可能是因为 'if' 语句意在阻止它被 0 除,但它看起来不像。此外,如果有任何方法可以简化这些方程式或删除 'if' 语句,我也不介意那里的一些建议。

注意:vel 是物体行进的净速度,Prime.mx 和 Prime.my 是目标点的位置。

public void target()
{ 
 if (Prime.mx > x)
 {
   if (Math.abs(x-Prime.mx) != 0)
     x = Math.round(Math.round((x + (vel*Math.cos(Math.atan(Math.abs(y-Prime.my)/Math.abs(x-Prime.mx)))))));
 }
 if (Prime.mx < x)
 {
   if (Math.abs(x-Prime.mx) != 0)
     x = Math.round(Math.round((x - (vel*Math.cos(Math.atan(Math.abs(y-Prime.my)/Math.abs(x-Prime.mx)))))));
 }
 if (Prime.my > y)
 {
   if (Math.abs(x-Prime.mx) != 0)
     y = Math.round(Math.round((y + (vel*Math.sin(Math.atan(Math.abs(y-Prime.my)/Math.abs(x-Prime.mx)))))));
 }
 if (Prime.my < y)
 {
   if (Math.abs(x-Prime.mx) != 0)
     y = Math.round(Math.round((y - (vel*Math.sin(Math.atan(Math.abs(y-Prime.my)/Math.abs(x-Prime.mx)))))));
 }
}

我使用 Math.round 两次,因为第一次将它从双精度数转换为浮点数,第二次将其转换为整数。我需要 x 和 y 作为整数,以便 paint 方法可以绘制对象。

我在网站上发现了一些类似的问题,但 the closest one 在 python 中,答案似乎不适用于我的问题。

除了解决方案,还有一些建议。

首先,将所有坐标变量实现为浮点数,以防止舍入精度损失错误,并且仅在绘画前进行舍入。

其次,定义从当前点到目标的 float dx = Prime.mx - x; float dy = Prime.my - y; 距离(稍后使用)。我会使用 Math.atan2(dy,dx) 来计算当前点和目标之间的角度。然后使用该角度来增加坐标,如下所示:

x += Math.cos(angle)*vel;
y += Math.sin(angle)*vel;

第三,使用 (dx*dx + dy*dy <= radius*radius) 合适的半径(可以是 1)检查你的物体是否在目标上。

另请注意,如果 y 轴向下,则角度将为 CW(顺时针)而不是 CCW(逆时针)。

我相信你把这个复杂化了。如果你的起点是 (sx, sy) 而你的目的地是 (dx, dy) 那么你可以很容易地计算出任何点 (x, y)p 沿线的距离 (0.0 <= p <= 1.0 ).您可以使用它以速度 v 移动。所以我建议找到你的终点,然后使用简单的算法在 x 和 y 轴上移动。

float dx = dist * Math.cos(angle);
float dy = dist * Math.sin(angle);
for (float p = 0.0; p <= 1.0; p = Math.min(1.0, p + dist / v) {
    x = sx + p * (dx - sx);
    y = sy + p * (dy - sy);
}

for 循环中的 Math.min 表达式可确保您准确到达目的地。

如果您已经有了目的地,那就很简单了。不是从 distangle 中找到 dxdy,而是使用毕达哥拉斯从 dxdy 中找到 dist