Subject: CGAL users discussion list
List archive
- From: Sebastien Loriot <>
- To:
- Subject: Re: [cgal-discuss] Polygons intersection
- Date: Fri, 19 May 2023 09:03:18 +0200
- Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None ; spf=Pass ; spf=None
- Ironport-data: A9a23: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 lTZiYyJrI9XhKIx/Qtdl6ZpJSwk
- Ironport-hdrordr: A9a23:6J7FEqt/HHL2QbuYRQRNrITT7skDVdV00zEX/kB9WHVpm7+j5q aTdZMgpGPJYVcqKQwdcLW7UpVoLkmsl6KdjbNhRotKGTOWwldAT7sSiLcKoQeQeBEWn9Q1vc wBT0E9MqyJMbETt6fHCWKDYrEdKbe8gdmVbKvlvhNQpMJRB52ILT0VNu9WKCJLrcB9a6YEKA ==
- Ironport-phdr: A9a23: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 x8yzAB5ZLZ1nAo=
- Ironport-sdr: 64671f38_g/B1KFQMCbtxSjwUWLyGGBfv5AvPdPxRlH/36O89FYgKfuG 2OD1v2CGIGsCIesJHTJfUazgf5ce0wbGub0Ph9g==
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
- [cgal-discuss] Polygons intersection, Maria Eduarda Veras Martins, 05/19/2023
- Re: [cgal-discuss] Polygons intersection, Sebastien Loriot, 05/19/2023
- Re: [cgal-discuss] Polygons intersection, Maria Eduarda Veras Martins, 05/19/2023
- Re: [cgal-discuss] Polygons intersection, Sebastien Loriot, 05/22/2023
- Re: [cgal-discuss] Polygons intersection, Maria Eduarda Veras Martins, 05/19/2023
- Re: [cgal-discuss] Polygons intersection, Sebastien Loriot, 05/19/2023
Archive powered by MHonArc 2.6.19+.