From d408a63fcfcffce4a9f29d51156dfeea6c9eee12 Mon Sep 17 00:00:00 2001 From: Elena of Valhalla'' Grandi Date: Mon, 10 Nov 2014 22:08:37 +0100 Subject: Split library into polyhedra + faces --- lib/dice.scad | 162 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 110 insertions(+), 52 deletions(-) (limited to 'lib/dice.scad') 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 -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); + } +} + -- cgit v1.2.3