Я думаю, что по сути это ответ Ларсмана, сделанный немного более алгоритмическим:
Узлы графа являются вершинами препятствий. Каждая внутренняя вершина фактически представляет собой два узла: вогнутую и выпуклую стороны.
- Вставить начальный узел в очередь приоритетов с эвклидовым эвристическим расстоянием.
- Извлечь верхний узел из очереди приоритетов.
- Выполните тест пересечения линии от узла к цели (возможно, с использованием методов структуры данных с трассировкой лучей для ускорения). Если не получится,
- Рассмотрим луч от текущего узла ко всем остальным вершинам. Если между текущим узлом и рассматриваемой вершиной нет пересечений, а вершина является выпуклой с точки зрения текущего узла, добавьте вершину в очередь с приоритетами, отсортированную по накопленному расстоянию в текущем узле плюс расстояние от текущего узел к вершине плюс эвристическое расстояние.
- Возврат к 2.
Вы должны выполнить дополнительную предварительную обработку, если в препятствиях есть такие вещи, как «Т» -переходы, и я не удивлюсь, обнаружив, что в некоторых случаях они ломаются. Возможно, вам удастся ускорить процесс, рассматривая только вершины подключенного компонента, который находится между текущим узлом и целью.
Итак, в вашем примере, после первой попытки A, B , вы нажмете A, 8 , A, 5 , A, 1 , A, 11 и A, 2 . Первыми узлами рассмотрения будут A, 8 , A, 1 и A, 5 , но они не могут выйти, а узлы могут вылет уже выдвинут в очередь с меньшим накопленным расстоянием. A, 2 и A, 11 будут рассмотрены, и дела пойдут оттуда.