From f9d077350b2460fe65a82805e7efdbb0ad5c8825 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 23 Mar 2017 11:33:38 +0800 Subject: [PATCH] added circle_path --- README.md | 1 + docs/images/lib-circle_path-1.JPG | Bin 0 -> 33625 bytes docs/lib-circle_path.md | 27 +++++++++++++++++++++++++++ src/circle_path.scad | 23 +++++++++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 docs/images/lib-circle_path-1.JPG create mode 100644 docs/lib-circle_path.md create mode 100644 src/circle_path.scad diff --git a/README.md b/README.md index 78295dd5..c345184c 100644 --- a/README.md +++ b/README.md @@ -24,4 +24,5 @@ I've been using OpenSCAD for years and created some funny things. Some of them i - [bend](https://openhome.cc/eGossip/OpenSCAD/lib-bend.html) - Path + - [circle_path](https://openhome.cc/eGossip/OpenSCAD/lib-circle_path.html) - [bezier](https://openhome.cc/eGossip/OpenSCAD/lib-bezier.html) diff --git a/docs/images/lib-circle_path-1.JPG b/docs/images/lib-circle_path-1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..61336abd0b1c1b71132aad63f3cccced39e45eca GIT binary patch literal 33625 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μb9c%He3xluPV3%kUur$bF8A4UndX$b5wy2K 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 literal 0 HcmV?d00001 diff --git a/docs/lib-circle_path.md b/docs/lib-circle_path.md new file mode 100644 index 00000000..bcdbd915 --- /dev/null +++ b/docs/lib-circle_path.md @@ -0,0 +1,27 @@ +# circle_path + +Sometimes you need all points on the path of a circle. Here's the function. Its `$fa`, `$fs` and `$fn` parameters are consistent with the `circle` module. + +## Parameters + +- `radius` : The radius of the circle. +- `$fa`, `$fs`, `$fn` : Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) for more details. + +## Examples + + $fn = 24; + + points = circle_path(radius = 50); + polygon(points); + + leng = len(points); + step_angle = 360 / leng; + for(i = [0:leng - 1]) { + translate(points[i]) + rotate([90, 0, 90 + i * step_angle]) + linear_extrude(1, center = true) + text("A", valign = "center", halign = "center"); + } + +![circle_path](images/lib-circle_path-1.JPG) + diff --git a/src/circle_path.scad b/src/circle_path.scad new file mode 100644 index 00000000..30a53bbd --- /dev/null +++ b/src/circle_path.scad @@ -0,0 +1,23 @@ +/** +* circle_path.scad +* +* Sometimes you need all points on the path of a circle. Here's +* the function. Its $fa, $fs and $fn parameters are consistent +* with the circle module. +* +* @copyright Justin Lin, 2017 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib-circle_path.html +* +**/ + +function _frags(radius) = $fn > 0 ? + ($fn >= 3 ? $fn : 3) : + max(min(360 / $fa, radius * 2 * 3.14159 / $fs), 5); + +function circle_path(radius) = + [ + for(a = [0 : 360 / _frags(radius) : 360 - 360 / _frags(radius)]) + [radius * cos(a), radius * sin(a)] + ];