пересечение cgal python - попытка вернуть многоугольник более сложный, чем треугольник - PullRequest
0 голосов
/ 28 марта 2020

Я хотел бы пересечь две фигуры, возвращая перекрытие между ними. Это должно включать, где перекрытие является довольно сложной формой (то есть не просто треугольник). В конечном счете, я хочу сделать это в 3D, но я сталкиваюсь с той же проблемой, даже когда я упрощаю это до 2D, что я не могу получить результирующую форму обратно, поскольку она не соответствует ни одному из базовых c "is_foo "шаблонные функции для CGAL :: Object.

Код ниже. Обратите внимание, что два используемых треугольника должны возвращать неправильный четырехугольник ((0,75, 0,0), (0,25, 0,0), (0,0, 1,0), (0,8, 0,2))

from CGAL.CGAL_Kernel import Point_2
from CGAL.CGAL_Kernel import Triangle_2
import CGAL.CGAL_Kernel as CGAL_Kernel

tri1=Triangle_2( *[Point_2(*acoord) for acoord in [[0,0],[1,0],[0,1]] ] )
tri2=Triangle_2( *[Point_2(*acoord) for acoord in [[1,1],[0.5,-1],[0,1]] ] ) 

intersection=CGAL_Kernel.intersection(tri1,tri2)

print(intersection.empty()) ### FALSE
print(intersection.is_Point_2()) ### FALSE
print(intersection.is_Triangle_2()) ### FALSE
print(intersection.is_Segment_2()) ### FALSE
print(intersection.is_Line_2()) ### FALSE
print(intersection.is_Ray_2()) ### FALSE

Есть ли способ вытащить четырехугольник, который я не понимаю? Я подхожу к этому неправильно? Заранее спасибо

1 Ответ

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

Проверьте документацию для пересечений . Ваше пересечение на самом деле является std :: vector. В c ++ вы можете получить это с

if (const std::vector<Point_2>* res = boost::get<std::vector<Point_2> > 
(&*result)) {
  std::cout << res.size() << std::endl;
}

, но в python я не думаю, что вы можете, в доступных на данный момент версиях.

...