Это кажется нетривиальным (его часто задают на разных форумах), но мне это абсолютно необходимо как строительный блок для более сложного алгоритма.
Вход: 2 многоугольника (A и B) в 2D, заданные как список ребер [(x0, y0, x1, y2), ...]
каждый. Точки представлены парами double
s. Я не знаю, даны ли они по часовой стрелке, против часовой стрелки или в любом направлении. Я знаю, что они не обязательно выпуклые.
Выход: 3 многоугольника, представляющие A, B и пересекающийся многоугольник AB. Любой из них может быть пустым (?) Полигоном, например. null
.
Подсказка для оптимизации: эти полигоны представляют границы помещений и пола. Таким образом, граница комнаты обычно будет полностью пересекаться с границей пола, если она не будет принадлежать другому полу на одной плоскости (argh!).
Я как бы надеюсь, что кто-то уже сделал это в С# и позволит мне использовать их стратегию/код, поскольку то, что я нашел до сих пор по этой проблеме, довольно сложно.
РЕДАКТИРОВАТЬ. Поэтому кажется, что я не совсем цыпленок, чтобы потерять слабость в перспективе сделать это. Здесь я хотел бы указать желаемый результат, поскольку это особый случай и может упростить вычисление:
Выход: первый многоугольник минус все пересекающиеся биты, многоугольники пересечения (множественное число в порядке). Меня не интересует второй многоугольник, просто его пересечение с первым.
EDIT2. В настоящее время я использую библиотеку GPC (General Polygon Clipper), которая делает это очень простым!