Большое спасибо за ответы, особенно @Dukeling и @ nm
. Я реализовал (в Python) решение по разметке, предложенное @nm, и выкладываю его здесь на тот случай, если кто-нибудь еще посчитает его полезным.(Я обнаружил, что один из них легче кодировать, чем решение Dukeling.) В моем случае использования я знаю, какой будет содержащий полигон (если он есть), поэтому мне не нужно тестировать в обоих направлениях.
Я проверил это с более чем двадцатью тестами, включая все те, что на диаграмме выше, и их отражения в y = x.Однако, если кто-нибудь заметит какой-либо крайний случай, когда реализация не работает, или какие-либо улучшения в эффективности кода, комментарии будут приветствоваться.
Редактировать:
У меня естьудалил код, так как я обнаружил ряд случаев, для которых он не работал.В конце я остановился на более всеобъемлющем решении, которое, учитывая, что два многоугольника A и B определяют, содержит ли A B, A находится внутри B, A и B перекрываются, или A и B не пересекаются.
Для ускорения вещейвверх, он начинается с просмотра ограничивающих прямоугольников, что исключает некоторые возможности, затем, если ограничивающие прямоугольники равны, он просматривает области и только затем переходит к алгоритму развертки.
Код довольно длинный, поэтомуЯ не включаю его здесь, но если кому-то интересно, вы можете увидеть это как positionRelativeTo
метод PolygonObject
при https://github.com/andy31lewis/brySVG. Это было протестировано с парой сотен тестовых случаев и кажется довольно надежным.