Я думаю, что это, по сути, ответ Ларсманса, сделанный немного более алгоритмическим:
Узлы графа являются вершинами препятствий. Каждая внутренняя вершина фактически представляет собой два узла: вогнутую и выпуклую стороны.
- Поместите начальный узел в приоритетную очередь с помощью евклидова эвристического расстояния.
- Извлеките верхний узел из очереди приоритетов.
- Выполните тест пересечения линий от узла к цели (возможно, используя методы структуры данных трассировки лучей для ускорения). Если это не удастся,
- Рассмотрим луч от текущего узла к любой другой вершине. Если нет пересечений между текущим узлом, рассматриваемой вершиной и вершиной, выпуклой с точки зрения текущего узла, добавить вершину в очередь приоритетов, отсортированную с использованием накопленного расстояния в текущем узле плюс расстояние от текущего узла. узла к вершине плюс эвристическое расстояние.
- Вернуться к 2.
Вы должны выполнить дополнительную работу по предварительной обработке, если в препятствиях есть такие вещи, как Т-образные соединения, и я не удивлюсь, обнаружив, что в ряде случаев они ломаются. Возможно, вы сможете ускорить процесс, рассматривая только вершины связанного компонента, лежащего между текущим узлом и целью.
Итак, в вашем примере после первой попытки A,B вы должны нажать A,8, A,5, A, 1, A, 11 и A, 2. Первыми рассматриваемыми узлами будут A,8, A,1 и A,5, но они не могут выбраться, и узлы, до которых они могут добраться, уже помещены в очередь с более коротким накопленным расстоянием. Будут рассмотрены A,2 и A,11, и дальше все пойдет.
![Измененное изображение.](https://i.stack.imgur.com/yabfl.png)
person
JCooper
schedule
22.07.2011