Пожалуйста, найдите минутку, чтобы понять мою ситуацию. Если это не понятно, пожалуйста, сообщите мне в комментарии.
У меня есть ArrayList путевых точек. Эти путевые точки не в любом порядке. Путевая точка имеет следующие свойства:{int type, float z, float y, float x, float rotation}
Это применимо к трехмерному миру, но поскольку мой поиск пути не должен заботиться о высоте (и, таким образом, рассматривать мир как двумерный), значение y игнорируется. Ротация не имеет значения для этого вопроса.
- В этом двухмерном мире х представляет ось х, а z представляет ось у.
- Если x увеличивается, объект в мире перемещается на восток. Если x уменьшается, объект в мире движется на запад.
- Если z увеличивается, объект в мире перемещается на север. Если z уменьшается, объект в мире перемещается на юг.
Таким образом, эти «новые» путевые точки можно упростить до: waypoint = {float x, float y}
.
Теперь эти путевые точки представляют расположение объекта по оси X (x) и по оси Y (z). Кроме того, есть текущее местоположение: curLocation = {float x, float y}
и целевое местоположение: tarLocation = {float x, float y}
.
Вот что я хочу получить:
Все комбинации путевых точек (иначе: пути или маршруты), которые ведут из curLocation
в tarLocation
при следующих строгих условиях:
- Расстояние между каждой путевой точкой не может превышать
(float) maxInbetweenDistance
. Сюда входит начальное расстояние отcurLocation
до первой путевой точки и расстояние от последней путевой точки доtarLocation
. Если такая комбинация путевых точек невозможна, следует вернуть null. - Если в пределах
maxInbetweenDistance
найдено несколько путевых точек от путевой точки, ведущих к целевой путевой точке, следует выбрать ближайшую путевую точку (еще лучше было бы, если альтернативная путевая точка, которая немного дальше, приведет к новому пути с более длинным расстоянием, который также вернулся). - Порядок возвращаемых комбинаций путевых точек (путей) должен быть от кратчайшего маршрута (минимальное расстояние) до самого длинного маршрута (максимальное расстояние).
Наконец, обратите внимание на следующие моменты:
- Это единственное, что мне нужно для ИИ/поиска пути, поэтому я не хочу использовать полноценную систему поиска пути или ИИ. Я считаю, что одна функция должна быть в состоянии справиться с вышеизложенным.
- Если возврат всех возможных комбинаций путевых точек вызывает слишком много накладных расходов, также было бы хорошо, если бы можно было указать максимальное количество комбинаций (но все же в порядке от ближайшего к самому дальнему). Например. 5 ближайших путей.
Как бы я этого добился? Любая обратная связь приветствуется.