Ближайшая точка на пути к точке, или: Уважаемая цель, извините, я скучал по вам - PullRequest
5 голосов
/ 05 февраля 2010

Для 2D-игры, над которой я работаю, я бы хотел выяснить, когда снаряд достигает своей точки, наиболее близкой к цели.

Снаряд - это точка, которая движется с постоянной dx, dy за кадр. Цель - это еще одна точка, скорость которой относительно снаряда достаточно медленная, чтобы считаться стационарной. Я хочу, чтобы снаряд взорвался, когда он (приблизительно) будет как можно ближе к цели.

Какой хороший способ рассчитать это?

Абсолютная точность не является критичной, это симуляция на стороне клиента события, которое уже было разрешено на сервере. Я бы предпочел алгоритм, который был бы быстрым и простым, а не идеальным по пикселям.

Ответы [ 5 ]

5 голосов
/ 05 февраля 2010

Минимальное расстояние между точкой и линией: (в сущности, к чему сводится проблема)

http://local.wasp.uwa.edu.au/~pbourke/geometry/pointline/

Больше справочного материала в его разделе общей геометрии:

http://local.wasp.uwa.edu.au/~pbourke/geometry/

2 голосов
/ 05 февраля 2010

Следите за предыдущим расстоянием и проверьте в первый момент, когда расстояние начинает увеличиваться.

if ((currentDistance==0) || (currentDistance > previousDistance)) Explode()

Это просто так, потому что геометрия вашего пути тривиальна (то есть прямая линия), но она прекрасно работает.

Это дает дополнительное преимущество работы, когда цель быстрее, чем вы описываете, при условии, что обе дорожки прямые (или, по крайней мере, слегка изогнутые).

Ограничение: размер шага должен быть небольшим по сравнению с "размером" взрыва, иначе это не будет работать правильно. В этом случае вам нужно будет предварительно вычислить расстояние next ...

2 голосов
/ 05 февраля 2010

Рассчитайте нормаль к пути, который пересекается с целью. Пересечение нормали и пути будет ближайшей точкой на пути к цели.

1 голос
/ 05 февраля 2010

Похоже, ваш "снаряд" в основном движется по прямой линии.

Простым было визуализировать - преобразовать 2D-плоскость так, чтобы линия стала осью X. Это будет связано с вращением по arctan (dy / dx).

Примените то же преобразование к рассматриваемой точке и получите координату y.

Если вы хотите, вы можете сделать это вручную и выяснить, но игровые API уже должны хорошо подходить для этого.

0 голосов
/ 13 июля 2010

Вы можете просто использовать теорему Пифагора, которая просто использует формулу (a) 2 + (b) 2 = (c) 2. Таким образом, ваше расстояние будет равно квадратному корню продукта. Вот хорошая статья о том, как реализовать это, используя точки на сетке.

http://www.mathwarehouse.com/algebra/distance_formula/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...