From 91817ff0bbffad0930214e81cc7f3712bb06cd14 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Mon, 15 May 2017 08:31:54 +0800 Subject: [PATCH] added shape_cyclicpolygon --- README.md | 1 + docs/images/lib-shape_cyclicpolygon-1.JPG | Bin 0 -> 13172 bytes docs/images/lib-shape_cyclicpolygon-2.JPG | Bin 0 -> 22757 bytes docs/lib-shape_cyclicpolygon.md | 58 ++++++++++++++++++++++ src/shape_cyclicpolygon.scad | 55 ++++++++++++++++++++ 5 files changed, 114 insertions(+) create mode 100644 docs/images/lib-shape_cyclicpolygon-1.JPG create mode 100644 docs/images/lib-shape_cyclicpolygon-2.JPG create mode 100644 docs/lib-shape_cyclicpolygon.md create mode 100644 src/shape_cyclicpolygon.scad diff --git a/README.md b/README.md index 9922abd1..2a6d3d38 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ Too many dependencies? Because OpenSCAD doesn't provide namespace management, I - [shape_ellipse](https://openhome.cc/eGossip/OpenSCAD/lib-shape_ellipse.html) - [shape_square](https://openhome.cc/eGossip/OpenSCAD/lib-shape_square.html) - [shape_trapezium](https://openhome.cc/eGossip/OpenSCAD/lib-shape_trapezium.html) + - [shape_cyclicpolygon](https://openhome.cc/eGossip/OpenSCAD/lib-shape_cyclicpolygon.html) - [shape_pentagram](https://openhome.cc/eGossip/OpenSCAD/lib-shape_pentagram.html) - [shape_superformula](https://openhome.cc/eGossip/OpenSCAD/lib-shape_superformula.html) diff --git a/docs/images/lib-shape_cyclicpolygon-1.JPG b/docs/images/lib-shape_cyclicpolygon-1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..c2ce30347369d2b9ab4fcd4950fd6aeae055004b GIT binary patch literal 13172 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 Iqx(Jo530^92mk;8 literal 0 HcmV?d00001 diff --git a/docs/images/lib-shape_cyclicpolygon-2.JPG b/docs/images/lib-shape_cyclicpolygon-2.JPG new file mode 100644 index 0000000000000000000000000000000000000000..69084f2904d2a02703ee7594bf59005eb7f4fce4 GIT binary patch literal 22757 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 VU)1xB68|C%|MO=2#U6f}{2%w~U6}v? literal 0 HcmV?d00001 diff --git a/docs/lib-shape_cyclicpolygon.md b/docs/lib-shape_cyclicpolygon.md new file mode 100644 index 00000000..07f7780a --- /dev/null +++ b/docs/lib-shape_cyclicpolygon.md @@ -0,0 +1,58 @@ +# shape_cyclicpolygon + +Returns shape points of a regular cyclic polygon. They can be used with xxx_extrude modules of dotSCAD. The shape points can be also used with the built-in polygon module. + +## Parameters + +- `sides` : The radius of the circle. +- `circle_r` : The radius of the circumcircle. +- `$fa`, `$fs`, `$fn` : Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) for more details. + +## Examples + + include ; + + circle_r = 10; + corner_r = 3; + + $fn = 24; + + for(i = [0:2]) { + translate([i * circle_r * 2, 0, 0]) + polygon( + shape_cyclicpolygon( + sides = 3 + i, + circle_r = circle_r, + corner_r = corner_r + ) + ); + } + + for(i = [0:2]) { + translate([i * circle_r * 2, -circle_r * 2, 0]) + polygon( + shape_cyclicpolygon( + sides = 4 + i, + circle_r = circle_r , + corner_r = corner_r + ) + ); + } + +![shape_cyclicpolygon](images/lib-shape_cyclicpolygon-1.JPG) + + include ; + include ; + include ; + include ; + include ; + + shape_pts = shape_cyclicpolygon( + sides = 5, + circle_r = 10, + corner_r = 3 + ); + + ring_extrude(shape_pts, radius = 20, angle = 180, twist = 90); + +![shape_cyclicpolygon](images/lib-shape_cyclicpolygon-2.JPG) diff --git a/src/shape_cyclicpolygon.scad b/src/shape_cyclicpolygon.scad new file mode 100644 index 00000000..defa0678 --- /dev/null +++ b/src/shape_cyclicpolygon.scad @@ -0,0 +1,55 @@ +/** +* shape_cyclicpolygon.scad +* +* Returns shape points of a regular cyclic polygon. +* They can be used with xxx_extrude modules of dotSCAD. +* The shape points can be also used with the built-in polygon module. +* +* @copyright Justin Lin, 2017 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib-shape_cyclicpolygon.html +* +**/ + +include <__private__/__frags.scad>; +include <__private__/__pie_for_rounding.scad>; + +function shape_cyclicpolygon(sides, circle_r, corner_r) = + let( + frag_a = 360 / sides, + corner_a = (180 - frag_a), + corner_circle_a = 180 - corner_a, + half_corner_circle_a = corner_circle_a / 2, + corner_circle_center = circle_r - corner_r / sin(corner_a / 2), + first_corner = [ + for( + pt = __pie_for_rounding( + corner_r, + -half_corner_circle_a, + half_corner_circle_a, + __frags(corner_r) * corner_circle_a / 360 + ) + ) + [pt[0] + corner_circle_center, pt[1]] + ] + + ) + concat( + first_corner, + [ + for(side = [1:sides - 1]) + for(pt = first_corner) + let( + a = frag_a * side, + x = pt[0], + y = pt[1], + sina = sin(a), + cosa = cos(a) + ) + [ + x * cosa - y * sina, + x * sina + y * cosa + ] + ] + ); \ No newline at end of file