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