Вы ищете воронкообразный алгоритм.
Вот ты простой
http://digestingduck.blogspot.com.es/2010/03/simple-stupid-funnel-algorithm.html
По сути, алгоритм идентифицирует ребра как порталы и создает воронку, которая проверяется на вершине ребер, чтобы проверить, находятся ли они внутри воронки или нет.
На шаге А воронка строится с начальной позицией, а портал пересекается желтой линией.
На шаге B проверяется следующий портал, верхняя вершина которого находится внутри воронки, поэтому теперь верхняя линия воронки проходит через нее. Но нижняя вершина находится вне воронки, потому что красная линия находится под зеленой линией, поэтому нижняя линия не пройдет через нее, она продолжит проходить через нижнюю вершину предыдущего портала.
Как вы можете проверить, воронка будет все меньше и меньше до шага F, где воронка не может быть построена, потому что красная линия делает плохую воронку, поэтому верхняя вершина выбирается как новая начальная точка, и новая воронка будет быть построенным, если конечная точка не находится в этой сетке.
Поймите, что этот тип алгоритма также позволяет легко решить проблему размера модели, потому что вы можете считать, что порталы меньше в 2 раза по сравнению с вашей моделью.