diff options
-rw-r--r-- | openscad.pro | 1 | ||||
-rw-r--r-- | src/CGALEvaluator.cc | 22 | ||||
-rw-r--r-- | src/cgaladv_convexhull2.cc | 54 | ||||
-rw-r--r-- | testdata/scad/features/hull2-tests.scad | 9 | ||||
-rw-r--r-- | tests/CMakeLists.txt | 3 | ||||
-rw-r--r-- | tests/regression/cgalpngtest/hull2-tests-expected.png | bin | 7531 -> 7121 bytes | |||
-rw-r--r-- | tests/regression/dumptest/hull2-tests-expected.txt | 24 | ||||
-rw-r--r-- | tests/regression/opencsgtest/hull2-tests-expected.png | bin | 8078 -> 7924 bytes | |||
-rw-r--r-- | tests/regression/throwntogethertest/hull2-tests-expected.png | bin | 4151 -> 7924 bytes |
9 files changed, 48 insertions, 65 deletions
diff --git a/openscad.pro b/openscad.pro index 4a1c0f3..e88a94b 100644 --- a/openscad.pro +++ b/openscad.pro @@ -274,7 +274,6 @@ SOURCES += src/cgalutils.cc \ src/CGALRenderer.cc \ src/CGAL_Nef_polyhedron.cc \ src/CGAL_Nef_polyhedron_DxfData.cc \ - src/cgaladv_convexhull2.cc \ src/cgaladv_minkowski2.cc } diff --git a/src/CGALEvaluator.cc b/src/CGALEvaluator.cc index 1772354..684ab42 100644 --- a/src/CGALEvaluator.cc +++ b/src/CGALEvaluator.cc @@ -116,13 +116,12 @@ CGAL_Nef_polyhedron CGALEvaluator::applyToChildren(const AbstractNode &node, CGA return N; } -extern CGAL_Nef_polyhedron2 *convexhull2(std::list<CGAL_Nef_polyhedron2*> a); - CGAL_Nef_polyhedron CGALEvaluator::applyHull(const CgaladvNode &node) { CGAL_Nef_polyhedron N; std::list<CGAL_Nef_polyhedron2*> polys; - std::list<CGAL_Polyhedron::Vertex::Point_3> points; + std::list<CGAL_Nef_polyhedron2::Point> points2d; + std::list<CGAL_Polyhedron::Vertex::Point_3> points3d; int dim = 0; BOOST_FOREACH(const ChildItem &item, this->visitedchildren[node.index()]) { const AbstractNode *chnode = item.first; @@ -137,23 +136,32 @@ CGAL_Nef_polyhedron CGALEvaluator::applyHull(const CgaladvNode &node) continue; } if (dim == 2) { - polys.push_back(chN.p2.get()); + CGAL_Nef_polyhedron2::Explorer explorer = chN.p2->explorer(); + BOOST_FOREACH(const CGAL_Nef_polyhedron2::Explorer::Vertex &vh, + std::make_pair(explorer.vertices_begin(), explorer.vertices_end())) { + if (explorer.is_standard(&vh)) { + points2d.push_back(explorer.point(&vh)); + } + } } else if (dim == 3) { CGAL_Polyhedron P; chN.p3->convert_to_Polyhedron(P); - std::transform(P.vertices_begin(), P.vertices_end(), std::back_inserter(points), + std::transform(P.vertices_begin(), P.vertices_end(), std::back_inserter(points3d), boost::bind(static_cast<const CGAL_Polyhedron::Vertex::Point_3&(CGAL_Polyhedron::Vertex::*)() const>(&CGAL_Polyhedron::Vertex::point), _1)); } chnode->progress_report(); } if (dim == 2) { - N = CGAL_Nef_polyhedron(convexhull2(polys)); + std::list<CGAL_Nef_polyhedron2::Point> result; + CGAL::convex_hull_2(points2d.begin(), points2d.end(),std:: back_inserter(result)); + N = CGAL_Nef_polyhedron(new CGAL_Nef_polyhedron2(result.begin(), result.end(), + CGAL_Nef_polyhedron2::INCLUDED)); } else if (dim == 3) { CGAL_Polyhedron P; - CGAL::convex_hull_3(points.begin(), points.end(), P); + CGAL::convex_hull_3(points3d.begin(), points3d.end(), P); N = CGAL_Nef_polyhedron(new CGAL_Nef_polyhedron3(P)); } return N; diff --git a/src/cgaladv_convexhull2.cc b/src/cgaladv_convexhull2.cc deleted file mode 100644 index 492df3c..0000000 --- a/src/cgaladv_convexhull2.cc +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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_Poly2 nef2p2(CGAL_Nef_polyhedron2 p); - -CGAL_Nef_polyhedron2 *convexhull2(std::list<CGAL_Nef_polyhedron2*> a) -{ - std::list<CGAL_Nef_polyhedron2::Point> points; - - std::list<CGAL_Nef_polyhedron2*>::iterator i; - for (i=a.begin(); i!=a.end(); i++) { - CGAL_Poly2 ap=nef2p2(**i); - for (size_t j=0;j<ap.size();j++) { - double x=to_double(ap[j].x()),y=to_double(ap[j].y()); - CGAL_Nef_polyhedron2::Point p=CGAL_Nef_polyhedron2::Point(x,y); - points.push_back(p); - } - } - - std::list<CGAL_Nef_polyhedron2::Point> result; - CGAL::convex_hull_2(points.begin(),points.end(),std::back_inserter(result)); - - return new CGAL_Nef_polyhedron2(result.begin(),result.end(),CGAL_Nef_polyhedron2::INCLUDED); -} - -#endif diff --git a/testdata/scad/features/hull2-tests.scad b/testdata/scad/features/hull2-tests.scad index 3bea3c5..e656e6a 100644 --- a/testdata/scad/features/hull2-tests.scad +++ b/testdata/scad/features/hull2-tests.scad @@ -13,7 +13,6 @@ module concave2dSimple() { } } -// Works correctly module convex2dHole() { hull() { translate([15,10,0]) circle(10); @@ -24,7 +23,15 @@ module convex2dHole() { } } +module hull2dForLoop() { + hull() { + for(x = [0,10]) + for(y=[0,10]) + translate([x,y]) circle(3); + } +} convex2dHole(); translate([40,0,0]) convex2dSimple(); translate([0,-20,0]) concave2dSimple(); +translate([30,-25,0]) hull2dForLoop(); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 29f8b25..a2e3c34 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -246,8 +246,7 @@ set(CGAL_SOURCES ../src/CGALCache.cc ../src/PolySetCGALEvaluator.cc ../src/CGAL_Nef_polyhedron_DxfData.cc - ../src/cgaladv_minkowski2.cc - ../src/cgaladv_convexhull2.cc) + ../src/cgaladv_minkowski2.cc) set(COMMON_SOURCES ../src/nodedumper.cc diff --git a/tests/regression/cgalpngtest/hull2-tests-expected.png b/tests/regression/cgalpngtest/hull2-tests-expected.png Binary files differindex 256b349..508974f 100644 --- a/tests/regression/cgalpngtest/hull2-tests-expected.png +++ b/tests/regression/cgalpngtest/hull2-tests-expected.png diff --git a/tests/regression/dumptest/hull2-tests-expected.txt b/tests/regression/dumptest/hull2-tests-expected.txt index 87365a6..d060d1d 100644 --- a/tests/regression/dumptest/hull2-tests-expected.txt +++ b/tests/regression/dumptest/hull2-tests-expected.txt @@ -32,4 +32,28 @@ } } } + multmatrix([[1, 0, 0, 30], [0, 1, 0, -25], [0, 0, 1, 0], [0, 0, 0, 1]]) { + group() { + hull() { + group() { + group() { + multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { + circle($fn = 0, $fa = 12, $fs = 1, r = 3); + } + multmatrix([[1, 0, 0, 0], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { + circle($fn = 0, $fa = 12, $fs = 1, r = 3); + } + } + group() { + multmatrix([[1, 0, 0, 10], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { + circle($fn = 0, $fa = 12, $fs = 1, r = 3); + } + multmatrix([[1, 0, 0, 10], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { + circle($fn = 0, $fa = 12, $fs = 1, r = 3); + } + } + } + } + } + } diff --git a/tests/regression/opencsgtest/hull2-tests-expected.png b/tests/regression/opencsgtest/hull2-tests-expected.png Binary files differindex 66ee6b2..46b266b 100644 --- a/tests/regression/opencsgtest/hull2-tests-expected.png +++ b/tests/regression/opencsgtest/hull2-tests-expected.png diff --git a/tests/regression/throwntogethertest/hull2-tests-expected.png b/tests/regression/throwntogethertest/hull2-tests-expected.png Binary files differindex 221cbaf..46b266b 100644 --- a/tests/regression/throwntogethertest/hull2-tests-expected.png +++ b/tests/regression/throwntogethertest/hull2-tests-expected.png |