From 83faf53cdd1952b91ac8ace940562e5211a2c71f Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 6 May 2017 06:56:24 +0800 Subject: [PATCH] added sphere_spiral_extrude --- README.md | 1 + docs/images/lib-sphere_spiral_extrude-1.JPG | Bin 0 -> 37949 bytes docs/lib-sphere_spiral_extrude.md | 63 ++++++++++++++++++++ src/sphere_spiral_extrude.scad | 36 +++++++++++ 4 files changed, 100 insertions(+) create mode 100644 docs/images/lib-sphere_spiral_extrude-1.JPG create mode 100644 docs/lib-sphere_spiral_extrude.md create mode 100644 src/sphere_spiral_extrude.scad diff --git a/README.md b/README.md index c21fbc95..8a06680f 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,7 @@ Too many dependencies? Because OpenSCAD doesn't provide namespace management, I - [helix_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-helix_extrude.html) - [golden_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-golden_spiral_extrude.html) - [archimedean_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-archimedean_spiral_extrude.html) + - [sphere_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-sphere_spiral_extrude_spiral_extrude.html) - Other - [turtle2d](https://openhome.cc/eGossip/OpenSCAD/lib-turtle2d.html) diff --git a/docs/images/lib-sphere_spiral_extrude-1.JPG b/docs/images/lib-sphere_spiral_extrude-1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..41e25eac1f9a444faf6c7a749f8a162c13368c32 GIT binary patch literal 37949 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 literal 0 HcmV?d00001 diff --git a/docs/lib-sphere_spiral_extrude.md b/docs/lib-sphere_spiral_extrude.md new file mode 100644 index 00000000..e8613760 --- /dev/null +++ b/docs/lib-sphere_spiral_extrude.md @@ -0,0 +1,63 @@ +# sphere_spiral_extrude + +Extrudes a 2D shape along the path of a sphere spiral. + +When using this module, you should use points to represent the 2D shape. You need to provide indexes of triangles, too. This module provides two prepared triangles indexes. One is `"RADIAL"`. See [polysections](https://openhome.cc/eGossip/OpenSCAD/lib-polysections.html) for details. + +Dependencies: `rotate_p`, `sphere_spiral`, `cross_sections`, `polysections`. + +## Parameters + +- `shape_pts` : A list of points represent a shape. See the example below. +- `radius` , `za_step`, `z_circles`, `begin_angle`, `end_angle`, `vt_dir`, `rt_dir` : See [sphere_spiral](https://openhome.cc/eGossip/OpenSCAD/lib-sphere_spiral.html) for details. +- `twist` : The number of degrees of through which the shape is extruded. +- `scale` : Scales the 2D shape by this value over the length of the extrusion. Scale can be a scalar or a vector. +- `triangles` : `"RADIAL"` (default), `"HOLLOW"` or user-defined indexes. See [polysections](https://openhome.cc/eGossip/OpenSCAD/lib-polysections.html) for details. + +## Examples + + include ; + include ; + include ; + include ; + include ; + + function shape_pentagram(r) = + [ + // shape points + [ + [0, 1], [-0.224514, 0.309017], + [-0.951057, 0.309017], [-0.363271, -0.118034], + [-0.587785, -0.809017], [0, -0.381966], + [0.587785, -0.809017], [0.363271, -0.118034], + [0.951057, 0.309017], [0.224514, 0.309017] + ] * r, + // triangles + [ + [0, 1, 9], + [2, 3, 1], + [4, 5, 3], + [6, 7, 5], + [8, 9, 7], + [1, 3, 5], + [1, 5, 7], + [1, 7, 9] + ] + ]; + + points_triangles = shape_pentagram(2); + + + sphere_spiral_extrude( + shape_pts = points_triangles[0], + radius = 40, + za_step = 2, + z_circles = 20, + begin_angle = 90, + end_angle = 450, + vt_dir = "SPI_UP", + scale = 5, + triangles = points_triangles[1] + ); + +![sphere_spiral_extrude](images/lib-sphere_spiral_extrude-1.JPG) diff --git a/src/sphere_spiral_extrude.scad b/src/sphere_spiral_extrude.scad new file mode 100644 index 00000000..89600f23 --- /dev/null +++ b/src/sphere_spiral_extrude.scad @@ -0,0 +1,36 @@ +/** +* sphere_spiral_extrude.scad +* +* Extrudes a 2D shape along the path of a sphere spiral. +* +* @copyright Justin Lin, 2017 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib-sphere_spiral_extrude.html +* +**/ + +module sphere_spiral_extrude(shape_pts, radius, za_step, + z_circles = 1, begin_angle = 0, end_angle = 0, vt_dir = "SPI_DOWN", rt_dir = "CT_CLK", + twist = 0, scale = 1.0, triangles = "RADIAL") { + + points_angles = sphere_spiral( + radius = radius, + za_step = za_step, + z_circles = z_circles, + begin_angle = begin_angle, + end_angle = end_angle, + vt_dir = vt_dir, + rt_dir = rt_dir + ); + + points = [for(pa = points_angles) pa[0]]; + angles = [for(pa = points_angles) [pa[1][0] + 90, pa[1][1], pa[1][2]]]; + + polysections( + cross_sections( + shape_pts, points, angles, twist = twist, scale = scale + ), + triangles = triangles + ); +} \ No newline at end of file