Пересечение между линией и полигоном с использованием библиотеки клиперов - PullRequest
1 голос
/ 11 октября 2019

Я перепробовал все возможности. Но я не получаю точку пересечения между линией и многоугольником.

Paths clip(1), soln , pol(1);
clip[0] << IntPoint(1,1) << IntPoint(30,30) ;
pol[0] << IntPoint(10,10) << IntPoint(20, 10) << IntPoint(20,20) << 
IntPoint(10, 20) << IntPoint(10, 10);
Path line= clip[0];
Path poly = pol[0];
Clipper c;
c.AddPath(line, ptSubject, true);
c.AddPath(poly, ptClip, true);
c.Execute(ctIntersection, soln, pftNonZero, pftNonZero);
std::cout << soln.size() ;

1 Ответ

2 голосов
/ 11 октября 2019
  1. Вы используете неправильное переопределение Execute для пересечений открытого пути. Когда предметом является линия, тогда решение должно быть PolyTree, а не Paths.

    ... когда открытые пути передаются объекту Clipper, пользователь должен использовать объект PolyTree в качестве параметра решения, в противном случае возникнет исключение. [src]

  2. Тема строки, которую вы должны открыть или не закрыть с помощью третьего параметра AddPath.

    Функция вернет false, если путь недопустим для отсечения. Путь недопустим для отсечения, когда он имеет 2 вершины, но не является открытым путем. [src]

Поэтому измените следующим образом:

c.AddPath(line, ptSubject, false); // a line is open
c.AddPath(poly, ptClip, true); // a polygon is closed
PolyTree soln; // the solution is a tree
c.Execute(ctIntersection, soln);
...