Skip to Content.
Sympa Menu

cgal-discuss - Re: [cgal-discuss] Polygons intersection

Subject: CGAL users discussion list

List archive

Re: [cgal-discuss] Polygons intersection


Chronological Thread 
  • From: Maria Eduarda Veras Martins <>
  • To:
  • Subject: Re: [cgal-discuss] Polygons intersection
  • Date: Fri, 19 May 2023 15:14:52 -0300
  • Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None ; spf=Pass ; spf=None
  • Ironport-data: A9a23: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 Yl2x0Ac9SRdDn2kqSj/KxB7bSpaKivm+081
  • Ironport-hdrordr: A9a23:vnSz9q6RccONmjalbgPXwPHXdLJyesId70hD6qkRc20tTiX8ra qTdZsgpHrJYVoqKRMdcJW7Scq9qBDnlKKdg7NhWYtKNTOO0ACVxcNZjbcKqAeQfBEWmNQts5 uIsJITNDQzNzVHZArBjzVQ2uxP/OW6
  • Ironport-phdr: A9a23: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 AM4kgY4a/5/rF/R
  • Ironport-sdr: 6467bca9_8d0udWHrWAIdPpN+HnUQqV6sDYjpChowtCBp5BW1rx2S+xv gvM13FYGPQGBhKVlJXX1dgRwBNh/fhWn3fchL8Q==

plane_3::to_2d only removes the z coordinate. That way I could lose a lot of information by removing this coordinate. In addition, I create one polygon with segment_3, would that not be a problem in this implementation?

Thank you!

Em sex., 19 de mai. de 2023 às 04:03, Sebastien Loriot <> escreveu:
Intersection of polygons is using the Arrangement package.
The projection traits is not a model of the traits concept required
by the arrangement.
So first you need a kernel with exact constructions for computing the
intersection (something like
CGAL::Exact_predicates_exact_constructions_kernel).

What I would do:
- Pick a common plane
- use Plane_3::to_2d to produce 2d polygons
- compute the intersection
- use Plane_3::to_3d to turn the 2d polygon in a 3d one.
- compute the area of the 3d polygon (using Gauss formula with a point
in the plane for exemple).

HTH,

Sebastien.



