2

Clipper を使用しており、2 つの (マルチ) ポリゴンが交差しているかどうかを判断したいと考えています。

私の期待は、図書館がこの質問をする素敵で抽象的な方法を持っているだろうということでしたが、そうではないようです。

メソッドが役立つかもしれないと思ったのArea()ですが、 でしか機能せずPathExecute()メソッドが を返しますPaths

この問題を示す次の M(ほぼ)WE を作成しました。

#include <iostream>
#include "clipper.hpp"
using namespace ClipperLib;

Paths MakeBox(int xmin, int xmax, int ymin, int ymax){
  Paths temp(1);
  temp[0] << IntPoint(xmin,ymin) << IntPoint(xmax,ymin) << IntPoint(xmax,ymax) << IntPoint(xmin,ymax);
  return temp;
}

bool Intersects(const Paths &subj, const Paths &clip){
  ClipperLib::Clipper c;

  c.AddPaths(subj, ClipperLib::ptSubject, true);
  c.AddPaths(clip, ClipperLib::ptClip,    true);

  ClipperLib::Paths solution;
  c.Execute(ClipperLib::ctIntersection, solution, ClipperLib::pftNonZero, ClipperLib::pftNonZero);

  return Area(solution);
}

int main(){
  Paths subj  = MakeBox(0,10,0,10);
  Paths clip1 = MakeBox(1,2,1,2);
  Paths clip2 = MakeBox(15,20,15,20);

  Intersects(subj,clip1);
  Intersects(subj,clip2);
}
4

1 に答える 1

4

これを行う最も簡単な方法はPaths、メソッドによって返されたオブジェクト内のパスの数をカウントすることのExecute()ようです。Pathsは単純なベクトルなので、 があればsize()==0交点はありません。

#include <iostream>
#include "clipper.hpp"
using namespace ClipperLib;

Paths MakeBox(int xmin, int xmax, int ymin, int ymax){
  Paths temp(1);
  temp[0] << IntPoint(xmin,ymin) << IntPoint(xmax,ymin) << IntPoint(xmax,ymax) << IntPoint(xmin,ymax);
  return temp;
}

bool Intersects(const Paths &subj, const Paths &clip){
  ClipperLib::Clipper c;

  c.AddPaths(subj, ClipperLib::ptSubject, true);
  c.AddPaths(clip, ClipperLib::ptClip,    true);

  ClipperLib::Paths solution;
  c.Execute(ClipperLib::ctIntersection, solution, ClipperLib::pftNonZero, ClipperLib::pftNonZero);

  return solution.size()!=0;
}

int main(){
  Paths subj  = MakeBox(0,10,0,10);
  Paths clip1 = MakeBox(1,2,1,2);
  Paths clip2 = MakeBox(15,20,15,20);

  Intersects(subj,clip1);
  Intersects(subj,clip2);
}
于 2016-07-14T19:35:32.870 に答える