2016-07-14 9 views
0

Я использую Clipper и хочу определить, пересекаются ли два (много) многоугольника.Как определить, пересекаются ли два полигона с помощью Clipper?

Мое предположение заключалось в том, что библиотека имела бы хороший, абстрактный способ задать этот вопрос, но это не похоже.

Я думал, что метод Area() может быть полезным, но он работает только на Path и метод Execute() возвращает Paths.

Я построил следующие М (почти) 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); 
} 

ответ

1

Кажется, как будто самый простой способ сделать это, чтобы подсчитать число путей в 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); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^