Настройка
- Функция должна обеспечить расстояние от точки до ближайшего края многоугольника
- Известно, что точка внутри многоугольника
- Многоугольник может быть выпуклым или вогнутым
- Необходимо проверить многие моменты (миллионы).
- Множество отдельных многоугольников (десятков) должно выполняться через функцию на точку
- Предварительно рассчитанные и постоянно сохраняемые структуры данных являются опцией.
- Последняя функция поиска будет в С++
Для реализации функции я знаю, что простой метод состоял бы в том, чтобы проверить расстояние до всех сегментов многоугольника, используя стандартные формулы расстояния до линейного сегмента. Этот вариант будет довольно медленным в масштабе, и я уверен, что должен быть лучший вариант.
Мой инстинкт кишки заключается в том, что для этого типа функций должны быть некоторые очень быстрые известные алгоритмы, которые были бы реализованы в игровом движке, но я не уверен, где искать.
Я нашел ссылку для хранения сегментов линии в квадранте, что обеспечило бы очень быстрый поиск, и я думаю, что его можно было использовать для моей цели, чтобы быстро сузить, какой сегмент смотреть как самый близкий сегмент, а затем нужно только вычислить расстояние до одного сегмента линии. https://people.cs.vt.edu/~shaffer/Papers/SametCVPR85.pdf
Я не смог найти примеры кода для того, как это будет работать. Я не против реализации алгоритмов с нуля, но не вижу смысла в этом, если существует рабочая, проверенная база кода.
Я рассматривал пару реализаций quadtree, и я думаю, что он будет работать, чтобы создать квадрант на один полигон и вставить каждый сегмент линии многоугольника с ограничивающей рамкой в квадрант для этого многоугольника.
Часть запроса для функции, которую я бы создавала, будет состоять из создания точки как очень маленького ограничивающего прямоугольника, который затем будет использоваться для поиска по структуре квадрантов, которая затем найдет только самые близкие части многоугольника.
http://www.codeproject.com/Articles/30535/A-Simple-QuadTree-Implementation-in-C
и
Мой реальный вопрос был бы, похоже ли это, как звуковой подход для быстрой функции поиска времени?
Есть ли что-то, что будет работать быстрее?
EDIT: Я искал вокруг и нашел некоторые проблемы с использованием quadtree. Способ работы квадрантов хорош для обнаружения конфликтов, но не настроен для эффективного поиска ближайших соседей. https://gamedev.stackexchange.com/info/14373/in-2d-how-do-i-efficiently-find-the-nearest-object-to-a-point
R-деревья выглядят лучше. https://en.wikipedia.org/wiki/R-tree
и
эффективный способ обработки сегментов 2-й линии
На основе этих сообщений R-деревья выглядят как победитель. Также удобно видеть, что С++ Boost уже реализовал их. Это выглядит достаточно близко к тому, что я планировал сделать, и я продолжу его реализацию и проведу результаты.