From c5a549f07f165c1e42df149e07c11c1ec6790f0a Mon Sep 17 00:00:00 2001 From: maride Date: Mon, 5 Feb 2018 22:11:28 +0100 Subject: [PATCH] Add libcircle --- circle.scad | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 circle.scad diff --git a/circle.scad b/circle.scad new file mode 100644 index 0000000..49d913e --- /dev/null +++ b/circle.scad @@ -0,0 +1,86 @@ +/* + * circle + * + * + * Functions: + * libcircle_quarter and its alias libcircle_14 + * libcircle_half and its alias libcircle_24 and libcircle_12 + * libcircle_threequarter and its alias libcircle_34 + * + * All functions take either r (radius) or d (diameter) as argument. + * If both are given (for whatever reason you'd do this), radius is chosen over diameter. + * Same applies for libcircle_degrees, however you also need to pass this module + * the "degrees" argument which is pretty self-explanatory. + */ + +$fn = 36; + +module libcircle_14(r=0, d=0) { + libcircle_quarter(r, d); +} + +module libcircle_quarter(r=0, d=0) { + diameter = __diameter_radius_conversion(r, d); + intersection() { + circle(d=diameter); + square([radius, radius]); + } +} + +module libcircle_24(r=0, d=0) { + libcircle_half(r, d); +} + +module libcircle_12(r=0, d=0) { + libcircle_half(r, d); +} + +module libcircle_half(r=0, d=0) { + diameter = __diameter_radius_conversion(r, d); + intersection() { + circle(d=diameter); + translate([0, -diameter, 0]) + square([diameter, diameter*2]); + } +} + +module libcircle_34(r=0, d=0) { + libcircle_threequarter(r, d); +} + +module libcircle_threequarter(r=0, d=0) { + diameter = __diameter_radius_conversion(r, d); + difference() { + circle(d=diameter); + translate([-diameter, 0, 0]) + square([diameter, diameter]); + } +} + +module libcircle_degrees(r=0, d=0, degrees) { + diameter = __diameter_radius_conversion(r, d); + degrees = degrees % 360; + + if(degrees > 180) { + __half_circle_degrees(diameter, 180); + rotate([0, 0, 180]) + __half_circle_degrees(diameter, degrees-180); + } else { + __half_circle_degrees(diameter, degrees); + } +} + +module __half_circle_degrees(diameter, degrees) { + // This is the most dirty hack I've pulled in a while. + // But... Who cares? #sorrynotsorry ;) + difference() { + libcircle_half(d=diameter); + rotate([0, 0, degrees]) + translate([0, -diameter/2]) + square([diameter/2, diameter]); + } +} + +// https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/General#Scope_of_variables +// let's work our way around this... ;( +function __diameter_radius_conversion(r=0, d=0) = (r > 0) ? r*2 : d;