Пересечение между полигонами как линия Clipper - PullRequest
5 голосов
/ 02 марта 2020

Я пытаюсь использовать библиотеку Clipper C ++ для реализации функции is_bordering, как показано ниже.

bool is_bordering(Path p1, Path p2) {

    Paths solutions;
    Clipper c;

    // execute intersection on paths
    c.AddPath(p1, ptSubject, true);
    c.AddPath(p2, ptClip, true);
    c.Execute(ctIntersection, solutions, pftNonZero);

    return (solutions.size() > 0); // the paths share edges
}


int main() {
    Path p1, p2;
    p1 << IntPoint(0,0) << IntPoint(1,0) << IntPoint(0,1) << IntPoint(0,0);
    p2 << IntPoint(1,0) << IntPoint(1,1) << IntPoint(0,1) << IntPoint(1,0);
    cout << is_bordering(p1, p2) << endl;
}

Я думал, что когда два граничных полигона были протестированы с ctIntersection, результат будет содержат граничные края, но для меня это возвращает ложь. То, что я ожидаю от вышеупомянутого, будет следующим, с зеленым, представляющим solutions Пути.

Как заставить эту функцию работать (с библиотекой Clipper)?

1 Ответ

0 голосов
/ 18 марта 2020

Полигоны в вашем примере не пересекаются, поэтому функция is_bordering () возвращает 0, как и ожидалось. Объединение смежных полигонов будет одним полигоном, поэтому вы можете проверить это тоже:

#include "clipper.hpp"
#include <iostream>

using namespace std;
using namespace ClipperLib;

bool is_bordering(Path p1, Path p2) {
   Paths _intersection, _union;

   Clipper c;
   c.AddPath(p1, ptSubject, true);
   c.AddPath(p2, ptClip, true);
   c.Execute(ctIntersection, _intersection, pftNonZero  );
   c.Execute(ctUnion, _union, pftNonZero);
   return (_intersection.size() > 0 || _union.size() < 2);      
}


int main() {
   Path p1, p2;
   cInt I = 10;
   p1 << IntPoint(0, 0) << IntPoint(I, 0) << IntPoint(0, I) << IntPoint(0, 0);
   p2 << IntPoint(I, 0) << IntPoint(I, I) << IntPoint(0, I) << IntPoint(I, 0);

   cout << is_bordering(p1, p2) << endl;
}

Это работает только в том случае, если один полигон не полностью находится внутри другого.

...