1

我一年多前开始学习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 两次,因为第一次将它从 double 带到 float,第二次将其变成 int。我需要 x 和 y 作为整数,以便绘制方法可以绘制对象。

我在网站上发现了一些类似的问题,但最接近的问题是在 python 中,并且答案似乎不适用于我的问题。

4

2 回答 2

1

这些不仅仅是解决方案,还有一些建议。

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

其次,定义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(逆时针)。

于 2015-02-04T01:18:56.907 回答
1

我相信你把这件事复杂化了。如果您的起点是(sx, sy)并且您的目的地是,(dx, dy)那么您可以轻松计算沿线距离的任何点(0.0 <= p <= 1.0)(x, y)p您可以使用它以速度移动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);
}

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

如果您已经有了目的地点,那么这同样容易。而不是find dxand dyfrom distand angleyou find distfrom dxand dyusing 毕达哥拉斯。

于 2015-02-04T01:21:02.453 回答