aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/dice.scad162
1 files changed, 110 insertions, 52 deletions
diff --git a/lib/dice.scad b/lib/dice.scad
index b14d315..58d00e8 100644
--- a/lib/dice.scad
+++ b/lib/dice.scad
@@ -1,22 +1,19 @@
use <utils.scad>
-module d4(size=false, side=false) {
- l = side ? side : s2s_d4(size);
- if (l == false) {
- echo("ERROR: d4: one of side or size should be defined");
- }
- sc_face = 0.6;
- r = sqrt(6)/4*l;
+// Tetrahedron inscribed in a sphere of radius r
+module tetrahedron(r) {
c = r*2;
- difference() {
- intersection() {
- sphere(r=r*0.79, $fn=64);
- translate([0, 0, r-r/3]) cube(c, center=true);
- intersection_for ( i = [0:2] ) {
- rotate([0, 0, 120*i]) rotate([acos(1/3)+180, 0, 0])
- translate([0, 0, r-r/3]) cube(c, center=true);
- }
+ intersection() {
+ translate([0, 0, r-r/3]) cube(c, center=true);
+ intersection_for ( i = [0:2] ) {
+ rotate([0, 0, 120*i]) rotate([acos(1/3)+180, 0, 0])
+ translate([0, 0, r-r/3]) cube(c, center=true);
}
+ }
+}
+
+module tetrahedron_faces(r, sc_face=0.6) {
+ union() {
rotate([180, 0, 180]) translate([0, 0, r/3]) scale([sc_face, sc_face, 1]) child(0);
rotate([acos(1/3)+180, 0, 0]) rotate([180, 0, 0]) translate([0, 0, r/3]) scale([sc_face, sc_face, 1]) child(1);
rotate([0, 0, 120]) rotate([acos(1/3)+180, 0, 0]) rotate([180, 0, 0]) translate([0, 0, r/3]) scale([sc_face, sc_face, 1]) child(2);
@@ -24,16 +21,22 @@ module d4(size=false, side=false) {
}
}
-module d6(size=false, side=false) {
- l = side ? side : s2s_d6(size);
+module d4(size=false, side=false) {
+ l = side ? side : s2s_d4(size);
if (l == false) {
- echo("ERROR: d6: one of side or size should be defined");
+ echo("ERROR: d4: one of side or size should be defined");
}
+ r = sqrt(6)/4*l;
difference() {
intersection() {
- cube(l, center=true);
- sphere(l*0.79);
+ sphere(r=r*0.79, $fn=64);
+ tetrahedron(r);
}
+ }
+}
+
+module cube_faces(l) {
+ union() {
translate([0, 0, l/2]) child(0);
rotate([90, 0, 0]) translate([0, 0, l/2]) child(1);
rotate([0, 90, 0]) translate([0, 0, l/2]) child(2);
@@ -43,24 +46,35 @@ module d6(size=false, side=false) {
}
}
-module d8(size=false, side=false) {
- l = side ? side : s2s_d8(size);
+module d6(size=false, side=false) {
+ l = side ? side : s2s_d6(size);
if (l == false) {
- echo("ERROR: d8: one of side or size should be defined");
+ echo("ERROR: d6: one of side or size should be defined");
}
- sc_face = 0.6;
- r = sqrt(2)/2*l;
- c = r*2;
- i_r = sqrt(6)/6*l;
difference() {
intersection() {
- sphere(r*0.86, $fn=64);
- cube([c, c, i_r*2], center=true);
- intersection_for ( i = [0:2] ) {
+ cube(l, center=true);
+ sphere(l*0.79);
+ }
+ }
+}
- rotate([0, 0, 120*i]) rotate([acos(-1/3), 0, 0]) cube([c, c, i_r*2], center=true);
- }
+// Octahedron inscribed in a sphere of radius r
+module octahedron(r) {
+ c = r*2;
+ i_r = r / sqrt(3);
+ intersection() {
+ cube([c, c, i_r*2], center=true);
+ intersection_for ( i = [0:2] ) {
+ rotate([0, 0, 120*i]) rotate([acos(-1/3), 0, 0]) cube([c, c, i_r*2], center=true);
}
+ }
+}
+
+module octahedron_faces(r, sc_face=0.6) {
+ c = r*2;
+ i_r = r / sqrt(3);
+ union() {
translate([0, 0, i_r]) rotate([0, 0, 180]) scale([sc_face, sc_face, 1]) child(0);
rotate([acos(-1/3), 0, 0]) translate([0, 0, i_r]) scale([sc_face, sc_face, 1]) child(4);
rotate([0, 0, 120]) rotate([acos(-1/3)+180, 0, 0]) translate([0, 0, i_r]) rotate([0, 0, 120]) scale([sc_face, sc_face, 1]) child(6);
@@ -72,24 +86,37 @@ module d8(size=false, side=false) {
}
}
-module d12(size=false, side=false) {
- l = side ? side : s2s_d12(size);
+module d8(size=false, side=false) {
+ l = side ? side : s2s_d8(size);
if (l == false) {
- echo("ERROR: d12: one of side or size should be defined");
+ echo("ERROR: d8: one of side or size should be defined");
}
- sc_face = 1.1;
- r = l*sqrt(3)*(1+sqrt(5))/4;
+ r = sqrt(2)/2*l;
+ intersection() {
+ sphere(r*0.86, $fn=64);
+ octahedron(r);
+ }
+}
+
+// Dodecahedron inscribed in a sphere of radius r
+module dodecahedron(r) {
c = r*2;
+ l = r * 4 / (sqrt(3) * (1+sqrt(5)));
i_r = (l/2)*sqrt(5/2 + 11*sqrt(5)/10);
- difference() {
- intersection() {
- sphere(r*0.96, $fn=64);
- cube([c, c, i_r*2], center=true);
- intersection_for ( i = [0:4] ) {
-
- rotate([0, 0, 72*i]) rotate([acos(-1/sqrt(5)), 0, 0]) cube([c, c, i_r*2], center=true);
- }
+ intersection() {
+ cube([c, c, i_r*2], center=true);
+ intersection_for ( i = [0:4] ) {
+ rotate([0, 0, 72*i]) rotate([acos(-1/sqrt(5)), 0, 0]) cube([c, c, i_r*2], center=true);
}
+ }
+}
+
+module dodecahedron_faces(r, sc_face=1.1) {
+ c = r*2;
+ l = r * 4 / (sqrt(3) * (1+sqrt(5)));
+ echo(l);
+ i_r = (l/2)*sqrt(5/2 + 11*sqrt(5)/10);
+ union() {
translate([0, 0, i_r]) scale([sc_face, sc_face, 1]) child(0);
rotate([acos(-1/sqrt(5))+180, 0, 0]) translate([0, 0, i_r]) scale([sc_face, sc_face, 1]) child(1);
rotate([0, 0, 72]) rotate([acos(-1/sqrt(5))+180, 0, 0]) translate([0, 0, i_r]) scale([sc_face, sc_face, 1]) child(3);
@@ -106,21 +133,28 @@ module d12(size=false, side=false) {
}
}
-module d20(size=false, side=false) {
- l = side ? side : s2s_d20(size);
+module d12(size=false, side=false) {
+ l = side ? side : s2s_d12(size);
if (l == false) {
- echo("ERROR: d20: one of side or size should be defined");
+ echo("ERROR: d12: one of side or size should be defined");
}
- sc_face = 0.5;
- r = l*sqrt(10+2*sqrt(5))/4;
+ r = l*sqrt(3)*(1+sqrt(5))/4;
+ intersection() {
+ sphere(r*0.96, $fn=64);
+ dodecahedron(r);
+ }
+}
+
+module icosahedron(r) {
+ l = r*4/(sqrt(10+2*sqrt(5)));
+ echo(r);
+ echo(l);
c = r*2;
i_r = (l/12)*sqrt(3)*(3+sqrt(5));
a_b2 = atan(1/2) + acos(-sqrt(5)/3)/2;
phi = (1+sqrt(5))/2;
rotate([0, -acos((-(1+sqrt(5)))/(2*sqrt(3))), 0])
- difference() {
intersection() {
- sphere(r*0.96, $fn=64);
rotate([0, acos((-(1+sqrt(5)))/(2*sqrt(3))), 0]) cube([c, c, i_r*2], center=true);
mirror([1, 0, 0]) rotate([0, acos((-(1+sqrt(5)))/(2*sqrt(3))), 0]) cube([c, c, i_r*2], center=true);
rotate([0, acos(1/sqrt(3)), -45]) cube([c, c, i_r*2], center=true);
@@ -132,6 +166,18 @@ module d20(size=false, side=false) {
rotate([0, 90, atan((-sqrt(5)+1)/(sqrt(5)+1))]) cube([c, c, i_r*2], center=true);
mirror([0, 1, 0]) rotate([0, 90, atan((-sqrt(5)+1)/(sqrt(5)+1))]) cube([c, c, i_r*2], center=true);
}
+}
+
+module icosahedron_faces(r, sc_face=0.5) {
+ l = r*4/(sqrt(10+2*sqrt(5)));
+ echo(r);
+ echo(l);
+ c = r*2;
+ i_r = (l/12)*sqrt(3)*(3+sqrt(5));
+ a_b2 = atan(1/2) + acos(-sqrt(5)/3)/2;
+ phi = (1+sqrt(5))/2;
+ rotate([0, -acos((-(1+sqrt(5)))/(2*sqrt(3))), 0])
+ union() {
rotate([0, acos((-(1+sqrt(5)))/(2*sqrt(3))), 0]) translate([0, 0, i_r]) rotate([0, 0, 90]) scale([sc_face, sc_face, 1]) child(0);
rotate([180, acos((-(1+sqrt(5)))/(2*sqrt(3))), 0]) translate([0, 0, i_r]) rotate([0, 0, 270]) scale([sc_face, sc_face, 1]) child(19);
@@ -164,3 +210,15 @@ module d20(size=false, side=false) {
}
}
+module d20(size=false, side=false) {
+ l = side ? side : s2s_d20(size);
+ if (l == false) {
+ echo("ERROR: d20: one of side or size should be defined");
+ }
+ r = l*sqrt(10+2*sqrt(5))/4;
+ intersection() {
+ sphere(r*0.96, $fn=64);
+ icosahedron(r);
+ }
+}
+