2017-09-15 9 views
2

私はClipperLibのC#バージョンのv6.4.2を使用しています。 私はたくさんの正方形がfishnetを構成しています。私も長方形を持っています。 矩形の内側にある四角形のみが返され、部分的に重なり合った結果が得られたいと思います。 被験者は緑色であり、クリップは赤である: enter image description hereClipperLib長方形の複数の四角形をクリップすると1つの結果が得られます

Iが得る結果は唯一の多角形である灰色/茶色の長方形である:私は完全な15を有することが期待しているであろう enter image description here

その結果、正方形と13個の四角形の四角形が表示されます。

var startX = 100; 
var startY = 250; 
const int numPolygons = 10; 

var subj = new Polygons(numPolygons * numPolygons); 
for (var i = 0; i < numPolygons; i++) 
{ 
    for (var j = 0; j < numPolygons; j++) 
    { 
     var square = new Polygon(4) 
     { 
      new IntPoint(startX, startY), 
      new IntPoint(startX + 10, startY), 
      new IntPoint(startX + 10, startY - 10), 
      new IntPoint(startX, startY - 10) 
     }; 
     subj.Add(square); 
     // Moving to the right 
     startX = startX + 10; 
    } 
    // Moving down 
    startY = startY - 10; 
    startX = 100; 
} 

var clip = new Polygons(1); 
clip.Add(new Polygon(4)); 
clip[0].Add(new IntPoint(165, 215)); 
clip[0].Add(new IntPoint(255, 215)); 
clip[0].Add(new IntPoint(255, 155)); 
clip[0].Add(new IntPoint(165, 155)); 

var solution = new Polygons(); 
var c = new Clipper.Clipper(); 
c.AddPaths(subj, PolyType.ptSubject, true); 
c.AddPaths(clip, PolyType.ptClip, true); 
c.Execute(ClipType.ctIntersection, solution, PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd); 
Debug.WriteLine("solution.Count: " + solution.Count); 

を上記のコードを実行するとされ、約0.5秒かかった場合:

これは私が使用しているコードです。クリップと被験者が切り替わるような結果が表示されるので、私はそれらを切り替えました。結果は同じですが、今は0.1秒しかかかりません。だから何か余分なことが行われます。私はそれが結果として得られる広場の合併であると思う。

私は結果をマージしたくありません。どうすればそれを防ぐことができますか?それとも、私のコードに問題がありますか?

答えて

2

Execute方法のクリッパーdocumentationによると:

ソリューション・パスについて注意すべきいくつかのものがありますが返さ:

を、これはですが... ポリゴンはめったに(共通のエッジを共有していないこと今はバージョン6のように非常にまれです)

これは、クリッピング操作を実行するとパスがマージされると思います。

私は別のPolyFillType`sで同じことをやってみましたが、どちらも成功しませんでした。

パフォーマンスを低下させる可能性がありますが、ジョブを実行する各繰り返しで、各四角形(クリッピング領域)に対して個別にExecuteメソッドを実行してみてください。

+0

実際には、私は地理参照ファイルを使用しています。そのうちの1つは220万の正方形があり、これは回転することができますが、これは互いに隣り合っています。ボーダーはたくさんのポイントを持つパーセルボーダーです。 GDAL/GEOSでクリッピングを行うことはできません。 40分後。私はそれをキャンセルする。一度にクリッパーと1人の被験者(正方形)でそれを行うのはわずか3分です。だからパフォーマンスは十分です。私はあなたの答えを受け入れるでしょう。 –

+1

小さな追加:私は 'foreach subject'を' Parallel.ForEach'に変更し、 'System.Collections.Concurrent.ConcurrentBag ()'を使ってすべてのソリューションを保存しました。今はわずか52秒です! –

+2

Clipperの最新バージョンであるPaul(まだ開発中ですが、堅牢で高速で、正式リリース以前はあまり変わっていないでしょう)はポリゴンマージがありませんので、必要な作業をしてください... https://sourceforge.net/ p /ポリクリッピング/コード/ HEAD /ツリー/サンドボックス/ Clipper2 /。また、古いClipperのExecuteInternalメソッドのJoinCommonEdges()ステートメントをコメントアウトすることもできます。 –

1

この正確なケースでは、clipper libを使わずに手作業で簡単に結果を計算できます。

すべての長方形がaxis-aligned objectsであるという事実は、計算を高速化することができるので、自分で操作をより速く実行することさえできます。

関連する問題