【问题标题】:How do I determine if two polygons intersect using Clipper?如何使用 Clipper 确定两个多边形是否相交?
【发布时间】:2016-07-14 19:34:05
【问题描述】:

我正在使用 Clipper 并想确定两个(多)多边形是否相交。

我的期望是图书馆会有一种很好的抽象方式来提出这个问题,但似乎没有。

我认为Area() 方法可能有用,但它只适用于Path,而Execute() 方法返回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);
}

【问题讨论】:

    标签: c++ intersection clipperlib


    【解决方案1】:

    似乎最简单的方法是计算Execute() 方法返回的Paths 对象中的路径数。 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 2016-02-14
      • 1970-01-01
      • 2011-04-06
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多