diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cgal.h | 6 | ||||
-rw-r--r-- | src/cgaladv.cc | 4 | ||||
-rw-r--r-- | src/cgaladv_convexhull2.cc | 59 | ||||
-rw-r--r-- | src/cgaladv_minkowski2.cc | 20 |
4 files changed, 75 insertions, 14 deletions
@@ -10,6 +10,9 @@ #include <CGAL/Polyhedron_3.h> #include <CGAL/Nef_polyhedron_3.h> #include <CGAL/IO/Polyhedron_iostream.h> +#include <CGAL/Exact_predicates_exact_constructions_kernel.h> +#include <CGAL/Polygon_2.h> +#include <CGAL/Polygon_with_holes_2.h> typedef CGAL::Extended_cartesian<CGAL::Gmpq> CGAL_Kernel2; typedef CGAL::Nef_polyhedron_2<CGAL_Kernel2> CGAL_Nef_polyhedron2; @@ -24,6 +27,9 @@ typedef CGAL_Nef_polyhedron3::Aff_transformation_3 CGAL_Aff_transformation; typedef CGAL_Nef_polyhedron3::Vector_3 CGAL_Vector; typedef CGAL_Nef_polyhedron3::Plane_3 CGAL_Plane; typedef CGAL_Nef_polyhedron3::Point_3 CGAL_Point; +typedef CGAL::Exact_predicates_exact_constructions_kernel CGAL_ExactKernel2; +typedef CGAL::Polygon_2<CGAL_ExactKernel2> CGAL_Poly2; +typedef CGAL::Polygon_with_holes_2<CGAL_ExactKernel2> CGAL_Poly2h; struct CGAL_Nef_polyhedron { diff --git a/src/cgaladv.cc b/src/cgaladv.cc index 3e53569..48f14c7 100644 --- a/src/cgaladv.cc +++ b/src/cgaladv.cc @@ -30,11 +30,11 @@ #include "builtin.h" #include "printutils.h" #include "cgal.h" -#include <CGAL/ch_graham_andrew.h> #ifdef ENABLE_CGAL extern CGAL_Nef_polyhedron3 minkowski3(CGAL_Nef_polyhedron3 a, CGAL_Nef_polyhedron3 b); extern CGAL_Nef_polyhedron2 minkowski2(CGAL_Nef_polyhedron2 a, CGAL_Nef_polyhedron2 b); +extern CGAL_Nef_polyhedron2 convexhull2(CGAL_Nef_polyhedron2 a, CGAL_Nef_polyhedron2 b); #endif enum cgaladv_type_e { @@ -197,7 +197,7 @@ CGAL_Nef_polyhedron CgaladvNode::render_cgal_nef_polyhedron() const } if (N.dim == 2 && tmp.dim == 2) { - + N.p2 = convexhull2(N.p2, tmp.p2); } } v->progress_report(); diff --git a/src/cgaladv_convexhull2.cc b/src/cgaladv_convexhull2.cc new file mode 100644 index 0000000..9505e44 --- /dev/null +++ b/src/cgaladv_convexhull2.cc @@ -0,0 +1,59 @@ +/* + * OpenSCAD (www.openscad.org) + * Copyright (C) 2009-2011 Clifford Wolf <clifford@clifford.at> and + * Marius Kintel <marius@kintel.net> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * As a special exception, you have permission to link this program + * with the CGAL library and distribute executables, as long as you + * follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from CGAL. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef ENABLE_CGAL + +#include "cgal.h" +#include <CGAL/convex_hull_2.h> + +extern CGAL_Nef_polyhedron2 convexhull2(CGAL_Nef_polyhedron2 a, CGAL_Nef_polyhedron2 b); +extern CGAL_Poly2 nef2p2(CGAL_Nef_polyhedron2 p); + +static std::list<CGAL_Nef_polyhedron2::Point> p2points(CGAL_Poly2 p2) +{ + std::list<CGAL_Nef_polyhedron2::Point> points; + for (int j = 0; j < p2.size(); j++) { + double x = to_double(p2[j].x()), y = to_double(p2[j].y()); + CGAL_Nef_polyhedron2::Point p = + CGAL_Nef_polyhedron2::Point(x, y); + points.push_back(p); + } + return points; +} + +CGAL_Nef_polyhedron2 convexhull2(CGAL_Nef_polyhedron2 a, CGAL_Nef_polyhedron2 b) +{ + CGAL_Poly2 ap = nef2p2(a); + std::list<CGAL_Nef_polyhedron2::Point> points = p2points(ap), result; + + CGAL::convex_hull_2(points.begin(), points.end(), + std::back_inserter(result)); + std::cout << result.size() << " points on the convex hull" << std::endl; + return CGAL_Nef_polyhedron2(result.begin(), + result.end(), CGAL_Nef_polyhedron2::INCLUDED); +} + +#endif diff --git a/src/cgaladv_minkowski2.cc b/src/cgaladv_minkowski2.cc index d03943c..116139f 100644 --- a/src/cgaladv_minkowski2.cc +++ b/src/cgaladv_minkowski2.cc @@ -33,14 +33,10 @@ #if 1 -#include <CGAL/Exact_predicates_exact_constructions_kernel.h> #include <CGAL/minkowski_sum_2.h> extern CGAL_Nef_polyhedron2 minkowski2(CGAL_Nef_polyhedron2 a, CGAL_Nef_polyhedron2 b); - -struct K2 : public CGAL::Exact_predicates_exact_constructions_kernel {}; -typedef CGAL::Polygon_2<K2> Poly2; -typedef CGAL::Polygon_with_holes_2<K2> Poly2h; +extern CGAL_Poly2 nef2p2(CGAL_Nef_polyhedron2 p); //----------------------------------------------------------------------------- // Pretty-print a CGAL polygon. @@ -80,9 +76,9 @@ void print_polygon_with_holes (const CGAL::Polygon_with_holes_2<Kernel, Containe return; } -static Poly2 nef2p2(CGAL_Nef_polyhedron2 p) +CGAL_Poly2 nef2p2(CGAL_Nef_polyhedron2 p) { - std::list<K2::Point_2> points; + std::list<CGAL_ExactKernel2::Point_2> points; Grid2d<int> grid(GRID_COARSE); typedef CGAL_Nef_polyhedron2::Explorer Explorer; @@ -110,14 +106,14 @@ static Poly2 nef2p2(CGAL_Nef_polyhedron2 p) double x = to_double(ep.x()), y = to_double(ep.y()); std::cout << "point " << ep << std::endl; grid.align(x, y); - points.push_back(K2::Point_2(x, y)); + points.push_back(CGAL_ExactKernel2::Point_2(x, y)); } } } - return Poly2(points.begin(), points.end()); + return CGAL_Poly2(points.begin(), points.end()); } -static CGAL_Nef_polyhedron2 p2nef2(Poly2 p2) { +static CGAL_Nef_polyhedron2 p2nef2(CGAL_Poly2 p2) { std::list<CGAL_Nef_polyhedron2::Point> points; for (int j = 0; j < p2.size(); j++) { double x = to_double(p2[j].x()); @@ -130,7 +126,7 @@ static CGAL_Nef_polyhedron2 p2nef2(Poly2 p2) { CGAL_Nef_polyhedron2 minkowski2(CGAL_Nef_polyhedron2 a, CGAL_Nef_polyhedron2 b) { - Poly2 ap = nef2p2(a), bp = nef2p2(b); + CGAL_Poly2 ap = nef2p2(a), bp = nef2p2(b); std::cout << "ap = "; print_polygon(ap); std::cout << "bp = "; print_polygon(bp); @@ -141,7 +137,7 @@ CGAL_Nef_polyhedron2 minkowski2(CGAL_Nef_polyhedron2 a, CGAL_Nef_polyhedron2 b) PRINT("WARNING: minkowski() could not get any points from object 2!"); return CGAL_Nef_polyhedron2(); } else { - Poly2h x = minkowski_sum_2(ap, bp); + CGAL_Poly2h x = minkowski_sum_2(ap, bp); std::cout << "result = "; print_polygon_with_holes(x); // Make a CGAL_Nef_polyhedron2 out of just the boundary for starters |