From 8dad1bd4b6b2a21c6e11ac50e9fa5b286cc7d568 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 26 Oct 2021 09:33:47 +0800 Subject: [PATCH] add platonic_solid_frame --- examples/platonic_solid_frame.scad | 40 ++++++++++++++++++++++++++ src/experimental/polyhedron_frame.scad | 4 +-- 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 examples/platonic_solid_frame.scad diff --git a/examples/platonic_solid_frame.scad b/examples/platonic_solid_frame.scad new file mode 100644 index 00000000..d6b1a548 --- /dev/null +++ b/examples/platonic_solid_frame.scad @@ -0,0 +1,40 @@ +use ; +use ; +use ; +use ; +use ; +use ; +use ; +use ; + +number_of_faces = 8; // [3, 6, 8, 12, 20] +radius = 10; +deep = 1; +outer_thickness = .5; +inner_thickness = .5; +detail = 1; + +platonic_solid_frame(number_of_faces, radius, deep, outer_thickness, inner_thickness, detail); + +module platonic_solid_frame(number_of_faces, radius, deep, outer_thickness, inner_thickness, detail) { + polyhedra = hashmap([ + [3, function(r, d) geom_tetrahedron(r, d)], + [6, function(r, d) geom_hexahedron(r, d)], + [8, function(r, d) geom_octahedron(r, d)], + [12, function(r, d) geom_dodecahedron(r, d)], + [20, function(r, d) geom_icosahedron(r, d)], + ]); + + f_polyhedron = hashmap_get(polyhedra, number_of_faces); + + geom = f_polyhedron(radius, detail); + + polyhedron_frame( + geom[0], + geom[1], + deep, + outer_thickness, + inner_thickness, + [for(p = geom[0]) p / norm(p)] + ); +} diff --git a/src/experimental/polyhedron_frame.scad b/src/experimental/polyhedron_frame.scad index c180f527..ec7b5735 100644 --- a/src/experimental/polyhedron_frame.scad +++ b/src/experimental/polyhedron_frame.scad @@ -2,7 +2,7 @@ use ; use <__comm__/_vertex_normals.scad>; use ; -module polyhedron_frame(points, faces, deep, outer_thickness, inner_thickness = 0) { +module polyhedron_frame(points, faces, deep, outer_thickness, inner_thickness = 0, normals = undef) { function hollow_face(pts, inner_pts) = let( leng = len(pts), @@ -87,7 +87,7 @@ module polyhedron_frame(points, faces, deep, outer_thickness, inner_thickness = leng_faces = len(faces); - vx_normals = _vertex_normals(points, faces); + vx_normals = is_undef(normals) ? _vertex_normals(points, faces) : normals; inner_pts = [ for(i = [0:len(vx_normals) - 1]) points[i] - vx_normals[i] * deep