From 0ed762361dd2b5bc1eaff8cdf9d08f93fd24c2f3 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 23 May 2017 08:27:36 +0800 Subject: [PATCH] added crystal_ball --- README.md | 1 + docs/images/lib-crystal_ball-1.JPG | Bin 0 -> 26252 bytes docs/lib-crystal_ball.md | 49 +++++++++++++++++++++++++++++ src/crystal_ball.scad | 35 +++++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 docs/images/lib-crystal_ball-1.JPG create mode 100644 docs/lib-crystal_ball.md create mode 100644 src/crystal_ball.scad diff --git a/README.md b/README.md index ec675810..fe9c8b8d 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ Too many dependencies? Because OpenSCAD doesn't provide namespace management, I - 3D - [rounded_cube](https://openhome.cc/eGossip/OpenSCAD/lib-rounded_cube.html) - [rounded_cylinder](https://openhome.cc/eGossip/OpenSCAD/lib-rounded_cylinder.html) + - [crystal_ball](https://openhome.cc/eGossip/OpenSCAD/lib-crystal_ball.html) - [line3d](https://openhome.cc/eGossip/OpenSCAD/lib-line3d.html) - [polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib-polyline3d.html) - [hull_polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib-hull_polyline3d.html) diff --git a/docs/images/lib-crystal_ball-1.JPG b/docs/images/lib-crystal_ball-1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..27bca0f6605a7ea2c865d7f5c6a410ebef0e3352 GIT binary patch literal 26252 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 literal 0 HcmV?d00001 diff --git a/docs/lib-crystal_ball.md b/docs/lib-crystal_ball.md new file mode 100644 index 00000000..c8c193c4 --- /dev/null +++ b/docs/lib-crystal_ball.md @@ -0,0 +1,49 @@ +# crystal_ball + +Uses spherical coordinate system to create a crystal ball. + +![Spherical coordinates (r, θ, φ) often used in mathematics](https://upload.wikimedia.org/wikipedia/commons/d/dc/3D_Spherical_2.svg) + +Dependencies: `rotate_p`, `cross_sections`, `polysections`, `ring_extrude`, `shape_pie`. + +## Parameters + +- `radius` : The radial distance r. +- `theta` : The azimuthal angle. It defaults to 360. It also accepts a 2 element vector. The first element of the vector is the beginning angle in degrees, and the second element is the ending angle. +- `phi` : The polar angle. It defaults to 180. It also accepts a 2 element vector. The first element of the vector is the beginning angle in degrees, and the second element is the ending angle. +- `$fa`, `$fs`, `$fn` : Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) or [the sphere module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids#sphere) for more details. The final fragments will be a multiple of 4 to fit edges. + +## Examples + + include ; + include ; + include ; + include ; + include ; + include ; + + crystal_ball(radius = 6); + + translate([12, 0, 0]) + crystal_ball( + radius = 6, + theta = 270, + $fn = 12 + ); + + translate([24, 0, 0]) + crystal_ball( + radius = 6, + theta = 270, + phi = 90, + $fn = 12 + ); + + translate([36, 0, 0]) + crystal_ball( + radius = 6, + theta = [-30, 270], + phi = [30, 60] + ); + +![crystal_ball](images/lib-crystal_ball-1.JPG) diff --git a/src/crystal_ball.scad b/src/crystal_ball.scad new file mode 100644 index 00000000..1a91edd4 --- /dev/null +++ b/src/crystal_ball.scad @@ -0,0 +1,35 @@ +/** +* crystal_ball.scad +* +* Uses Spherical coordinate system to create a crystal ball. +* +* @copyright Justin Lin, 2017 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib-crystal_ball.html +* +**/ + +include <__private__/__nearest_multiple_of_4.scad>; +include <__private__/__is_vector.scad>; + +module crystal_ball(radius, theta = 360, phi = 180) { + phis = __is_vector(phi) ? phi : [0, phi]; + + frags = __frags(radius); + + shape_pts = shape_pie( + radius, + [90 - phis[1], 90 - phis[0]], + $fn = __nearest_multiple_of_4(__frags(frags)) + ); + + // _hole_r = 0.0005 for avoiding warnings + _hole_r = 0.0005; + ring_extrude( + shape_pts, + angle = theta, + radius = _hole_r, + $fn = frags + ); +} \ No newline at end of file