Skip to Content.
Sympa Menu

cgal-discuss - [cgal-discuss] Polygons intersection

Subject: CGAL users discussion list

List archive

[cgal-discuss] Polygons intersection


Chronological Thread 
  • From: Maria Eduarda Veras Martins <>
  • To:
  • Subject: [cgal-discuss] Polygons intersection
  • Date: Thu, 18 May 2023 19:28:50 -0300
  • Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None ; spf=Pass ; spf=None
  • Ironport-data: A9a23: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 luvL1awD6uqNrD/dEfnVx/FQUO5NB5TIvWHEQ==
  • Ironport-hdrordr: A9a23:ExmG+61ZMEUWkHp1gH7HSQqjBL8kLtp133Aq2lEZdPU1SL3+qy nKpp4mPHDP+VUssR0b+exoW5PgfZq/z+8W3WB5B97LNzUO01HYSb2Kg7GSpwEI2BeTygee78 pdmmRFZ+EYxGIVsfrH
  • Ironport-phdr: A9a23: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 m3PoMZj5Vu8wLDn9w==
  • Ironport-sdr: 6466a6b1_xNXkl3RxcULpG4zQu5mELtydLGMGkQXu3TCeIQARQq+rxU+ 9S0Hwg3v5yI4sOg2Ko26oeuSXHtUtW0kwkL/7wQ==

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;
#pragma omp parallel for
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);
}
}

#pragma omp critical
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



Archive powered by MHonArc 2.6.19+.

Top of Page