自己交差ポリゴンを分割する
どういうことかというとこういうことをやりたいんです
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でポリゴン単位に分けてくれるのであとはそれを好き勝手すればいいんです
ということで
確認するためにポリゴン毎に色を分けて表示するようにしてみましたがいい感じに分かれてくれてます
めでたしめでたし
追記
ClipperはNuGetででてきますね