summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Kintel <marius@kintel.net>2013-12-15 23:21:51 (GMT)
committerMarius Kintel <marius@kintel.net>2013-12-15 23:21:51 (GMT)
commitdced79fb2d6a4bb1bd5992e611e1c209b910f820 (patch)
treef1491a4331debb8f89098553ceeff377a4053ab3
parent4fd18f6d72d3690dec11c7241a8127fe37007dec (diff)
parent446dc3d36d36ee3786615c6297a141c01ed972c0 (diff)
Merge pull request #574 from openscad/planar
Planar - see issue #349
-rw-r--r--src/CGALEvaluator.cc26
-rw-r--r--src/CGAL_Nef_polyhedron.cc5
-rw-r--r--src/cgalutils.cc27
-rw-r--r--src/cgalutils.h5
-rw-r--r--src/dxftess-cgal.cc175
-rw-r--r--src/dxftess.h1
-rw-r--r--src/import.cc4
-rw-r--r--src/polyset.h2
-rw-r--r--src/primitives.cc18
-rw-r--r--testdata/scad/features/polyhedron-nonplanar-tests.scad157
-rw-r--r--tests/CMakeLists.txt4
-rw-r--r--tests/regression/cgalpngtest/polyhedron-nonplanar-tests-expected.pngbin0 -> 9032 bytes
-rw-r--r--tests/regression/cgalpngtest/polyhedron-tests-expected.pngbin8654 -> 5516 bytes
-rw-r--r--tests/regression/dumptest/allmodules-expected.csg2
-rw-r--r--tests/regression/dumptest/example011-expected.csg2
-rw-r--r--tests/regression/dumptest/polyhedron-nonplanar-tests-expected.csg11
-rw-r--r--tests/regression/dumptest/polyhedron-tests-expected.csg16
-rw-r--r--tests/regression/opencsgtest/polyhedron-nonplanar-tests-expected.pngbin0 -> 9489 bytes
-rw-r--r--tests/regression/opencsgtest/polyhedron-tests-expected.pngbin9915 -> 6380 bytes
-rw-r--r--tests/regression/throwntogethertest/polyhedron-nonplanar-tests-expected.pngbin0 -> 9489 bytes
-rw-r--r--tests/regression/throwntogethertest/polyhedron-tests-expected.pngbin10536 -> 7061 bytes
21 files changed, 410 insertions, 45 deletions
diff --git a/src/CGALEvaluator.cc b/src/CGALEvaluator.cc
index 86118d7..20c5d5e 100644
--- a/src/CGALEvaluator.cc
+++ b/src/CGALEvaluator.cc
@@ -680,16 +680,32 @@ CGAL_Nef_polyhedron CGALEvaluator::evaluateCGALMesh(const PolySet &ps)
else // not (this->is2d)
{
CGAL_Nef_polyhedron3 *N = NULL;
+ bool plane_error = false;
CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION);
try {
- // FIXME: Are we leaking memory for the CGAL_Polyhedron object?
- CGAL_Polyhedron *P = createPolyhedronFromPolySet(ps);
- if (P) {
- N = new CGAL_Nef_polyhedron3(*P);
+ CGAL_Polyhedron P;
+ bool err = createPolyhedronFromPolySet(ps,P);
+ if (!err) N = new CGAL_Nef_polyhedron3(P);
+ }
+ catch (const CGAL::Assertion_exception &e) {
+ if (std::string(e.what()).find("Plane_constructor")!=std::string::npos) {
+ if (std::string(e.what()).find("has_on")!=std::string::npos) {
+ PRINT("PolySet has nonplanar faces. Attempting alternate construction");
+ plane_error=true;
+ }
+ } else {
+ PRINTB("CGAL error in CGAL_Nef_polyhedron3(): %s", e.what());
}
}
+ if (plane_error) try {
+ PolySet ps2;
+ CGAL_Polyhedron P;
+ tessellate_3d_faces( ps, ps2 );
+ bool err = createPolyhedronFromPolySet(ps2,P);
+ if (!err) N = new CGAL_Nef_polyhedron3(P);
+ }
catch (const CGAL::Assertion_exception &e) {
- PRINTB("CGAL error in CGAL_Nef_polyhedron3(): %s", e.what());
+ PRINTB("Alternate construction failed. CGAL error in CGAL_Nef_polyhedron3(): %s", e.what());
}
CGAL::set_error_behaviour(old_behaviour);
return CGAL_Nef_polyhedron(N);
diff --git a/src/CGAL_Nef_polyhedron.cc b/src/CGAL_Nef_polyhedron.cc
index 49b9a53..ea9accd 100644
--- a/src/CGAL_Nef_polyhedron.cc
+++ b/src/CGAL_Nef_polyhedron.cc
@@ -96,6 +96,7 @@ PolySet *CGAL_Nef_polyhedron::convertToPolyset()
}
else if (this->dim == 3) {
CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION);
+ ps = new PolySet();
bool err = true;
std::string errmsg("");
CGAL_Polyhedron P;
@@ -107,11 +108,11 @@ PolySet *CGAL_Nef_polyhedron::convertToPolyset()
err = true;
errmsg = std::string(e.what());
}
+ if (!err) err = createPolySetFromPolyhedron(P, *ps);
if (err) {
PRINT("ERROR: CGAL NefPolyhedron->Polyhedron conversion failed.");
if (errmsg!="") PRINTB("ERROR: %s",errmsg);
- } else {
- ps = createPolySetFromPolyhedron(P);
+ delete ps; ps = NULL;
}
CGAL::set_error_behaviour(old_behaviour);
}
diff --git a/src/cgalutils.cc b/src/cgalutils.cc
index bb46f1c..12e743d 100644
--- a/src/cgalutils.cc
+++ b/src/cgalutils.cc
@@ -8,10 +8,9 @@
#include <map>
-PolySet *createPolySetFromPolyhedron(const CGAL_Polyhedron &p)
+bool createPolySetFromPolyhedron(const CGAL_Polyhedron &p, PolySet &ps)
{
- PolySet *ps = new PolySet();
-
+ bool err = false;
typedef CGAL_Polyhedron::Vertex Vertex;
typedef CGAL_Polyhedron::Vertex_const_iterator VCI;
typedef CGAL_Polyhedron::Facet_const_iterator FCI;
@@ -35,13 +34,13 @@ PolySet *createPolySetFromPolyhedron(const CGAL_Polyhedron &p)
double x3 = CGAL::to_double(v3.point().x());
double y3 = CGAL::to_double(v3.point().y());
double z3 = CGAL::to_double(v3.point().z());
- ps->append_poly();
- ps->append_vertex(x1, y1, z1);
- ps->append_vertex(x2, y2, z2);
- ps->append_vertex(x3, y3, z3);
+ ps.append_poly();
+ ps.append_vertex(x1, y1, z1);
+ ps.append_vertex(x2, y2, z2);
+ ps.append_vertex(x3, y3, z3);
} while (hc != hc_end);
}
- return ps;
+ return err;
}
#undef GEN_SURFACE_DEBUG
@@ -127,22 +126,20 @@ public:
}
};
-CGAL_Polyhedron *createPolyhedronFromPolySet(const PolySet &ps)
+bool createPolyhedronFromPolySet(const PolySet &ps, CGAL_Polyhedron &p)
{
- CGAL_Polyhedron *P = NULL;
+ bool err = false;
CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION);
try {
- P = new CGAL_Polyhedron;
CGAL_Build_PolySet builder(ps);
- P->delegate(builder);
+ p.delegate(builder);
}
catch (const CGAL::Assertion_exception &e) {
PRINTB("CGAL error in CGAL_Build_PolySet: %s", e.what());
- delete P;
- P = NULL;
+ err = true;
}
CGAL::set_error_behaviour(old_behaviour);
- return P;
+ return err;
}
CGAL_Iso_cuboid_3 bounding_box( const CGAL_Nef_polyhedron3 &N )
diff --git a/src/cgalutils.h b/src/cgalutils.h
index d25fd4c..8f7e4dd 100644
--- a/src/cgalutils.h
+++ b/src/cgalutils.h
@@ -2,8 +2,9 @@
#define CGALUTILS_H_
#include <cgal.h>
-class PolySet *createPolySetFromPolyhedron(const CGAL_Polyhedron &p);
-CGAL_Polyhedron *createPolyhedronFromPolySet(const class PolySet &ps);
+#include "polyset.h"
+bool createPolySetFromPolyhedron(const CGAL_Polyhedron &p, PolySet &ps);
+bool createPolyhedronFromPolySet(const PolySet &ps, CGAL_Polyhedron &p);
CGAL_Iso_cuboid_3 bounding_box( const CGAL_Nef_polyhedron3 &N );
CGAL_Iso_rectangle_2e bounding_box( const CGAL_Nef_polyhedron2 &N );
diff --git a/src/dxftess-cgal.cc b/src/dxftess-cgal.cc
index 16eaf9f..14f1204 100644
--- a/src/dxftess-cgal.cc
+++ b/src/dxftess-cgal.cc
@@ -335,3 +335,178 @@ void dxf_tesselate(PolySet *ps, DxfData &dxf, double rot, Vector2d scale, bool u
dxf.paths[path[2]].is_inner = !up;
}
}
+
+
+/* Tessellation of 3d PolySet faces
+
+This code is for tessellating the faces of a 3d PolySet, assuming that
+the faces are near-planar polygons.
+
+We do the tessellation by projecting each polygon of the Polyset onto a
+2-d plane, then running a 2d tessellation algorithm on the projected 2d
+polygon. Then we project each of the newly generated 2d 'tiles' (the
+polygons used for tessellation, typically triangles) back up into 3d
+space.
+
+(in reality as of writing, we dont need to do a back-projection from 2d->3d
+because the algorithm we are using doesn't create any new points, and we can
+just use a 'map' to associate 3d points with 2d points).
+
+The code assumes the input polygons are simple, non-intersecting, without
+holes, without duplicate input points, and with proper orientation.
+
+The purpose of this code is originally to fix github issue 349. Our CGAL
+kernel does not accept polygons for Nef_Polyhedron_3 if each of the
+points is not exactly coplanar. "Near-planar" or "Almost planar" polygons
+often occur due to rounding issues on, for example, polyhedron() input.
+By tessellating the 3d polygon into individual smaller tiles that
+are perfectly coplanar (triangles, for example), we can get CGAL to accept
+the polyhedron() input.
+*/
+
+typedef enum { XYPLANE, YZPLANE, XZPLANE, NONE } projection_t;
+
+// this is how we make 3d points appear as though they were 2d points to
+//the tessellation algorithm.
+Vector2d get_projected_point( Vector3d v, projection_t projection ) {
+ Vector2d v2(0,0);
+ if (projection==XYPLANE) { v2.x() = v.x(); v2.y() = v.y(); }
+ else if (projection==XZPLANE) { v2.x() = v.x(); v2.y() = v.z(); }
+ else if (projection==YZPLANE) { v2.x() = v.y(); v2.y() = v.z(); }
+ return v2;
+}
+
+CGAL_Point_3 cgp( Vector3d v ) { return CGAL_Point_3( v.x(), v.y(), v.z() ); }
+
+/* Find a 'good' 2d projection for a given 3d polygon. the XY, YZ, or XZ
+plane. This is needed because near-planar polygons in 3d can have 'bad'
+projections into 2d. For example if the square 0,0,0 0,1,0 0,1,1 0,0,1
+is projected onto the XY plane you will not get a polygon, you wil get
+a skinny line thing. It's better to project that square onto the yz
+plane.*/
+projection_t find_good_projection( PolySet::Polygon pgon ) {
+ // step 1 - find 3 non-collinear points in the input
+ if (pgon.size()<3) return NONE;
+ Vector3d v1,v2,v3;
+ v1 = v2 = v3 = pgon[0];
+ for (size_t i=0;i<pgon.size();i++) {
+ if (pgon[i]!=v1) { v2=pgon[i]; break; }
+ }
+ if (v1==v2) return NONE;
+ for (size_t i=0;i<pgon.size();i++) {
+ if (!CGAL::collinear( cgp(v1), cgp(v2), cgp(pgon[i]) )) {
+ v3=pgon[i]; break;
+ }
+ }
+ if (CGAL::collinear( cgp(v1), cgp(v2), cgp(v3) ) ) return NONE;
+ // step 2 - find which direction is best for projection. planes use
+ // the equation ax+by+cz+d = 0. a,b, and c determine the direction the
+ // plane is in. we want to find which projection of the 'normal vector'
+ // would make the smallest shadow if projected onto the XY, YZ, or XZ
+ // plane. 'quadrance' (distance squared) can tell this w/o using sqrt.
+ CGAL::Plane_3<CGAL_Kernel3> pl( cgp(v1), cgp(v2), cgp(v3) );
+ NT3 qxy = pl.a()*pl.a()+pl.b()*pl.b();
+ NT3 qyz = pl.b()*pl.b()+pl.c()*pl.c();
+ NT3 qxz = pl.c()*pl.c()+pl.a()*pl.a();
+ NT3 min = std::min(qxy,std::min(qyz,qxz));
+ if (min==qxy) return XYPLANE;
+ else if (min==qyz) return YZPLANE;
+ return XZPLANE;
+}
+
+/* triangulate the given 3d polygon using CGAL's 2d Constrained Delaunay
+algorithm. Project the polygon's points into 2d using the given projection
+before performing the triangulation. This code assumes input polygon is
+simple, no holes, no self-intersections, no duplicate points, and is
+properly oriented. output is a sequence of 3d triangles. */
+bool triangulate_polygon( const PolySet::Polygon &pgon, std::vector<PolySet::Polygon> &triangles, projection_t projection )
+{
+ bool err = false;
+ CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION);
+ try {
+ CDT cdt;
+ std::vector<Vertex_handle> vhandles;
+ std::map<CDTPoint,Vector3d> vertmap;
+ CGAL::Orientation original_orientation;
+ std::vector<CDTPoint> orienpgon;
+ for (size_t i = 0; i < pgon.size(); i++) {
+ Vector3d v3 = pgon.at(i);
+ Vector2d v2 = get_projected_point( v3, projection );
+ CDTPoint cdtpoint = CDTPoint(v2.x(),v2.y());
+ vertmap[ cdtpoint ] = v3;
+ Vertex_handle vh = cdt.insert( cdtpoint );
+ vhandles.push_back(vh);
+ orienpgon.push_back( cdtpoint );
+ }
+ original_orientation = CGAL::orientation_2( orienpgon.begin(),orienpgon.end() );
+ for (size_t i = 0; i < vhandles.size(); i++ ) {
+ int vindex1 = (i+0);
+ int vindex2 = (i+1)%vhandles.size();
+ cdt.insert_constraint( vhandles[vindex1], vhandles[vindex2] );
+ }
+ std::list<CDTPoint> list_of_seeds;
+ CGAL::refine_Delaunay_mesh_2_without_edge_refinement(cdt,
+ list_of_seeds.begin(), list_of_seeds.end(), DummyCriteria<CDT>());
+
+ CDT::Finite_faces_iterator fit;
+ for( fit=cdt.finite_faces_begin(); fit!=cdt.finite_faces_end(); fit++ )
+ {
+ if(fit->is_in_domain()) {
+ CDTPoint p1 = cdt.triangle( fit )[0];
+ CDTPoint p2 = cdt.triangle( fit )[1];
+ CDTPoint p3 = cdt.triangle( fit )[2];
+ Vector3d v1 = vertmap[p1];
+ Vector3d v2 = vertmap[p2];
+ Vector3d v3 = vertmap[p3];
+ PolySet::Polygon pgon;
+ if (CGAL::orientation(p1,p2,p3)==original_orientation) {
+ pgon.push_back(v1);
+ pgon.push_back(v2);
+ pgon.push_back(v3);
+ } else {
+ pgon.push_back(v3);
+ pgon.push_back(v2);
+ pgon.push_back(v1);
+ }
+ triangles.push_back( pgon );
+ }
+ }
+ } catch (const CGAL::Assertion_exception &e) {
+ PRINTB("CGAL error in dxftess triangulate_polygon: %s", e.what());
+ err = true;
+ }
+ CGAL::set_error_behaviour(old_behaviour);
+ return err;
+}
+
+/* Given a 3d PolySet with 'near planar' polygonal faces, Tessellate the
+faces. As of writing, our only tessellation method is Triangulation
+using CGAL's Constrained Delaunay algorithm. This code assumes the input
+polyset has simple polygon faces with no holes, no self intersections, no
+duplicate points, and proper orientation. */
+void tessellate_3d_faces( const PolySet &inps, PolySet &outps ) {
+ for (size_t i = 0; i < inps.polygons.size(); i++) {
+ const PolySet::Polygon pgon = inps.polygons[i];
+ if (pgon.size()<3) {
+ PRINT("WARNING: PolySet has polygon with <3 points");
+ continue;
+ }
+ projection_t goodproj = find_good_projection( pgon );
+ if (goodproj==NONE) {
+ PRINT("WARNING: PolySet has degenerate polygon");
+ continue;
+ }
+ std::vector<PolySet::Polygon> triangles;
+ bool err = triangulate_polygon( pgon, triangles, goodproj );
+ if (!err) for (size_t j=0;j<triangles.size();j++) {
+ PolySet::Polygon t = triangles[j];
+ outps.append_poly();
+ outps.append_vertex(t[0].x(),t[0].y(),t[0].z());
+ outps.append_vertex(t[1].x(),t[1].y(),t[1].z());
+ outps.append_vertex(t[2].x(),t[2].y(),t[2].z());
+ }
+ }
+}
+
+// End of PolySet face tessellation code
+
diff --git a/src/dxftess.h b/src/dxftess.h
index f0f27b5..d596f0b 100644
--- a/src/dxftess.h
+++ b/src/dxftess.h
@@ -7,5 +7,6 @@ class DxfData;
class PolySet;
void dxf_tesselate(PolySet *ps, DxfData &dxf, double rot, Vector2d scale, bool up, bool do_triangle_splitting, double h);
void dxf_border_to_ps(PolySet *ps, const DxfData &dxf);
+void tessellate_3d_faces( const PolySet &inps, PolySet &outps );
#endif
diff --git a/src/import.cc b/src/import.cc
index 3897331..3c2cce1 100644
--- a/src/import.cc
+++ b/src/import.cc
@@ -284,7 +284,9 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const
file >> poly;
file.close();
- p = createPolySetFromPolyhedron(poly);
+ p = new PolySet();
+ bool err = createPolySetFromPolyhedron(poly, *p);
+ if (err) delete p;
}
#else
PRINT("WARNING: OFF import requires CGAL.");
diff --git a/src/polyset.h b/src/polyset.h
index 6626f79..2ff817a 100644
--- a/src/polyset.h
+++ b/src/polyset.h
@@ -26,7 +26,7 @@ public:
void append_vertex(double x, double y, double z = 0.0);
void insert_vertex(double x, double y, double z = 0.0);
size_t memsize() const;
-
+
BoundingBox getBoundingBox() const;
#define CSGMODE_DIFFERENCE_FLAG 0x10
diff --git a/src/primitives.cc b/src/primitives.cc
index a587d43..a76637d 100644
--- a/src/primitives.cc
+++ b/src/primitives.cc
@@ -103,7 +103,7 @@ public:
double fn, fs, fa;
primitive_type_e type;
int convexity;
- Value points, paths, triangles;
+ Value points, paths, faces;
virtual PolySet *evaluate_polyset(class PolySetEvaluator *) const;
};
@@ -156,7 +156,7 @@ AbstractNode *PrimitiveModule::instantiate(const Context *ctx, const ModuleInsta
args += Assignment("h", NULL), Assignment("r1", NULL), Assignment("r2", NULL), Assignment("center", NULL);
break;
case POLYHEDRON:
- args += Assignment("points", NULL), Assignment("triangles", NULL), Assignment("convexity", NULL);
+ args += Assignment("points", NULL), Assignment("triangles", NULL), Assignment("convexity", NULL), Assignment("faces", NULL);
break;
case SQUARE:
args += Assignment("size", NULL), Assignment("center", NULL);
@@ -235,7 +235,11 @@ AbstractNode *PrimitiveModule::instantiate(const Context *ctx, const ModuleInsta
if (type == POLYHEDRON) {
node->points = c.lookup_variable("points");
- node->triangles = c.lookup_variable("triangles");
+ node->faces = c.lookup_variable("faces");
+ if (node->faces.type() == Value::UNDEFINED) {
+ // backwards compatable
+ node->faces = c.lookup_variable("triangles");
+ }
}
if (type == SQUARE) {
@@ -480,11 +484,11 @@ sphere_next_r2:
if (this->type == POLYHEDRON)
{
p->convexity = this->convexity;
- for (size_t i=0; i<this->triangles.toVector().size(); i++)
+ for (size_t i=0; i<this->faces.toVector().size(); i++)
{
p->append_poly();
- for (size_t j=0; j<this->triangles.toVector()[i].toVector().size(); j++) {
- size_t pt = this->triangles.toVector()[i].toVector()[j].toDouble();
+ for (size_t j=0; j<this->faces.toVector()[i].toVector().size(); j++) {
+ size_t pt = this->faces.toVector()[i].toVector()[j].toDouble();
if (pt < this->points.toVector().size()) {
double px, py, pz;
if (this->points.toVector()[pt].getVec3(px, py, pz))
@@ -610,7 +614,7 @@ std::string PrimitiveNode::toString() const
break;
case POLYHEDRON:
stream << "(points = " << this->points
- << ", triangles = " << this->triangles
+ << ", faces = " << this->faces
<< ", convexity = " << this->convexity << ")";
break;
case SQUARE:
diff --git a/testdata/scad/features/polyhedron-nonplanar-tests.scad b/testdata/scad/features/polyhedron-nonplanar-tests.scad
new file mode 100644
index 0000000..19e76b6
--- /dev/null
+++ b/testdata/scad/features/polyhedron-nonplanar-tests.scad
@@ -0,0 +1,157 @@
+// Used to cause issue #349
+
+// Very slightly non-planar polyhedron
+polyhedron(faces=[[3,2,1,0],[7,6,5,4],[0,1,6,7],[1,2,5,6],[2,3,4,5],[3,0,7,4]],
+points=[
+ [0.0174497,-0.0174524,0.999695],
+ [1.0173,-0.0174524,0.982243],
+ [1.0176,0.982395,0.999693],
+ [0.0177543,0.982395,1.01715],
+ [0.000304586,0.999848,0.0174497],
+ [1.00015,0.999848,-0.00000265809],
+ [0.999848,-0.0000000000000271051,-0.0174524],
+ [0,0,0]]);
+
+// Really non-planar polyhedron
+translate([2,0,0]) polyhedron(faces=[[3,2,1,0],[7,6,5,4],[0,1,6,7],[1,2,5,6],[2,3,4,5],[3,0,7,4]],
+points=[
+ [0,0,1],
+ [1,0.2,1],
+ [1,1,1],
+ [0,1,1],
+ [0,1,0],
+ [1,1,0],
+ [1,0,0],
+ [0,0,0]]);
+
+// Real-world example: truncated icosidodecahedron
+translate([4.5,0.5,0.5]) scale(0.02) polyhedron(points = [
+[-10., -13.090169943749475, -34.270509831248425],
+[-10., -13.090169943749475, 34.270509831248425],
+[-10., 13.090169943749475, -34.270509831248425],
+[-10., 13.090169943749475, 34.270509831248425],
+[-5., -5., -37.3606797749979], [-5., -5., 37.3606797749979],
+[-5., 5., -37.3606797749979], [-5., 5., 37.3606797749979],
+[-5., -37.3606797749979, -5.], [-5., -37.3606797749979, 5.],
+[-5., -21.18033988749895, -31.18033988749895],
+[-5., -21.18033988749895, 31.18033988749895], [-5., 37.3606797749979, -5.],
+[-5., 37.3606797749979, 5.], [-5., 21.18033988749895, -31.18033988749895],
+[-5., 21.18033988749895, 31.18033988749895], [5., -5., -37.3606797749979],
+[5., -5., 37.3606797749979], [5., 5., -37.3606797749979],
+[5., 5., 37.3606797749979], [5., -37.3606797749979, -5.],
+[5., -37.3606797749979, 5.], [5., -21.18033988749895, -31.18033988749895],
+[5., -21.18033988749895, 31.18033988749895], [5., 37.3606797749979, -5.],
+[5., 37.3606797749979, 5.], [5., 21.18033988749895, -31.18033988749895],
+[5., 21.18033988749895, 31.18033988749895], [10., -13.090169943749475,
+ -34.270509831248425], [10., -13.090169943749475, 34.270509831248425],
+[10., 13.090169943749475, -34.270509831248425],
+[10., 13.090169943749475, 34.270509831248425],
+[-34.270509831248425, -10., -13.090169943749475],
+[-34.270509831248425, -10., 13.090169943749475],
+[-34.270509831248425, 10., -13.090169943749475],
+[-34.270509831248425, 10., 13.090169943749475],
+[-29.270509831248425, -18.090169943749473, -16.18033988749895],
+[-29.270509831248425, -18.090169943749473, 16.18033988749895],
+[-29.270509831248425, 18.090169943749473, -16.18033988749895],
+[-29.270509831248425, 18.090169943749473, 16.18033988749895],
+[-18.090169943749473, -16.18033988749895, -29.270509831248425],
+[-18.090169943749473, -16.18033988749895, 29.270509831248425],
+[-18.090169943749473, 16.18033988749895, -29.270509831248425],
+[-18.090169943749473, 16.18033988749895, 29.270509831248425],
+[-13.090169943749475, -34.270509831248425, -10.],
+[-13.090169943749475, -34.270509831248425, 10.],
+[-13.090169943749475, -24.270509831248425, -26.18033988749895],
+[-13.090169943749475, -24.270509831248425, 26.18033988749895],
+[-13.090169943749475, 24.270509831248425, -26.18033988749895],
+[-13.090169943749475, 24.270509831248425, 26.18033988749895],
+[-13.090169943749475, 34.270509831248425, -10.],
+[-13.090169943749475, 34.270509831248425, 10.],
+[-26.18033988749895, -13.090169943749475, -24.270509831248425],
+[-26.18033988749895, -13.090169943749475, 24.270509831248425],
+[-26.18033988749895, 13.090169943749475, -24.270509831248425],
+[-26.18033988749895, 13.090169943749475, 24.270509831248425],
+[-37.3606797749979, -5., -5.], [-37.3606797749979, -5., 5.],
+[-37.3606797749979, 5., -5.], [-37.3606797749979, 5., 5.],
+[-16.18033988749895, -29.270509831248425, -18.090169943749473],
+[-16.18033988749895, -29.270509831248425, 18.090169943749473],
+[-16.18033988749895, 29.270509831248425, -18.090169943749473],
+[-16.18033988749895, 29.270509831248425, 18.090169943749473],
+[-31.18033988749895, -5., -21.18033988749895],
+[-31.18033988749895, -5., 21.18033988749895],
+[-31.18033988749895, 5., -21.18033988749895],
+[-31.18033988749895, 5., 21.18033988749895],
+[-21.18033988749895, -31.18033988749895, -5.],
+[-21.18033988749895, -31.18033988749895, 5.],
+[-21.18033988749895, 31.18033988749895, -5.],
+[-21.18033988749895, 31.18033988749895, 5.],
+[-24.270509831248425, -26.18033988749895, -13.090169943749475],
+[-24.270509831248425, -26.18033988749895, 13.090169943749475],
+[-24.270509831248425, 26.18033988749895, -13.090169943749475],
+[-24.270509831248425, 26.18033988749895, 13.090169943749475],
+[16.18033988749895, -29.270509831248425, -18.090169943749473],
+[16.18033988749895, -29.270509831248425, 18.090169943749473],
+[16.18033988749895, 29.270509831248425, -18.090169943749473],
+[16.18033988749895, 29.270509831248425, 18.090169943749473],
+[24.270509831248425, -26.18033988749895, -13.090169943749475],
+[24.270509831248425, -26.18033988749895, 13.090169943749475],
+[24.270509831248425, 26.18033988749895, -13.090169943749475],
+[24.270509831248425, 26.18033988749895, 13.090169943749475],
+[37.3606797749979, -5., -5.], [37.3606797749979, -5., 5.],
+[37.3606797749979, 5., -5.], [37.3606797749979, 5., 5.],
+[21.18033988749895, -31.18033988749895, -5.],
+[21.18033988749895, -31.18033988749895, 5.],
+[21.18033988749895, 31.18033988749895, -5.],
+[21.18033988749895, 31.18033988749895, 5.],
+[13.090169943749475, -34.270509831248425, -10.],
+[13.090169943749475, -34.270509831248425, 10.],
+[13.090169943749475, -24.270509831248425, -26.18033988749895],
+[13.090169943749475, -24.270509831248425, 26.18033988749895],
+[13.090169943749475, 24.270509831248425, -26.18033988749895],
+[13.090169943749475, 24.270509831248425, 26.18033988749895],
+[13.090169943749475, 34.270509831248425, -10.],
+[13.090169943749475, 34.270509831248425, 10.],
+[26.18033988749895, -13.090169943749475, -24.270509831248425],
+[26.18033988749895, -13.090169943749475, 24.270509831248425],
+[26.18033988749895, 13.090169943749475, -24.270509831248425],
+[26.18033988749895, 13.090169943749475, 24.270509831248425],
+[31.18033988749895, -5., -21.18033988749895],
+[31.18033988749895, -5., 21.18033988749895],
+[31.18033988749895, 5., -21.18033988749895],
+[31.18033988749895, 5., 21.18033988749895],
+[18.090169943749473, -16.18033988749895, -29.270509831248425],
+[18.090169943749473, -16.18033988749895, 29.270509831248425],
+[18.090169943749473, 16.18033988749895, -29.270509831248425],
+[18.090169943749473, 16.18033988749895, 29.270509831248425],
+[29.270509831248425, -18.090169943749473, -16.18033988749895],
+[29.270509831248425, -18.090169943749473, 16.18033988749895],
+[29.270509831248425, 18.090169943749473, -16.18033988749895],
+[29.270509831248425, 18.090169943749473, 16.18033988749895],
+[34.270509831248425, -10., -13.090169943749475],
+[34.270509831248425, -10., 13.090169943749475],
+[34.270509831248425, 10., -13.090169943749475],
+[34.270509831248425, 10., 13.090169943749475]],faces =
+[[41, 53, 65, 67, 55, 43, 3, 7, 5, 1], [100, 104, 106, 102, 110, 30, 18, 16,
+ 28, 108], [11, 1, 5, 17, 29, 23], [18, 30, 26, 14, 2, 6],
+[33, 37, 73, 69, 68, 72, 36, 32, 56, 57], [91, 90, 82, 114, 118, 86, 87,
+ 119, 115, 83], [81, 113, 117, 85, 84, 116, 112, 80, 88, 89],
+[59, 58, 34, 38, 74, 70, 71, 75, 39, 35], [0, 10, 22, 28, 16, 4],
+[15, 27, 31, 19, 7, 3], [64, 52, 40, 0, 4, 6, 2, 42, 54, 66],
+[19, 31, 111, 103, 107, 105, 101, 109, 29, 17], [96, 110, 102, 114, 82, 78],
+[53, 41, 47, 61, 73, 37], [43, 49, 15, 3], [94, 108, 28, 22],
+[23, 29, 109, 95], [2, 14, 48, 42], [36, 72, 60, 46, 40, 52],
+[79, 83, 115, 103, 111, 97], [69, 45, 9, 8, 44, 68],
+[24, 98, 90, 91, 99, 25], [77, 95, 109, 101, 113, 81],
+[42, 48, 62, 74, 38, 54], [40, 46, 10, 0], [97, 111, 31, 27],
+[44, 8, 20, 92, 76, 94, 22, 10, 46, 60], [63, 51, 13, 25, 99, 79, 97, 27,
+ 15, 49], [26, 30, 110, 96], [1, 11, 47, 41], [55, 39, 75, 63, 49, 43],
+[80, 112, 100, 108, 94, 76], [48, 14, 26, 96, 78, 98, 24, 12, 50, 62],
+[61, 47, 11, 23, 95, 77, 93, 21, 9, 45], [71, 70, 50, 12, 13, 51],
+[93, 89, 88, 92, 20, 21], [102, 106, 118, 114], [65, 53, 37, 33],
+[74, 62, 50, 70], [77, 81, 89, 93], [101, 105, 117, 113], [66, 54, 38, 34],
+[73, 61, 45, 69], [78, 82, 90, 98], [32, 36, 52, 64], [115, 119, 107, 103],
+[92, 88, 80, 76], [71, 51, 63, 75], [56, 32, 64, 66, 34, 58],
+[107, 119, 87, 85, 117, 105], [35, 39, 55, 67], [112, 116, 104, 100],
+[99, 91, 83, 79], [68, 44, 60, 72], [57, 59, 35, 67, 65, 33],
+[116, 84, 86, 118, 106, 104], [4, 16, 18, 6], [7, 19, 17, 5],
+[12, 24, 25, 13], [9, 21, 20, 8], [56, 58, 59, 57], [85, 87, 86, 84]]
+);
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index d76f498..70e56c6 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -831,8 +831,8 @@ list(APPEND DUMPTEST_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/escape-test
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/localfiles_dir/localfiles-compatibility-test.scad
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allexpressions.scad
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allfunctions.scad
- ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/stl-cgal-convert_to_Polyhedron-crash.scad
- ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allmodules.scad)
+ ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allmodules.scad
+ ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/stl-cgal-convert_to_Polyhedron-crash.scad)
list(APPEND CGALPNGTEST_FILES ${FEATURES_FILES} ${SCAD_DXF_FILES} ${EXAMPLE_FILES})
list(APPEND CGALPNGTEST_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/include-tests.scad
diff --git a/tests/regression/cgalpngtest/polyhedron-nonplanar-tests-expected.png b/tests/regression/cgalpngtest/polyhedron-nonplanar-tests-expected.png
new file mode 100644
index 0000000..e21c9fc
--- /dev/null
+++ b/tests/regression/cgalpngtest/polyhedron-nonplanar-tests-expected.png
Binary files differ
diff --git a/tests/regression/cgalpngtest/polyhedron-tests-expected.png b/tests/regression/cgalpngtest/polyhedron-tests-expected.png
index 322160d..dd380d3 100644
--- a/tests/regression/cgalpngtest/polyhedron-tests-expected.png
+++ b/tests/regression/cgalpngtest/polyhedron-tests-expected.png
Binary files differ
diff --git a/tests/regression/dumptest/allmodules-expected.csg b/tests/regression/dumptest/allmodules-expected.csg
index 42bf4fa..00311d3 100644
--- a/tests/regression/dumptest/allmodules-expected.csg
+++ b/tests/regression/dumptest/allmodules-expected.csg
@@ -26,7 +26,7 @@ group() {
cube(size = [1, 1, 1], center = false);
sphere($fn = 0, $fa = 12, $fs = 2, r = 1);
cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = false);
- polyhedron(points = undef, triangles = undef, convexity = 1);
+ polyhedron(points = undef, faces = undef, convexity = 1);
square(size = [1, 1], center = false);
circle($fn = 0, $fa = 12, $fs = 2, r = 1);
polygon(points = undef, paths = undef, convexity = 1);
diff --git a/tests/regression/dumptest/example011-expected.csg b/tests/regression/dumptest/example011-expected.csg
index 653a6cf..1cd617f 100644
--- a/tests/regression/dumptest/example011-expected.csg
+++ b/tests/regression/dumptest/example011-expected.csg
@@ -1,3 +1,3 @@
group() {
- polyhedron(points = [[10, 0, 0], [0, 10, 0], [-10, 0, 0], [0, -10, 0], [0, 0, 10]], triangles = [[0, 1, 2, 3], [4, 1, 0], [4, 2, 1], [4, 3, 2], [4, 0, 3]], convexity = 1);
+ polyhedron(points = [[10, 0, 0], [0, 10, 0], [-10, 0, 0], [0, -10, 0], [0, 0, 10]], faces = [[0, 1, 2, 3], [4, 1, 0], [4, 2, 1], [4, 3, 2], [4, 0, 3]], convexity = 1);
}
diff --git a/tests/regression/dumptest/polyhedron-nonplanar-tests-expected.csg b/tests/regression/dumptest/polyhedron-nonplanar-tests-expected.csg
new file mode 100644
index 0000000..1b40e99
--- /dev/null
+++ b/tests/regression/dumptest/polyhedron-nonplanar-tests-expected.csg
@@ -0,0 +1,11 @@
+group() {
+ polyhedron(points = [[0.0174497, -0.0174524, 0.999695], [1.0173, -0.0174524, 0.982243], [1.0176, 0.982395, 0.999693], [0.0177543, 0.982395, 1.01715], [0.000304586, 0.999848, 0.0174497], [1.00015, 0.999848, -0.00000265809], [0.999848, 0, -0.0174524], [0, 0, 0]], faces = [[3, 2, 1, 0], [7, 6, 5, 4], [0, 1, 6, 7], [1, 2, 5, 6], [2, 3, 4, 5], [3, 0, 7, 4]], convexity = 1);
+ multmatrix([[1, 0, 0, 2], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ polyhedron(points = [[0, 0, 1], [1, 0.2, 1], [1, 1, 1], [0, 1, 1], [0, 1, 0], [1, 1, 0], [1, 0, 0], [0, 0, 0]], faces = [[3, 2, 1, 0], [7, 6, 5, 4], [0, 1, 6, 7], [1, 2, 5, 6], [2, 3, 4, 5], [3, 0, 7, 4]], convexity = 1);
+ }
+ multmatrix([[1, 0, 0, 4.5], [0, 1, 0, 0.5], [0, 0, 1, 0.5], [0, 0, 0, 1]]) {
+ multmatrix([[0.02, 0, 0, 0], [0, 0.02, 0, 0], [0, 0, 0.02, 0], [0, 0, 0, 1]]) {
+ polyhedron(points = [[-10, -13.09016994374, -34.27050983124], [-10, -13.09016994374, 34.27050983124], [-10, 13.09016994374, -34.27050983124], [-10, 13.09016994374, 34.27050983124], [-5, -5, -37.36067977499], [-5, -5, 37.36067977499], [-5, 5, -37.36067977499], [-5, 5, 37.36067977499], [-5, -37.36067977499, -5], [-5, -37.36067977499, 5], [-5, -21.18033988749, -31.18033988749], [-5, -21.18033988749, 31.18033988749], [-5, 37.36067977499, -5], [-5, 37.36067977499, 5], [-5, 21.18033988749, -31.18033988749], [-5, 21.18033988749, 31.18033988749], [5, -5, -37.36067977499], [5, -5, 37.36067977499], [5, 5, -37.36067977499], [5, 5, 37.36067977499], [5, -37.36067977499, -5], [5, -37.36067977499, 5], [5, -21.18033988749, -31.18033988749], [5, -21.18033988749, 31.18033988749], [5, 37.36067977499, -5], [5, 37.36067977499, 5], [5, 21.18033988749, -31.18033988749], [5, 21.18033988749, 31.18033988749], [10, -13.09016994374, -34.27050983124], [10, -13.09016994374, 34.27050983124], [10, 13.09016994374, -34.27050983124], [10, 13.09016994374, 34.27050983124], [-34.27050983124, -10, -13.09016994374], [-34.27050983124, -10, 13.09016994374], [-34.27050983124, 10, -13.09016994374], [-34.27050983124, 10, 13.09016994374], [-29.27050983124, -18.09016994374, -16.18033988749], [-29.27050983124, -18.09016994374, 16.18033988749], [-29.27050983124, 18.09016994374, -16.18033988749], [-29.27050983124, 18.09016994374, 16.18033988749], [-18.09016994374, -16.18033988749, -29.27050983124], [-18.09016994374, -16.18033988749, 29.27050983124], [-18.09016994374, 16.18033988749, -29.27050983124], [-18.09016994374, 16.18033988749, 29.27050983124], [-13.09016994374, -34.27050983124, -10], [-13.09016994374, -34.27050983124, 10], [-13.09016994374, -24.27050983124, -26.18033988749], [-13.09016994374, -24.27050983124, 26.18033988749], [-13.09016994374, 24.27050983124, -26.18033988749], [-13.09016994374, 24.27050983124, 26.18033988749], [-13.09016994374, 34.27050983124, -10], [-13.09016994374, 34.27050983124, 10], [-26.18033988749, -13.09016994374, -24.27050983124], [-26.18033988749, -13.09016994374, 24.27050983124], [-26.18033988749, 13.09016994374, -24.27050983124], [-26.18033988749, 13.09016994374, 24.27050983124], [-37.36067977499, -5, -5], [-37.36067977499, -5, 5], [-37.36067977499, 5, -5], [-37.36067977499, 5, 5], [-16.18033988749, -29.27050983124, -18.09016994374], [-16.18033988749, -29.27050983124, 18.09016994374], [-16.18033988749, 29.27050983124, -18.09016994374], [-16.18033988749, 29.27050983124, 18.09016994374], [-31.18033988749, -5, -21.18033988749], [-31.18033988749, -5, 21.18033988749], [-31.18033988749, 5, -21.18033988749], [-31.18033988749, 5, 21.18033988749], [-21.18033988749, -31.18033988749, -5], [-21.18033988749, -31.18033988749, 5], [-21.18033988749, 31.18033988749, -5], [-21.18033988749, 31.18033988749, 5], [-24.27050983124, -26.18033988749, -13.09016994374], [-24.27050983124, -26.18033988749, 13.09016994374], [-24.27050983124, 26.18033988749, -13.09016994374], [-24.27050983124, 26.18033988749, 13.09016994374], [16.18033988749, -29.27050983124, -18.09016994374], [16.18033988749, -29.27050983124, 18.09016994374], [16.18033988749, 29.27050983124, -18.09016994374], [16.18033988749, 29.27050983124, 18.09016994374], [24.27050983124, -26.18033988749, -13.09016994374], [24.27050983124, -26.18033988749, 13.09016994374], [24.27050983124, 26.18033988749, -13.09016994374], [24.27050983124, 26.18033988749, 13.09016994374], [37.36067977499, -5, -5], [37.36067977499, -5, 5], [37.36067977499, 5, -5], [37.36067977499, 5, 5], [21.18033988749, -31.18033988749, -5], [21.18033988749, -31.18033988749, 5], [21.18033988749, 31.18033988749, -5], [21.18033988749, 31.18033988749, 5], [13.09016994374, -34.27050983124, -10], [13.09016994374, -34.27050983124, 10], [13.09016994374, -24.27050983124, -26.18033988749], [13.09016994374, -24.27050983124, 26.18033988749], [13.09016994374, 24.27050983124, -26.18033988749], [13.09016994374, 24.27050983124, 26.18033988749], [13.09016994374, 34.27050983124, -10], [13.09016994374, 34.27050983124, 10], [26.18033988749, -13.09016994374, -24.27050983124], [26.18033988749, -13.09016994374, 24.27050983124], [26.18033988749, 13.09016994374, -24.27050983124], [26.18033988749, 13.09016994374, 24.27050983124], [31.18033988749, -5, -21.18033988749], [31.18033988749, -5, 21.18033988749], [31.18033988749, 5, -21.18033988749], [31.18033988749, 5, 21.18033988749], [18.09016994374, -16.18033988749, -29.27050983124], [18.09016994374, -16.18033988749, 29.27050983124], [18.09016994374, 16.18033988749, -29.27050983124], [18.09016994374, 16.18033988749, 29.27050983124], [29.27050983124, -18.09016994374, -16.18033988749], [29.27050983124, -18.09016994374, 16.18033988749], [29.27050983124, 18.09016994374, -16.18033988749], [29.27050983124, 18.09016994374, 16.18033988749], [34.27050983124, -10, -13.09016994374], [34.27050983124, -10, 13.09016994374], [34.27050983124, 10, -13.09016994374], [34.27050983124, 10, 13.09016994374]], faces = [[41, 53, 65, 67, 55, 43, 3, 7, 5, 1], [100, 104, 106, 102, 110, 30, 18, 16, 28, 108], [11, 1, 5, 17, 29, 23], [18, 30, 26, 14, 2, 6], [33, 37, 73, 69, 68, 72, 36, 32, 56, 57], [91, 90, 82, 114, 118, 86, 87, 119, 115, 83], [81, 113, 117, 85, 84, 116, 112, 80, 88, 89], [59, 58, 34, 38, 74, 70, 71, 75, 39, 35], [0, 10, 22, 28, 16, 4], [15, 27, 31, 19, 7, 3], [64, 52, 40, 0, 4, 6, 2, 42, 54, 66], [19, 31, 111, 103, 107, 105, 101, 109, 29, 17], [96, 110, 102, 114, 82, 78], [53, 41, 47, 61, 73, 37], [43, 49, 15, 3], [94, 108, 28, 22], [23, 29, 109, 95], [2, 14, 48, 42], [36, 72, 60, 46, 40, 52], [79, 83, 115, 103, 111, 97], [69, 45, 9, 8, 44, 68], [24, 98, 90, 91, 99, 25], [77, 95, 109, 101, 113, 81], [42, 48, 62, 74, 38, 54], [40, 46, 10, 0], [97, 111, 31, 27], [44, 8, 20, 92, 76, 94, 22, 10, 46, 60], [63, 51, 13, 25, 99, 79, 97, 27, 15, 49], [26, 30, 110, 96], [1, 11, 47, 41], [55, 39, 75, 63, 49, 43], [80, 112, 100, 108, 94, 76], [48, 14, 26, 96, 78, 98, 24, 12, 50, 62], [61, 47, 11, 23, 95, 77, 93, 21, 9, 45], [71, 70, 50, 12, 13, 51], [93, 89, 88, 92, 20, 21], [102, 106, 118, 114], [65, 53, 37, 33], [74, 62, 50, 70], [77, 81, 89, 93], [101, 105, 117, 113], [66, 54, 38, 34], [73, 61, 45, 69], [78, 82, 90, 98], [32, 36, 52, 64], [115, 119, 107, 103], [92, 88, 80, 76], [71, 51, 63, 75], [56, 32, 64, 66, 34, 58], [107, 119, 87, 85, 117, 105], [35, 39, 55, 67], [112, 116, 104, 100], [99, 91, 83, 79], [68, 44, 60, 72], [57, 59, 35, 67, 65, 33], [116, 84, 86, 118, 106, 104], [4, 16, 18, 6], [7, 19, 17, 5], [12, 24, 25, 13], [9, 21, 20, 8], [56, 58, 59, 57], [85, 87, 86, 84]], convexity = 1);
+ }
+ }
+}
diff --git a/tests/regression/dumptest/polyhedron-tests-expected.csg b/tests/regression/dumptest/polyhedron-tests-expected.csg
index 4bf980d..a9dc093 100644
--- a/tests/regression/dumptest/polyhedron-tests-expected.csg
+++ b/tests/regression/dumptest/polyhedron-tests-expected.csg
@@ -1,28 +1,28 @@
group() {
group() {
- polyhedron(points = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]], triangles = [[0, 4, 2], [0, 2, 5], [0, 3, 4], [0, 5, 3], [1, 2, 4], [1, 5, 2], [1, 4, 3], [1, 3, 5]], convexity = 1);
+ polyhedron(points = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]], faces = [[0, 4, 2], [0, 2, 5], [0, 3, 4], [0, 5, 3], [1, 2, 4], [1, 5, 2], [1, 4, 3], [1, 3, 5]], convexity = 1);
multmatrix([[1, 0, 0, 2], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
- polyhedron(points = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]], triangles = [[0, 4, 2], [0, 2, 5], [0, 3, 4], [0, 5, 3], [1, 2, 4], [1, 5, 2], [1, 3, 4], [1, 3, 5]], convexity = 1);
+ polyhedron(points = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]], faces = [[0, 4, 2], [0, 2, 5], [0, 3, 4], [0, 5, 3], [1, 2, 4], [1, 5, 2], [1, 3, 4], [1, 3, 5]], convexity = 1);
}
multmatrix([[1, 0, 0, 4], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
- polyhedron(points = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]], triangles = [[0, 2, 4], [0, 5, 2], [0, 4, 3], [0, 3, 5], [1, 4, 2], [1, 2, 5], [1, 3, 4], [1, 5, 3]], convexity = 1);
+ polyhedron(points = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]], faces = [[0, 2, 4], [0, 5, 2], [0, 4, 3], [0, 3, 5], [1, 4, 2], [1, 2, 5], [1, 3, 4], [1, 5, 3]], convexity = 1);
}
multmatrix([[1, 0, 0, 6], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
- polyhedron(points = [[-0.8, -0.8, -0.8], [0, 0, -0.8], [0.8, -0.8, -0.8], [0.8, 0.8, -0.8], [-0.8, 0.8, -0.8], [-0.8, -0.8, 0.8], [0, 0, 0.8], [0.8, -0.8, 0.8], [0.8, 0.8, 0.8], [-0.8, 0.8, 0.8]], triangles = [[0, 1, 2, 3, 4], [5, 6, 1, 0], [6, 7, 2, 1], [7, 8, 3, 2], [8, 9, 4, 3], [9, 5, 0, 4], [9, 8, 7, 6, 5]], convexity = 2);
+ polyhedron(points = [[-0.8, -0.8, -0.8], [0, 0, -0.8], [0.8, -0.8, -0.8], [0.8, 0.8, -0.8], [-0.8, 0.8, -0.8], [-0.8, -0.8, 0.8], [0, 0, 0.8], [0.8, -0.8, 0.8], [0.8, 0.8, 0.8], [-0.8, 0.8, 0.8]], faces = [[0, 1, 2, 3, 4], [5, 6, 1, 0], [6, 7, 2, 1], [7, 8, 3, 2], [8, 9, 4, 3], [9, 5, 0, 4], [9, 8, 7, 6, 5]], convexity = 2);
}
}
multmatrix([[1, 0, 0, 0], [0, 1, 0, 2], [0, 0, 1, 0], [0, 0, 0, 1]]) {
difference() {
group() {
- polyhedron(points = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]], triangles = [[0, 4, 2], [0, 2, 5], [0, 3, 4], [0, 5, 3], [1, 2, 4], [1, 5, 2], [1, 4, 3], [1, 3, 5]], convexity = 1);
+ polyhedron(points = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]], faces = [[0, 4, 2], [0, 2, 5], [0, 3, 4], [0, 5, 3], [1, 2, 4], [1, 5, 2], [1, 4, 3], [1, 3, 5]], convexity = 1);
multmatrix([[1, 0, 0, 2], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
- polyhedron(points = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]], triangles = [[0, 4, 2], [0, 2, 5], [0, 3, 4], [0, 5, 3], [1, 2, 4], [1, 5, 2], [1, 3, 4], [1, 3, 5]], convexity = 1);
+ polyhedron(points = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]], faces = [[0, 4, 2], [0, 2, 5], [0, 3, 4], [0, 5, 3], [1, 2, 4], [1, 5, 2], [1, 3, 4], [1, 3, 5]], convexity = 1);
}
multmatrix([[1, 0, 0, 4], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
- polyhedron(points = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]], triangles = [[0, 2, 4], [0, 5, 2], [0, 4, 3], [0, 3, 5], [1, 4, 2], [1, 2, 5], [1, 3, 4], [1, 5, 3]], convexity = 1);
+ polyhedron(points = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]], faces = [[0, 2, 4], [0, 5, 2], [0, 4, 3], [0, 3, 5], [1, 4, 2], [1, 2, 5], [1, 3, 4], [1, 5, 3]], convexity = 1);
}
multmatrix([[1, 0, 0, 6], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
- polyhedron(points = [[-0.8, -0.8, -0.8], [0, 0, -0.8], [0.8, -0.8, -0.8], [0.8, 0.8, -0.8], [-0.8, 0.8, -0.8], [-0.8, -0.8, 0.8], [0, 0, 0.8], [0.8, -0.8, 0.8], [0.8, 0.8, 0.8], [-0.8, 0.8, 0.8]], triangles = [[0, 1, 2, 3, 4], [5, 6, 1, 0], [6, 7, 2, 1], [7, 8, 3, 2], [8, 9, 4, 3], [9, 5, 0, 4], [9, 8, 7, 6, 5]], convexity = 2);
+ polyhedron(points = [[-0.8, -0.8, -0.8], [0, 0, -0.8], [0.8, -0.8, -0.8], [0.8, 0.8, -0.8], [-0.8, 0.8, -0.8], [-0.8, -0.8, 0.8], [0, 0, 0.8], [0.8, -0.8, 0.8], [0.8, 0.8, 0.8], [-0.8, 0.8, 0.8]], faces = [[0, 1, 2, 3, 4], [5, 6, 1, 0], [6, 7, 2, 1], [7, 8, 3, 2], [8, 9, 4, 3], [9, 5, 0, 4], [9, 8, 7, 6, 5]], convexity = 2);
}
}
multmatrix([[1, 0, 0, 3], [0, 1, 0, 0], [0, 0, 1, 2], [0, 0, 0, 1]]) {
diff --git a/tests/regression/opencsgtest/polyhedron-nonplanar-tests-expected.png b/tests/regression/opencsgtest/polyhedron-nonplanar-tests-expected.png
new file mode 100644
index 0000000..26a6791
--- /dev/null
+++ b/tests/regression/opencsgtest/polyhedron-nonplanar-tests-expected.png
Binary files differ
diff --git a/tests/regression/opencsgtest/polyhedron-tests-expected.png b/tests/regression/opencsgtest/polyhedron-tests-expected.png
index f6665cf..3574372 100644
--- a/tests/regression/opencsgtest/polyhedron-tests-expected.png
+++ b/tests/regression/opencsgtest/polyhedron-tests-expected.png
Binary files differ
diff --git a/tests/regression/throwntogethertest/polyhedron-nonplanar-tests-expected.png b/tests/regression/throwntogethertest/polyhedron-nonplanar-tests-expected.png
new file mode 100644
index 0000000..26a6791
--- /dev/null
+++ b/tests/regression/throwntogethertest/polyhedron-nonplanar-tests-expected.png
Binary files differ
diff --git a/tests/regression/throwntogethertest/polyhedron-tests-expected.png b/tests/regression/throwntogethertest/polyhedron-tests-expected.png
index c293d88..15e083e 100644
--- a/tests/regression/throwntogethertest/polyhedron-tests-expected.png
+++ b/tests/regression/throwntogethertest/polyhedron-tests-expected.png
Binary files differ
contact: Jan Huwald // Impressum