我有一个简单的算法,让对象在 Java 中以给定的最大速度跟随鼠标指针。该算法的关键在于:
// Set up displacement trackers for later.
// (These are used in another part of the algorithm, which rotates
// the object to face along its path tangent with a moving average.)
double dx = 0, dy = 0;
// ... more code
// Find the angle of travel.
double angle = Math.atan2(m.y - target.getY(), m.x - target.getX());
// Set displacements with polar coordinate transforms.
dx = maxSpeed * Math.cos(angle);
dy = maxSpeed * Math.sin(angle);
// Now go there.
target.setX((int) Math.round(target.getX() + dx));
target.setY((int) Math.round(target.getY() + dy));
这是以每秒 30 帧的速度运行的。性能不是问题。
代码在中等到大的值maxSpeed
(5 及以上都可以)下运行良好,但在非常低的值下,代码会导致对象仅以特定角度移动。例如,在 处maxSpeed = 1
,目标只能以 45° 角移动。
以下是我对问题的理解:
让maxSpeed
相等1
。因此,因为Math.sin
andMath.cos
总是返回 [-1, 1] 范围内的值,dy
并且dx
也将在 [-1, 1] 范围内。当通过四舍五入转换为整数时(因为目标 x 和 y 位置被定义为int
变量),位移均被四舍五入为-1
、0
或1
,有效地将可能的移动限制在相同的八个角度。
因此,例如,如果对象从 (0, 0) 开始并且我将鼠标定位在 (300, 100),则对象将首先完美地水平移动,然后以 -45° 的角度移动。我希望物体以(大约)恒定角度移动,从起点到目的地的(大约)直线。
除了将基础 x 和 y 坐标转换为值之外,最好的方法是什么double
?