Обычный подход состоит в том, чтобы спроецировать линию горизонтально влево от заданной точки и найти ближайший край, который пересекает эта линия.Направление этого ребра говорит вам, находится ли точка внутри или снаружи многоугольника (с указанием направления пути согласно предложению Павла).Если ребро не обнаружено, вы, конечно, находитесь снаружи.
Для этого вам нужно, чтобы каждая ячейка вашего двоичного дерева ссылалась на каждое ребро, которое проходит через ячейку, даже если его вершины находятся вне клетки .Иногда вам может понадобиться пройти через несколько ячеек, чтобы найти ближайший пересекающийся край.
Для иллюстрации:
Внутри ячейки, котораясодержит нашу точку интереса (см. правое увеличение выше), мы проецируем линию из точки слева.Он не встречает ребер, пока не достигнет границы ячейки.Таким образом, мы должны пройти в следующую ячейку и продолжить нашу линию.Он попадает на ребро, у-направление которого положительное;таким образом, мы заключаем, что точка находится вне многоугольника.
Обратите внимание, что в ячейке может храниться информация для вершин, которые выходят за границы ячейки, так что на каждое ребро, проходящее через ячейку, ссылаются.
Этот подход работает для многоугольников любой сложности, а также для фигур с несколькими (не связанными) контурами.
Случай края (извините за каламбур), который следует соблюдать при кодировании этогоup:
Если ваша проецируемая линия проходит непосредственно через вершину: эта вершина является частью двух ребер, так что же линия попадает первой?Это может иметь большое значение.Чтобы упростить эту ситуацию, вы должны только считать, что ребро пересекается, если y-позиция спроецированной линии строго меньше y-позиции самой высокой из двух вершин ребра.
Ниже показаны три точки, проекционные линии которых проходят через самую низкую вершину, среднюю точку и самую высокую вершину ребра («самое высокое» означает наибольшее значение y; направление ребра здесь неважно).Первые две линии пересекают край;третий - нет.
В результате идеально горизонтальные ребра всегда игнорируются, и вы можете, если хотите, пропустить их при заполнении двоичного файла.дерево.