Что я думаю, вы должны сделать
Не пытайтесь делать это самостоятельно, если можете помочь. Вместо этого используйте один из многих доступных алгоритмов пересечения полигонов.
Я строго рассмотрел следующую кодовую базу в силу их демонстрационного кода и того факта, что они упомянули, что они обрабатывают большинство / все странные случаи. Вам нужно будет пожертвовать сумму (по выбору вас / вашей компании), если вы используете ее в коммерческих целях, но это стоит того, чтобы получить надежную версию кода такого типа.
http://www.cs.man.ac.uk/~toby/gpc/
На самом деле я использовал алгоритм пересечения многоугольников, который является частью библиотек Java2D. Вы можете найти что-то подобное в собственных библиотеках C # от MS для использования.
Есть и другие варианты; ищите «обрезка полигонов» или «обрезка полигонов», так как те же базовые алгоритмы, которые обрабатывают пересечение полигонов, также имеют тенденцию быть пригодными для общих случаев отсечения.
Когда у вас действительно есть библиотека отсечения полигонов, вам просто нужно вычесть многоугольник B из многоугольника A, чтобы получить первый вывод, и пересечь многоугольники A и B, чтобы получить второй вывод.
Как накатить свое, для безнадежно мазохистского
Когда я подумывал о том, чтобы прокатиться самостоятельно, я обнаружил, что алгоритм Вейлера-Атертона обладает наибольшим потенциалом для общей резки полигонов. Я использовал следующие ссылки:
http://cs1.bradley.edu/public/jcm/weileratherton.html
http://en.wikipedia.org/wiki/Weiler-Atherton
Детали, как говорится, слишком плотны, чтобы включать их здесь, но я не сомневаюсь, что вы сможете найти ссылки на Вейлера-Атертона на долгие годы. По сути, вы разделяете все точки на те, которые входят в конечный многоугольник или выходят из конечного многоугольника, затем вы формируете график из всех точек и затем перемещаетесь по графику в соответствующих направлениях, чтобы извлечь все части многоугольника, которые вы хочу. Изменяя способ, которым вы определяете и обрабатываете «входящий» и «выходящий» полигоны, вы можете достичь нескольких возможных пересечений полигонов (И, ИЛИ, XOR и т. Д.).
Это на самом деле довольно реализуемо, но, как и в любом коде вычислительной геометрии, дьявол находится в вырождении.