7

ポリゴンのリスト (IntPoints のリストのリストとして定義) を指定して、それらのいずれかが接触しているかどうかをチェックし、接触している場合はそれらを単一のポリゴンにマージするコードを作成しようとしています。これを行うために、私はすでに次の2つの方法を試しました:

List<List<IntPoint>> output=new List<List<IntPoint>>();
output = Clipper.SimplifyPolygons(input,PolyFillType.pftPositive);

Clipper c = new Clipper();
c.AddPaths(input, PolyType.ptClip, true);
c.Execute(ClipType.ctUnion, output);

現在、これらは両方ともポリゴンを非常に簡単にマージしますが、ポリゴンの空きスペースは無視され、空きエリアは単純に単一のポリゴンに結合されるため、少し過剰です。つまり、次のようになります。 接触していない 2 つのポリゴンが 1 つの正方形に統合され、意味や生命が失われるという、まったくの恐怖

起こります。これらの 2 つのポリゴンが互いに接触していないため、これは明らかに間違っています。どちらの方法でも同じ結果が得られます。結果は入力と同じになります。これを修正する方法はありますか?ソリューションはクリッパー ライブラリを使用する必要はありません (私はそれと結婚していません) が、ポイント入力のリストによって定義されるポリゴンを使用するものが必要です。そしてy。

編集この問題は、他のポリゴンの内側にポリゴンがない場合にも発生することに気付いたので、解決策は常に「塗りつぶされた」編集編集です。これは、入力がどのようなものかの例でもあります

input[0][0]
{ClipperLib.IntPoint}
    X: -724
    Y: -472
input[0][1]
{ClipperLib.IntPoint}
    X: 428
    Y: -472
input[0][2]
{ClipperLib.IntPoint}
    X: 428
    Y: -472
  input[0][3]
{ClipperLib.IntPoint}
    X: 428
    Y: 632
input[0][4]
{ClipperLib.IntPoint}
    X: 428
    Y: 632
input[0][5]
{ClipperLib.IntPoint}
    X: -724
    Y: 632
input[0][6]
{ClipperLib.IntPoint}
    X: -724
    Y: 632
input[0][7]
{ClipperLib.IntPoint}
    X: -724
    Y: -472
input[0][8]
{ClipperLib.IntPoint}
    X: -88
    Y: -218
input[0][9]
{ClipperLib.IntPoint}
    X: -107
    Y: -218
input[0][10]
{ClipperLib.IntPoint}
    X: -107
    Y: -218
input[0][11]
{ClipperLib.IntPoint}
    X: -107
    Y: -209
input[0][12]
{ClipperLib.IntPoint}
    X: -107
    Y: -209
input[0][13]
{ClipperLib.IntPoint}
    X: -320
    Y: -172
input[0][14]
{ClipperLib.IntPoint}
    X: -320
    Y: -172
input[0][15]
{ClipperLib.IntPoint}
    X: -320
    Y: 132
input[0][16]
{ClipperLib.IntPoint}
    X: -320
    Y: 132
input[0][17]
{ClipperLib.IntPoint}
    X: -88
    Y: 173
input[0][18]
{ClipperLib.IntPoint}
    X: -88
    Y: 173
input[0][19]
{ClipperLib.IntPoint}
    X: -88
    Y: -201
input[0][20]
{ClipperLib.IntPoint}
    X: -88
    Y: -201
input[0][21]
{ClipperLib.IntPoint}
    X: -88
    Y: -218

これが説明する入力は、穴が開けられた正方形です。

4

3 に答える 3

1

ライブラリには、Execute メソッドの PolyTree バージョンと、入力に穴が含まれているかどうかを考慮して、Clipper オブジェクト内のポリゴンのより複雑な構築の組み合わせが必要なようです。

穴のある緑色のポリゴンは、単なる点の配列として表されているようには見えません。外側のポリゴンと内側の穴のポリゴンを持つ PolyTree である必要があります。

于 2015-12-14T03:10:39.640 に答える