From 4c7ef79c17f1bc29c95a4254cc469a9d300c2121 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 19 Sep 2019 10:10:32 +0800 Subject: [PATCH] add string_tetrahedron --- examples/string_tetrahedron.scad | 94 ++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 examples/string_tetrahedron.scad diff --git a/examples/string_tetrahedron.scad b/examples/string_tetrahedron.scad new file mode 100644 index 00000000..c3fe7a4e --- /dev/null +++ b/examples/string_tetrahedron.scad @@ -0,0 +1,94 @@ +include ; + +leng = 50; +thickness = 5; +segs_per_side = 20; +line_fn = 5; +model = "Tetrahedron"; // [Tetrahedron, Base, Both] + +module lines_between(side1, side2, thickness, segs) { + function pts(p1, p2, segs) = + let( + p = p2 - p1, + dx = p[0] / segs, + dy = p[1] / segs, + dz = p[2] / segs + ) [for(i = [0:segs]) p1 + [dx, dy, dz] * i]; + + pts1 = pts(side1[0], side1[1], segs); + pts2 = pts(side2[0], side2[1], segs); + + for(i = [0:len(pts1) - 1]) { + hull_polyline3d(points = [pts1[i], pts2[i]], thickness = thickness); + } +} + +function height(leng) = + leng * sqrt(1 - 4 / 9 * pow(sin(60), 2)); + +function vts(leng) = + let( + half_leng = leng / 2, + vt1 = [half_leng, 0, 0], + vt2 = [0, leng * sin(60), 0], + vt3 = [-half_leng, 0, 0], + vt4 = [0, half_leng * tan(30), height(leng)] + ) [vt1, vt2, vt3, vt4]; + +module string_tetrahedron(leng, thickness, segs_per_side, line_fn) { + $fn = line_fn; + + half_leng = leng / 2; + + vts = vts(leng); + + vt1 = vts[0]; + vt2 = vts[1]; + vt3 = vts[2]; + vt4 = vts[3]; + + lines_between([vt1, vt2], [vt3, vt4], thickness, segs_per_side); + lines_between([vt2, vt3], [vt1, vt4], thickness, segs_per_side); + lines_between([vt3, vt1], [vt2, vt4], thickness, segs_per_side); +} + +module base(leng, thickness, line_fn) { + vts = vts(leng); + r = leng / 4; + half_th = thickness / 2; + + difference() { + sphere(r, $fn = 48); + + translate([0, 0, -r]) + linear_extrude(r) + square(r * 2, center = true); + + translate([0, 0, height(leng) + half_th]) + rotate([0, 180, 0]) + translate([0, -leng / 2 * tan(30), 0]) + hull() { + translate(vts[0]) + sphere(half_th, $fn = line_fn); + translate(vts[1]) + sphere(half_th, $fn = line_fn); + translate(vts[2]) + sphere(half_th, $fn = line_fn); + translate(vts[3]) + sphere(half_th, $fn = line_fn); + } + } +} + +if(model == "Tetrahedron") { + string_tetrahedron(leng, thickness, segs_per_side, line_fn); +} else if(model == "Base") { + base(leng, thickness, line_fn); +} else { + translate([0, 0, height(leng) + half_th]) + rotate([0, 180, 0]) + translate([0, -leng / 2 * tan(30), 0]) + string_tetrahedron(leng, thickness, segs_per_side, line_fn); + base(leng, thickness, line_fn); +} +