У меня есть простой алгоритм для объекта, который следует за указателем мыши с заданной максимальной скоростью в 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
и Math.cos
всегда возвращают значения в диапазоне [-1, 1], dy
и dx
также будут в диапазоне [-1, 1]. При преобразовании в целое число путем округления (поскольку целевые позиции x и y определены как переменные int
), каждое смещение округляется до -1
, 0
или 1
, эффективно ограничивая возможное перемещение теми же восемью углами.
Так, например, если объект начинается в точке (0, 0), а я помещаю мышь в точку (300, 100), объект сначала будет двигаться строго горизонтально, а затем под углом -45. Я хотел бы, чтобы объект двигался под (приблизительно) постоянным углом по (приблизительно) прямой линии от точки отправления до места назначения.
Каков наилучший способ сделать это, если не считать преобразования базовых координат x и y в значения double
?
double
? - person clstrfsck   schedule 24.03.2013double
в качестве резервных значений, в то время как при их использовании для отображения вы вынуждены округлять их доint
, потому что дисплей может использовать только их. - person Guillaume Polet   schedule 24.03.2013