У меня есть объект System.Windows.Shapes.Polygon, макет которого полностью определяется рядом точек. Мне нужно определить, является ли этот многоугольник самопересекающимся; т. е. если какая-либо из сторон многоугольника пересекает любую из сторон в точке, не являющейся вершиной. Есть ли простой/быстрый способ вычислить это?Проверьте, не является ли многоугольник самопересекающимся
ответ
Легкие, медленный, низкий объем памяти: сравнить каждый сегмент от всех остальных и проверить наличие пересечений. Сложность O (n).
Немного быстрее, область памяти средней памяти (модифицированная версия выше): храните края в пространственных «ведрах», а затем выполняйте выше алгоритм на основе каждого ковша. Сложность O (n/m) для m ведра (при условии равномерного распределения).
Быстрого & высокой память след: использовать пространственную хэш-функцию для разделения края в ведро. Проверьте наличие столкновений. Сложность O (n).
Быстрый & низкая память след: использовать алгоритм развертки строки, такие, как один описанный here (или here). Сложность O (п журнал п)
Последняя моя любимая, как это имеет хорошую скорость - баланс памяти, особенно Bentley-Ottmann algorithm. Реализация также не слишком сложна.
Проверьте, не пересекаются ли какие-либо пары непересекающихся сегментов линии.
Все они должны пересекаться в вершинах; вопрос тогда становится тем, что самый быстрый способ проверить не вершинное пересечение между произвольным набором отрезков линии. – GWLlosa
Хорошая точка, отредактированная, чтобы проверить, пересекаются ли непересекающиеся сегменты. Я не думаю, что есть встроенный метод, вам придется написать метод. Начните с получения Polygon.Points –
Вы не имеете в виду ** открытые ** сегменты линии? Я никогда не слышал о несмежных сегментах линии. –
Для полноты я добавлю еще один алгоритм для этого обсуждения.
Предполагая, что читатель знает о выровненных по горизонтали ограничительных прямоугольниках (это Google, если нет). Быстро найти пары ребер, столкнувшихся с AABB, можно с помощью «Sweep and Prune Algorithm». (погугли это). Затем на этих парах вызывается процедура пересечения.
Преимущество в том, что вы можете даже пересечь не прямолинейный край (круги и сплайны), а подход является более общим, хотя и почти таким же эффективным.
- 1. python shapely: проверьте, является ли многоугольник многопольным
- 2. проверить, является ли многоугольник самопересекающимися картами Google v3
- 3. Проверьте, есть ли многоугольник в окне просмотра
- 4. Проверьте, не является ли Newtonsoft.Json.Linq.JToken
- 5. Проверьте, является ли объект
- 6. Проверьте, не является ли файл не каталогом
- 7. Проверьте, не является ли результат уникальным
- 8. Проверьте, не является ли атрибут CoreData пустым
- 9. Z3: Проверьте, не является ли модель уникальной.
- 10. VB.Net Проверьте, не является ли тип IEnumerable
- 11. mod_rewrite: проверьте, не является ли определенный домен
- 12. Проверьте, не является ли sampler2D пустым
- 13. Проверьте, не является ли NSMutableDictionary пустым?
- 14. Проверьте, не является ли результат MySQL пустым
- 15. Проверьте, не является ли однонаправленный граф деревом
- 16. Проверьте, не является ли сертификат подстановочным сертификатом
- 17. Проверьте, не является ли объект Ruby логическим.
- 18. Проверьте, не является ли массив C++ Null
- 19. Проверьте, не является ли импорт избыточным
- 20. Проверьте, не является ли символ пробелом
- 21. Проверьте, не является ли double пустым
- 22. Проверьте, не является ли innerHTML пустым
- 23. Проверьте, является ли файл или каталог не
- 24. Проверьте, не является ли каталог символической ссылкой?
- 25. Проверьте, не является ли компилятор Turbo C++
- 26. Проверьте, не является ли обязательное поле пустым
- 27. Проверьте, не является ли тип VARRAY пустым
- 28. Проверьте, не является ли StringBuffer пустым
- 29. Проверьте, не является ли условие ложным
- 30. Проверьте, является ли тип TypeBuilder
Я пытаюсь разгадать последний алгоритм, когда мы говорим; особенно, у меня возникают проблемы с отслеживанием значения/цели структуры T. – GWLlosa
* T * - это структура, которая содержит отрезки линий, пересекающие линию развертки * L *. Наиболее эффективной структурой будет двоичное дерево поиска (см. Также [алгоритм Бентли-Оттмана] (http://en.wikipedia.org/wiki/Bentley%E2%80%93Ottmann_algorithm)). –
Я добавил еще одну [ссылку, где алгоритм Бентли-Оттмана] (http://softsurfer.com/Archive/algorithm_0108/algorithm_0108.htm) описывается иллюстрациями. –