From cf5d70c1ef52cc1d7f0b44e22925c8f8fc7a75be Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Fri, 3 Jun 2022 12:46:54 +0800 Subject: [PATCH] add forest --- examples/circle_packing/forest.scad | 106 ++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 examples/circle_packing/forest.scad diff --git a/examples/circle_packing/forest.scad b/examples/circle_packing/forest.scad new file mode 100644 index 00000000..d6d6c0c8 --- /dev/null +++ b/examples/circle_packing/forest.scad @@ -0,0 +1,106 @@ +use ; +use ; +use ; +use ; +use ; + +use ; +use ; +use ; + +trunk_leng = 1.5; +branch_scale = 0.7; +branch_angle = 30; +width = 1; + +$fn = 12; +min_r = .5; +r = 35; +count = 20; + +fractal_tree = true; + +points = concat(rands_disk(r, count), shape_circle(r)); +circles = circle_packing(points, min_r); + +if(fractal_tree) { + for(c = circles) { + translate([each c[0], c[1] / 12.5]) + rotate([0, -90, rands(0, 360, 1)[0]]) + tree(t3d(), c[1], branch_scale, branch_angle, width, $fn = 5); + } +} +else { + for(c = circles) { + translate([each c[0], c[1] * 3]) + sphere(c[1]); + + translate(c[0]) + linear_extrude(c[1] * 3) + circle(c[1] / 3); + } +} + +translate([0, 0, -width / 10]) +linear_extrude(width / 1.5, center = true) + circle(r, $fn = $fn * 3); + +module line(t1, t2, start_width, end_width) { + polyline_join([t3d(t1, "point"), t3d(t2, "point")]) { + sphere(start_width / 2); + sphere(end_width / 2); + } +} + +module shoot(t, trunk_leng, branch_scale, branch_angle, width) { + t2 = t3d(t, "forward", leng = trunk_leng); + branch_leng = trunk_leng * branch_scale; + + color("NavajoWhite") + line(t, t2, branch_leng * branch_scale, branch_leng); + + color("green") { + t3 = t3d(t2, "turn", angle = branch_angle); + line( + t2, + t3d(t3, "forward", leng = branch_leng * rand(1, 2)), + branch_leng, + width * branch_scale * rand(2, 4), + $fn = rand(4, 6) + ); + + t4 = t3d(t2, "turn", angle = -branch_angle); + line( + t2, + t3d(t4, "forward", leng = branch_leng * rand(1, 2)), + branch_leng, + width * branch_scale * rand(2, 4), + $fn = rand(4, 6) + ); + } +} + +module tree(t, trunk_leng, branch_scale, branch_angle, width) { + if(trunk_leng > width * 2) { + t2 = t3d(t, "forward", leng = trunk_leng * rand(0.6, 1)); + + color("NavajoWhite") + line(t, t2, trunk_leng / 3, trunk_leng / 3 * branch_scale); + + rolled = t3d(t2, "roll", angle = 120 * rand(0.6, 1)); + branch_leng = trunk_leng * branch_scale; + + t3 = t3d(rolled, "turn", angle = branch_angle * rand(0.6, 1)); + tree(t3, branch_leng, branch_scale, branch_angle, width); + + t4 = t3d(rolled, "turn", angle = -branch_angle * rand(0.6, 1)); + tree(t4, branch_leng, branch_scale, branch_angle, width); + } + else { + branch_leng = trunk_leng * branch_scale; + shoot(t, branch_leng, branch_scale, branch_angle, width); + } +} + + +