use target(), not source(), making 'simple' the 2d polygon

created during the 'flattening' process from 3d to 2d.
not sure why this works, but it does.
felipesanches-svg
don bright 2012-10-24 04:14:52 -05:00
parent 5b92e171ea
commit 45a99bfe36
2 changed files with 60 additions and 28 deletions

View File

@ -1,7 +1,10 @@
#include "PolySetCGALEvaluator.h" #include "PolySetCGALEvaluator.h"
#include "cgal.h" #include "cgal.h"
#include "cgalutils.h" #include "cgalutils.h"
#include <CGAL/convex_hull_3.h> #include <CGAL/convex_hull_3.h>
#include <CGAL/Polygon_2_algorithms.h>
#include "polyset.h" #include "polyset.h"
#include "CGALEvaluator.h" #include "CGALEvaluator.h"
#include "projectionnode.h" #include "projectionnode.h"
@ -28,6 +31,14 @@ stripping off the z coordinate of each face vertex and doing unions and
intersections. It uses the 'visitor' pattern from the CGAL manual. intersections. It uses the 'visitor' pattern from the CGAL manual.
Output is in the 'output_nefpoly2d' variable. Output is in the 'output_nefpoly2d' variable.
Some key things to know about Nef Polyhedron2:
1. The 'mark' on a face is important when doing unions/intersections
2. The 'mark' on a face is determined by the order of the points given
to the Nef2 constructor.
3. The points given to a constructor might be influenced by whether
they are 'is_simple' or not.
See also See also
http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Nef_3/Chapter_main.html http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Nef_3/Chapter_main.html
http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Nef_3_ref/Class_Nef_polyhedron3.html http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Nef_3_ref/Class_Nef_polyhedron3.html
@ -128,7 +139,7 @@ public:
out << " <!-- Halffacet visit -->\n"; out << " <!-- Halffacet visit -->\n";
out << " <!-- mark:" << hfacet->mark() << " -->\n"; out << " <!-- mark:" << hfacet->mark() << " -->\n";
if ( hfacet->plane().orthogonal_direction() != this->up ) { if ( hfacet->plane().orthogonal_direction() != this->up ) {
out << "\ndown facing half-facet. skipping\n"; out << "\ndown facing half-facet. not skipping\n";
out << " <!-- Halffacet visit end-->\n"; out << " <!-- Halffacet visit end-->\n";
std::cout << out.str(); std::cout << out.str();
return; return;
@ -137,14 +148,14 @@ public:
bool skip=false; bool skip=false;
CGAL_Nef_polyhedron3::Halffacet_cycle_const_iterator i; CGAL_Nef_polyhedron3::Halffacet_cycle_const_iterator i;
CGAL_forall_facet_cycles_of( i, hfacet ) { CGAL_forall_facet_cycles_of( i, hfacet ) {
CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c1(i), c2(c1); CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c1a(i), c2a(c1a);
CGAL_For_all( c1, c2 ) { CGAL_For_all( c1a, c2a ) {
CGAL_Nef_polyhedron3::Point_3 point3d = c1->source()->source()->point(); CGAL_Nef_polyhedron3::Point_3 point3d = c1a->source()->source()->point();
if (point3d.z()!=0) skip=true; if (point3d.z()!=0) skip=true;
} }
} }
if (skip) { if (skip) {
out << "\n facet not on zero plane. skipping\n"; out << "\n facet not on zero plane. skipping\n";
out << " <!-- Halffacet visit end-->\n"; out << " <!-- Halffacet visit end-->\n";
std::cout << out.str(); std::cout << out.str();
return; return;
@ -152,33 +163,53 @@ public:
int contour_counter = 0; int contour_counter = 0;
CGAL_forall_facet_cycles_of( i, hfacet ) { CGAL_forall_facet_cycles_of( i, hfacet ) {
CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c1(i), c2(c1); if ( i.is_shalfedge() ) {
std::vector<CGAL_Nef_polyhedron2::Explorer::Point> contour; CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c1(i), c2(c1);
CGAL_For_all( c1, c2 ) { std::vector<CGAL_Nef_polyhedron2::Explorer::Point> contour;
CGAL_Nef_polyhedron3::Point_3 point3d = c1->source()->source()->point(); CGAL_For_all( c1, c2 ) {
CGAL_Nef_polyhedron2::Explorer::Point point2d( point3d.x(), point3d.y() ); out << "around facet. c1 mark:" << c1->mark() << "\n";
contour.push_back( point2d ); CGAL_Nef_polyhedron3::Point_3 point3d = c1->source()->target()->point();
} CGAL_Nef_polyhedron2::Explorer::Point point2d( point3d.x(), point3d.y() );
out << "around facet. point3d:" << CGAL::to_double(point3d.x()) << "," << CGAL::to_double(point3d.y()) << "\n";;
out << "around facet. point2d:" << CGAL::to_double(point2d.x()) << "," << CGAL::to_double(point2d.y()) << "\n";;
if (contour.size()) out << "equality:" << (contour.back() == point2d) << "\n";;
out << "equality2 :" << ( c1->target()->source() == c1->source()->target() ) << "\n";;
contour.push_back( point2d );
}
tmpnef2d.reset( new CGAL_Nef_polyhedron2( contour.begin(), contour.end(), boundary ) ); // Type given to Polygon_2 has to match Nef2::Explorer::Point
// (which is not the same as CGAL_Kernel2::Point)
std::vector<CGAL_Nef_polyhedron2::Explorer::Point>::iterator xx;
for ( xx=contour.begin(); xx!=contour.end(); ++xx ) {
out << "pdump: " << CGAL::to_double(xx->x()) << "," << CGAL::to_double(xx->y()) << "\n";
}
out << "is simple 2:" << CGAL::is_simple_2( contour.begin(), contour.end() ) << "\n";
//CGAL::Polygon_2<CGAL::Simple_cartesian<NT> > plainpoly2( contour.begin(), contour.end() );
//out << "clockwise orientation: " << plainpoly2.is_clockwise_oriented() << "\n";
tmpnef2d.reset( new CGAL_Nef_polyhedron2( contour.begin(), contour.end(), boundary ) );
// *(tmpnef2d) = tmpnef2d->regularization();
// mark here.
out << "\n<!-- ======== output accumulator 0: ==== -->\n"; out << "\n<!-- ======== output accumulator 0: ==== -->\n";
out << dump_cgal_nef_polyhedron2_svg( *output_nefpoly2d ); out << dump_cgal_nef_polyhedron2_svg( *output_nefpoly2d );
if ( contour_counter == 0 ) { if ( contour_counter == 0 ) {
out << "\n <!-- contour is a body. make union(). " << contour.size() << " points. -->\n" ; out << "\n <!-- contour is a body. make union(). " << contour.size() << " points. -->\n" ;
*(output_nefpoly2d) += *(tmpnef2d); *(output_nefpoly2d) += *(tmpnef2d);
} else {
*(output_nefpoly2d) *= *(tmpnef2d);
if (debug) out << "\n<!-- contour is a hole. make intersection(). " << contour.size() << " points. -->\n";
}
out << "\n<!-- ======== output tmp nef2d: ====== -->\n";
out << dump_cgal_nef_polyhedron2_svg( *tmpnef2d );
out << "\n<!-- ======== output accumulator 1: ==== -->\n";
out << dump_cgal_nef_polyhedron2_svg( *output_nefpoly2d );
contour_counter++;
} else { } else {
*(output_nefpoly2d) *= *(tmpnef2d); out << "trivial facet cycle skipped\n";
if (debug) out << "\n<!-- contour is a hole. make intersection(). " << contour.size() << " points. -->\n";
} }
out << "\n<!-- ======== output tmp nef2d: ====== -->\n";
out << dump_cgal_nef_polyhedron2_svg( *tmpnef2d );
out << "\n<!-- ======== output accumulator 1: ==== -->\n";
out << dump_cgal_nef_polyhedron2_svg( *output_nefpoly2d );
contour_counter++;
} // next facet cycle (i.e. next contour) } // next facet cycle (i.e. next contour)
out << " <!-- Halffacet visit end -->\n"; out << " <!-- Halffacet visit end -->\n";
std::cout << out.str(); std::cout << out.str();

View File

@ -9,7 +9,8 @@ typedef CGAL::Point_3<CGAL_Kernel3> CGAL_Point_3;
typedef CGAL::Iso_cuboid_3<CGAL_Kernel3> CGAL_Iso_cuboid_3; typedef CGAL::Iso_cuboid_3<CGAL_Kernel3> CGAL_Iso_cuboid_3;
typedef CGAL_Nef_polyhedron2::Explorer::Point CGAL_Point_2; typedef CGAL_Nef_polyhedron2::Explorer::Point CGAL_Point_2;
// Iso_rectangle is different- CGAL_Kernel2::Point != CGAL_Nef2::Explorer::Point // Iso_rectangle needs to match CGAL_Nef2::Explorer::Point
// which is different than CGAL_Kernel2::Point
typedef CGAL::Iso_rectangle_2< CGAL::Simple_cartesian<NT> > CGAL_Iso_rectangle_2; typedef CGAL::Iso_rectangle_2< CGAL::Simple_cartesian<NT> > CGAL_Iso_rectangle_2;
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>