У меня есть луч, мне нужно найти самый близкий сегмент линии, в который он попадает. Я думаю, что это возможно сделать в O (log n), если я сначала сортирую сегменты строк, но я не помню, как их сортировать ... Я думаю, что какое-то дерево будет работать лучше всего, но как я сортирую их как стартовой, так и конечной точкой? Я также хотел бы, чтобы быстрая вставка в эту структуру данных, если это возможно.Контейнер сегмента линии для быстрого пересечения лучей? (2D)
Существует много кода для одного луча по сравнению с одним сегментом, но мне нужно что-то для одного луча и многих сегментов линии ... Я не знаю, какие условия для Google.
Ссылка на подходящую статью хорошо, код на C++ еще лучше. Благодаря! :)
PS: Линии сегментов на самом деле являются краями несамопересекающегося многоугольника, отсортированного по порядку CCW ... но я думаю, что может быть некоторое преимущество в их сортировке по-другому?
Это все 2D.
На второй мысли, я не совсем уверен, что это является возможно. Может помочь какое-то пространственное разбиение, но в остальном я не могу придумать способ сортировки строк, чтобы их можно было сравнить с произвольным лучом.
Нет, O (log n), о котором я думал, был только для горизонтальных или вертикальных сегментов. Алгоритм Брешенема выглядит так, будто он может пропустить перекрестки, хотя, не так ли? Он не «заполняет» каждую ячейку, в которую он входит. В противном случае это выглядит как хороший подход. – mpen
Вы правы, обход сетки должен выполняться с помощью упомянутого здесь алгоритма http://www.devmaster.net/articles/raytracing_series/part4.php, см. Раздел «Обход сетки». Обратите внимание, что вы, вероятно, только выиграете, если ваш многоугольник имеет много (~ сотни) ребер, как они показывают в статье. –
Ну, вероятно, он не будет сотни ребер, но одни и те же края могут использоваться тысячи раз. Это похоже на лучший ответ на то, что я считал мертвым, поэтому я дам вам чек;) Спасибо. – mpen