Add libcircle
This commit is contained in:
parent
16cf0a7b53
commit
c5a549f07f
86
circle.scad
Normal file
86
circle.scad
Normal file
@ -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;
|
Loading…
Reference in New Issue
Block a user