Во-первых, ваш алгоритм проверки содержания не проверяет правильность пересечения.Представьте себе два прямоугольника, как это:
+--+
+--+--+--+
| | | |
+--+--+--+
+--+
Вершины будут в (1, 2) (1,3) (4,2) (4,3) и (2,1) (3,1)(2,4) (3,4) - ни одна вершина не лежит внутри какого-либо многоугольника, но многоугольники действительно пересекаются.
Чтобы проверить этот вид пересечения, необходимо определить, является ли какой-либо из ребра полигонов пересекаются.Для ваших целей, если ребра пересекаются, но один многоугольник не содержится внутри другого, то вы знаете, что они перекрываются недопустимым образом.
Что касается определения дерева сдерживания, один из способов сделать это - отсортироватьполигоны от наименьшего к наибольшему по площади.При условии, что многоугольники не перекрываются без ограничения, родительский объект любого многоугольника в дереве будет первым содержащим многоугольник, следующий за ним в списке.
Редактировать: О, также я советую написать быстрое ограничение-box или процедура перекрытия ограничивающего круга, и использовать ее, чтобы избежать необходимости выполнять все тесты пересечения линий и локализации вершин.Если это все еще не достаточно быстро, вы, вероятно, захотите построить дерево квадраторов или BSP;это немного усложнит ситуацию, но также полностью исключит множество проверок пересечения.