У меня есть набор простых (без отверстий, без самопересечений) многоугольников, и мне нужно проверить, что они не пересекаются друг с другом (можно полностью содержать в другом, это нормально). Я могу проверить это, просто проверив внутреннюю вершину одного полигона по сравнению с другими полигонами.Определение пересечения и локализации многоугольника
Мне также нужно определить дерево сдерживания, которое представляет собой набор отношений, которые говорят, что многоугольник содержит любой заданный многоугольник. Так как ни один полигон не может пересекать ни один другой, то любой содержащийся многоугольник имеет уникальный контейнер; «следующий». Другими словами, если A содержит B, содержит C, то A является родительским элементом B, а B является родительским элементом C, и мы не рассматриваем A родителем C.
Вопрос: как эффективно определить отношения сдерживания и проверить критерий непересечения? Я задаю это как один вопрос, потому что, возможно, комбинированный алгоритм более эффективен, чем решение каждой проблемы отдельно. Алгоритм должен взять в качестве входного списка список полигонов, заданный списком их вершин. Он должен вызывать логическое B, указывающее, не пересекается ни один из многоугольников с другим полигоном, а также если B = true, список пар (P, C), где многоугольник P является родителем ребенка C.
Это не домашнее задание. Это для хобби проекта, над которым я работаю.
Предположим, что у вас есть многоугольники размером 1, ..., 5 и предположим, что 1 находится внутри 3, который находится внутри 5, а 2 - в 4. Затем 3 приходит после 2 в списке, но не обязательно содержит его. –
Правильно, но родительский элемент многоугольника в дереве сдерживания будет первым * содержащим * полигоном после него в списке. Поскольку 3 не содержит 2, он не связан в дереве. Однако, хотя 5 содержит один, он не связан напрямую в дереве и является родителем 3, который является родительским элементом 1. –