diff options
| author | Marius Kintel <marius@kintel.net> | 2011-12-07 04:21:11 (GMT) | 
|---|---|---|
| committer | Marius Kintel <marius@kintel.net> | 2011-12-07 04:21:11 (GMT) | 
| commit | 679b8d05c8e25ce95e655b2c0f0e2793e408c368 (patch) | |
| tree | 9132297412ee30f86923f3efedad58e986619562 | |
| parent | 9d296acf67a24f5f6120ab8b0dc628f097a5920e (diff) | |
bugfix: 2D hull() now works with for loops. Thanks to nophead to reasserting this bug.
| -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.pngBinary files differ index 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.pngBinary files differ index 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.pngBinary files differ index 221cbaf..46b266b 100644 --- a/tests/regression/throwntogethertest/hull2-tests-expected.png +++ b/tests/regression/throwntogethertest/hull2-tests-expected.png | 
