プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

自己交差ポリゴンを分割する

どういうことかというとこういうことをやりたいんです

f:id:puni-o:20180330100108j:plain

WPFの画面ですが、左側は5点で構成されているポリゴンです

FillRuleがEvenOddになっているので偶数回重なっているところは塗りつぶさないようになってます

んで、これを右側のように5個のポリゴンに分けたいんです

自己交差ポリゴンに対応していないようなうんこソフトに対応するためしょーがない、やらなきゃいけない

Clipper

今更車輪の再発明してできの悪いわっか作ってもしょうがないのでググりますとでてきますよすごいライブラリ

Clipper - an open source freeware polygon clipping library

クリッピングの便利ライブラリらしいですよ。URLにdelphiとか入っていますがC#用もあります

このクラスの中に

//------------------------------------------------------------------------------
// SimplifyPolygon functions ...
// Convert self-intersecting polygons into simple polygons
//------------------------------------------------------------------------------
public static Paths SimplifyPolygon(Path poly, PolyFillType fillType = PolyFillType.pftEvenOdd)

まさにそのものがあります

呼ぶのも簡単で

var p = new List<IntPoint>();
foreach (var point in _clickPoints) p.Add(new IntPoint(point.X, point.Y));  // _clickPointsに元の座標が入っている
var sp = ClipperLib.Clipper.SimplifyPolygon(p);

SimplifyPolygonでポリゴン単位に分けてくれるのであとはそれを好き勝手すればいいんです

ということで

f:id:puni-o:20180330102048g:plain

確認するためにポリゴン毎に色を分けて表示するようにしてみましたがいい感じに分かれてくれてます

めでたしめでたし


追記

ClipperはNuGetででてきますね