2015-11-30 12 views
7

ポリゴンのリスト(IntPointのリストとして定義されています)があれば、それらのどれかが接触しているかどうかをチェックし、そうであればそれらを単一のポリゴンにマージします。今間違った結果を与えるポリゴンをマージすると合成する

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); 

彼らは任意の多角形のオープンスペースとしてビットoverzelousあるしかし、これらの両方が一緒に非常に簡単にポリゴンをマージ:これを行うためには、私はすでに、次の二つの方法を試してみました空白領域は無視され、単一のポリゴンに単純に結合されます。つまり、次のような意味です。 Sheer horror as a two polygons that are not touching are merged into a single square devoid of any meaning or life

が発生します。これらの2つのポリゴンが互いに接触しないので、これは明らかに間違っています。両方の方法で同じ結果が得られます。結果は入力と同じになります。どのようにこれを修正するための任意のアイデア?解決策はクリッパーライブラリ(私はそれに結婚していない)を使用する必要はありませんが、ポイントのリストで定義されているポリゴンを使用するものが必要です入力はListです> Intpointはxと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 
ようなものかもしれないものの一例です

この入力は、穴が切られた正方形です。

+0

誰でもこの問題を説明するにはどうすればよいでしょうか?ポリゴンのポリゴンがマージされていますか?エンクレーブを許可しない? – Thijser

+0

私は解決策を見つけたかもしれないと思うが、それはhttps://stackoverflow.com/questions/34263601/algoritm-for-translating-list-of-wallsections-into-coherent-polygonの答えに依存するだろう – Thijser

答えて

2

実行前にClipperPolyType.ptSubject(コードにはありません)とPolyType.ptClipが追加されている必要があります。

private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     clip = new List<List<IntPoint>>(); 
     clip.Add(pol2); 

     input = new List<List<IntPoint>>(); 
     input.Add(pol1); 

     output = new List<List<IntPoint>>(); 

     Clipper c = new Clipper(); 
     c.AddPaths(input, PolyType.ptSubject, true); 
     c.AddPaths(clip, PolyType.ptClip, true); 
     c.Execute(clipType, output); 

     DrawPolygon(output, e.Graphics, Pens.Red); 
    } 

XOR:

enter image description here

連合:

enter image description here

交差点を下記のようにまた、あなたは、あなたが望む結果を生成しますClipTypeを選択する必要があります。

enter image description here

違い:pol1からpol2

enter image description here

違い:pol2からpol1

enter image description here

+0

私は問題はそれよりも不適切な入力形式と関連がありますか? – Thijser

+0

私は、addpathsがそこから主題として自動的にそれらを追加すると思います.2つ以上のポリゴン(場合によっては1つしかありません)もあります。 – Thijser

-3

あなたに見ることができるもう一つは、SQL Server 2008で導入された空間データ型であります幾何学的形状を扱う。

https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.types.sqlgeometry.stintersection.aspx

地理は同じURLであるが、sqlgeography代わりのsqlgeometry

であなたは交差点を取得するために.STIntersects()== 1と.STIntersection(AnotherShape)を使用することができます。上記と同じ結果を得るための他の方法もあります。

この利点は、これをデータベースに組み込むと、空間索引を活用してさらに高速化できることです。

https://msdn.microsoft.com/en-us/library/bb934196.aspx

+0

便利ですが、このソフトウェアにはデータベースに関連するものは含まれていません。データベースをインストールしてもらうことをユーザーに強制するのは良い考えではないと思います。 – Thijser

+0

私はあなたの懸念を理解していますが、EntityFrameworkでの作業と同様に、.NETフレームワーク(DbGeometry/DbGeography)に含まれているクラスを使用して手動で入力することができます。これは、データベースやあらゆる種類のデータアクセスを必要としません。空間データ型の操作を容易にするように設計されたクラスの組み込み機能を利用するだけです。 –

+0

この回答は、OPが求めていることとは関係ありません。 – Randy

1

ライブラリがExecuteメソッドのPolyTreeバージョン、および入力は穴が含まれているかどうかを考慮したクリッパーオブジェクト内のポリゴンのいくつかのより複雑なビルドアップ、いくつかの組み合わせを必要とするように見えます。

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

+0

どのように私はそれにアプローチするだろうか? – Thijser

+0

入力形式の例も追加しました。 – Thijser

関連する問題