On 5/19/23 00:28, Maria Eduarda Veras Martins ( via
cgal-discuss Mailing List) wrote:
> Hi again,
> I need to find the intersection area of two polygons, the biggest
> problem is that they are in 3d. I tried to use projection traits but
> when I use some intersection function like do_intersect or
> CGAL::intersection, several errors occur.
> Here is my code so far, im already able to create the polygons!
> #include<iostream>
> #include<list>
> #include<map>
> #include<vector>
> #include<omp.h>
>
> #include<CGAL/Exact_predicates_inexact_constructions_kernel.h>
> #include<CGAL/Boolean_set_operations_2.h>
>
> #include<CGAL/Projection_traits_3.h>
> #include<CGAL/Polygon_2.h>
> #include<CGAL/Polygon_with_holes_2.h>
> #include<CGAL/Polygon_2_algorithms.h>
>
> #include<CGAL/AABB_tree.h>
> #include<CGAL/AABB_traits.h>
> #include<CGAL/Polyhedron_3.h>
> #include<CGAL/AABB_face_graph_triangle_primitive.h>
>
> typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
>
> typedef CGAL::Projection_traits_3 <K> GT;
> typedef CGAL::Polygon_2 <GT> Polygon;
> typedef CGAL::Polygon_with_holes_2 <GT> Polygon_with_holes;
>
> typedef K::Point_3 Point;
> typedef K::Plane_3 Plane;
> typedef K::Vector_3 Vector;
> typedef K::Segment_3 Segment;
>
> typedef CGAL::Polyhedron_3<K> Polyhedron;
> typedef CGAL::AABB_face_graph_triangle_primitive<Polyhedron> Primitive_poly;
> typedef CGAL::AABB_traits<K, Primitive_poly> Traits_poly;
> typedef CGAL::AABB_tree<Traits_poly> Tree_poly;
> typedef Tree_poly::Object_and_primitive_id Object_and_primitive_id_poly;
>
> struct Plane_compare {
> bool operator()(const Plane& p1, const Plane& p2) const {
> // Use a combinação dos coeficientes dos planos para compará-los
> return std::make_tuple(p1.a(), p1.b(), p1.c(), p1.d()) <
> std::make_tuple(p2.a(), p2.b(), p2.c(), p2.d());
> }
> };
>
> struct Segment_compare {
> bool operator() (const Segment& seg1, const Segment& seg2) const {
> return seg1.source() < seg2.source() || (!(seg2.source() <
> seg1.source()) && seg1.target() < seg2.target());
> }
> };
>
> Polygon seg_into_polygon (std::list <Segment>& segments, const Vector&
> plane_normal) {
> std::map <Segment, std::pair <Point, Point>, Segment_compare> segments_map;
> for (const auto& seg : segments) {
> segments_map[seg] = {seg.source(), seg.target()};
> }
> Segment current_seg = segments.front();
>
> GT gt {plane_normal};
> Polygon polygon(gt);
>
> polygon.push_back(current_seg.source());
> polygon.push_back(current_seg.target());
> segments_map.erase(current_seg);
>
> while (!segments_map.empty()) {
>
> if (segments_map.size() == 1) {
> break;
> }
> bool find_flag = false;
> Segment temp;
> for (auto& it : segments_map) {
> if (it.second.first == current_seg.target()) {
> polygon.push_back(it.second.second);
> temp = it.first;
> current_seg = it.first;
> find_flag = true;
> break;
> }
> }
>
> if (find_flag == true) {
> segments_map.erase(temp);
> }
> else {
> for (auto& it : segments_map) {
> if (it.second.second == current_seg.target()) {
> polygon.push_back(it.second.first);
> temp = it.first;
> current_seg = it.first;
> find_flag = true;
> break;
> }
> }
>
> if (find_flag == true) {
> segments_map.erase(temp);
> }
>
> }
> }
>
> //std::cout << "Poligono criado: " << polygon << std::endl;
>
> return polygon;
>
> }
>
> int main()
> {
> Point p(1.0, 0.0, 0.0);
> Point q(0.0, 1.0, 0.0);
> Point r(0.0, 0.0, 1.0);
> Point s(0.0, 0.0, 0.0);
> Polyhedron polyhedron;
> polyhedron.make_tetrahedron(p, q, r, s);
>
> std::ofstream out ("tetrahedron.off");
> out << polyhedron;
> out.close();
>
> // constructs AABB tree
> Tree_poly tree(faces(polyhedron).first, faces(polyhedron).second,
> polyhedron);
>
> //planes
> std::vector <Plane> planes;
> Point pE (0.58, 0, 0);
> Point pF (0.58, 0, 0.42);
> Point pG (0, 0.62, 0.38);
> Plane p1 (pF, pG, pE);
> planes.push_back(p1);
>
> Point pH (0.26, 0, 0);
> Point pI (0, 0, 0.5);
> Point pJ (0, 0.32, 0);
> Plane p2 (pH, pI, pJ);
> planes.push_back(p2);
>
> Plane p3 (pI, pG, pF);
> planes.push_back(p3);
>
> std::map <Plane, std::list <Segment>, Plane_compare> planes_intersections;
> std::list <Polygon> polygon_teste;
> #pragmaompparallelfor
> for (size_t i = 0; i < planes.size(); i++) {
> std::list <Object_and_primitive_id_poly> intersections;
> tree.all_intersections(planes[i], std::back_inserter(intersections));
>
> std::list <Object_and_primitive_id_poly>::iterator it_intersections =
> intersections.begin();
> std::list <Segment> segments;
>
> for (; it_intersections != intersections.end(); ++it_intersections) {
> Object_and_primitive_id_poly op = *it_intersections;
> CGAL::Object obj = op.first;
> Segment s;
> if (CGAL::assign(s, obj)) {
> segments.push_back(s);
> }
> }
>
> #pragmaompcritical
> planes_intersections[planes[i]] = segments;
> if (i == 2) {
> polygon_teste.push_back(seg_into_polygon(segments,
> planes[i].orthogonal_vector()));
> }
> else
> Polygon temp = seg_into_polygon(segments, planes[i].orthogonal_vector());
> }
>
>
> //prints for debugging
> for (const auto& aux : planes_intersections) {
> std::cout << "Plano:" << aux.first << std::endl;
>
> std::cout << "Segmentos: " << std::endl;
> std::list <Segment> list_seg = aux.second;
> for (const auto& item : list_seg) {
> std::cout << item << std::endl;
> }
> std::cout << std::endl;
> }
>
> //intersection with coplanar polygon
> //testing with plane (-0.05x - 0.07y - 0.36z = -0.18)
> //polygon c = (0, 0, 0.5) (0, 0.62, 0.38) (0.58, 0, 0.42)
> //frature cell = (1.07, -0.66, 0.48) (0.27, 0.14, 0.44) (0.75, 0.39, 0.32)
>
> std::list <Segment> temp_cel;
> Segment k (Point(1.07, -0.66, 0.48), Point(0.27, 0.14, 0.44));
> temp_cel.push_back(k);
> Segment l (Point(0.75, 0.39, 0.32), Point(1.07, -0.66, 0.48));
> temp_cel.push_back(l);
> Segment m (Point(0.27, 0.14, 0.44), Point(0.75, 0.39, 0.32));
> temp_cel.push_back(m);
>
> //green polygon
> Polygon frature_cel = seg_into_polygon(temp_cel, p3.orthogonal_vector());
> //red polygon
> Polygon polygon_c = polygon_teste.front();
>
> std::cout << "frature_cel: " << frature_cel << std::endl;
> std::cout << "Area = " << frature_cel.area() << std::endl;
>
> std::cout << "polygon c: " << polygon_c << std::endl;
> std::cout << "Area = " << polygon_c.area() << std::endl;
>
> return 0;
> }
>
> to make it clearer, the purple area is the one I need to find.
> image.png
>
> --
> You are currently subscribed to cgal-discuss.
> To unsubscribe or access the archives, go to
> https://sympa.inria.fr/sympa/info/cgal-discuss
>

--
You are currently subscribed to cgal-discuss.
To unsubscribe or access the archives, go to
https://sympa.inria.fr/sympa/info/cgal-discuss





Archive powered by MHonArc 2.6.19+.

Top of Page