mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-11 17:24:20 +02:00
move
This commit is contained in:
105
examples/turtle/forest.scad
Normal file
105
examples/turtle/forest.scad
Normal file
@@ -0,0 +1,105 @@
|
||||
include <line2d.scad>;
|
||||
include <turtle/turtle2d.scad>;
|
||||
|
||||
style = "MIRROR"; // [TREES, INVERTED, MIRROR]
|
||||
trunk_angle = 86; // [1:90]
|
||||
max_trunk_length = 400;
|
||||
min_trunk_length = 2;
|
||||
width = 1.5;
|
||||
k1 = 1.5;
|
||||
k2 = 1.0;
|
||||
|
||||
// Style: TREES, INVERTED, MIRROR
|
||||
module forest(trunk_angle, max_trunk_length, min_trunk_length, style = "TREES", k1 = 1.5, k2 = 1.0, width = 1) {
|
||||
k = 1.0 / (k1 + 2 * k2 + 2 * (k1 + k2) * cos(trunk_angle));
|
||||
|
||||
function forward(t, leng) = turtle2d("forward", t, leng);
|
||||
function turn(t, ang) = turtle2d("turn", t, ang);
|
||||
function pt(t) = turtle2d("pt", t);
|
||||
|
||||
module trunk(t, length) {
|
||||
if (length > min_trunk_length) {
|
||||
// baseline
|
||||
if(style != "INVERTED") {
|
||||
line2d(t[0], pt(forward(t, length)), width);
|
||||
} else {
|
||||
inverted_trunk(t, length);
|
||||
}
|
||||
|
||||
if(style == "MIRROR") {
|
||||
mirror([0, 1, 0]) inverted_trunk(t, length);
|
||||
}
|
||||
|
||||
trunk(t, k * k1 * length);
|
||||
|
||||
// left side of "k * k1 * length" trunks
|
||||
t1 = turn(
|
||||
forward(t, k * k1 * length),
|
||||
trunk_angle
|
||||
);
|
||||
trunk(t1, k * k1 * length);
|
||||
|
||||
// right side of "k * k1 * length" trunks
|
||||
t2 = turn(
|
||||
forward(t1, k * k1 * length),
|
||||
-2 * trunk_angle
|
||||
);
|
||||
trunk(t2, k * k1 * length);
|
||||
|
||||
// "k * length" trunks
|
||||
t3 = turn(
|
||||
forward(t2, k * k1 * length),
|
||||
trunk_angle
|
||||
);
|
||||
trunk(t3, k * length);
|
||||
|
||||
// left side of "k * k2 * length" trunks
|
||||
t4 = turn(
|
||||
forward(t3, k * length), trunk_angle
|
||||
);
|
||||
trunk(t4, k * k2 * length);
|
||||
|
||||
// right side of "k * k2 * length" trunks
|
||||
t5 = turn(
|
||||
forward(t4, k * k2 * length), -2 * trunk_angle
|
||||
);
|
||||
trunk(t5, k * k2 * length);
|
||||
|
||||
// "k * k2 * length" trunks
|
||||
trunk(
|
||||
turn(
|
||||
forward(t5, k * k2 * length),
|
||||
trunk_angle
|
||||
),
|
||||
k * k2 * length
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module inverted_trunk(t, length) {
|
||||
|
||||
if(k * k1 * length > min_trunk_length) {
|
||||
t1 = forward(t, k * k1 * length);
|
||||
t2 = forward(turn(t1, trunk_angle), k * k1 * length);
|
||||
t3 = forward(turn(t2, -2 * trunk_angle), k * k1 * length);
|
||||
offset(r = width * 0.25) polygon([t1[0], t2[0], t3[0]]);
|
||||
|
||||
if(k * length > min_trunk_length && k * k2 * length > min_trunk_length) {
|
||||
t4 = forward(turn(t3, trunk_angle), k * length);
|
||||
t5 = forward(turn(t4, trunk_angle), k * k2 * length);
|
||||
t6 = forward(turn(t5, -2 * trunk_angle), k * k2 * length);
|
||||
offset(r = width * 0.25) polygon([t4[0], t5[0], t6[0]]);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
trunk(turtle2d("create", 0, 0, 0), max_trunk_length);
|
||||
|
||||
if(style == "INVERTED") {
|
||||
line2d([0, 0], [max_trunk_length, 0], width);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
forest(trunk_angle, max_trunk_length, min_trunk_length, style, k1, k2, width);
|
56
examples/turtle/sierpinski_triangle.scad
Normal file
56
examples/turtle/sierpinski_triangle.scad
Normal file
@@ -0,0 +1,56 @@
|
||||
include <line2d.scad>;
|
||||
include <turtle/turtle2d.scad>;
|
||||
|
||||
module triangle(t, side_leng, width) {
|
||||
$fn = 48;
|
||||
angle = 120;
|
||||
t_p1 = turtle2d("forward", t, side_leng);
|
||||
line2d(
|
||||
turtle2d("pt", t), turtle2d("pt", t_p1),
|
||||
width, p1Style = "CAP_ROUND", p2Style = "CAP_ROUND"
|
||||
);
|
||||
|
||||
t_p2 = turtle2d("forward", turtle2d("turn", t_p1, angle), side_leng);
|
||||
line2d(
|
||||
turtle2d("pt", t_p1), turtle2d("pt", t_p2),
|
||||
width, p1Style = "CAP_ROUND", p2Style = "CAP_ROUND"
|
||||
);
|
||||
|
||||
t_p3 = turtle2d("forward", turtle2d("turn", t_p2, angle), side_leng);
|
||||
line2d(
|
||||
turtle2d("pt", t_p2), turtle2d("pt", t_p3),
|
||||
width, p1Style = "CAP_ROUND", p2Style = "CAP_ROUND"
|
||||
);
|
||||
}
|
||||
|
||||
module two_triangles(t, side_len, len_limit, width) {
|
||||
angle = 60;
|
||||
triangle(t, side_len, width);
|
||||
next_t = turtle2d("turn", turtle2d("forward", t, side_len / 2), angle);
|
||||
triangle(next_t, side_len / 2, width);
|
||||
}
|
||||
|
||||
module sierpinski_triangle(t, side_len, len_limit, width) {
|
||||
if(side_len >= len_limit) {
|
||||
two_triangles(t, side_len, len_limit, width);
|
||||
|
||||
sierpinski_triangle(t, side_len / 2, len_limit, width);
|
||||
|
||||
sierpinski_triangle(
|
||||
turtle2d("forward", t, side_len / 2),
|
||||
side_len / 2, len_limit, width
|
||||
);
|
||||
|
||||
sierpinski_triangle(
|
||||
turtle2d("turn", turtle2d("forward", turtle2d("turn", t, 60), side_len / 2), -60),
|
||||
side_len / 2, len_limit, width
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
side_len = 150;
|
||||
len_limit = 4;
|
||||
width = 0.5;
|
||||
t = turtle2d("create", 0, 0, 0);
|
||||
|
||||
sierpinski_triangle(t, side_len, len_limit, width);
|
38
examples/turtle/tree.scad
Normal file
38
examples/turtle/tree.scad
Normal file
@@ -0,0 +1,38 @@
|
||||
include <turtle/turtle3d.scad>;
|
||||
include <line3d.scad>;
|
||||
|
||||
module tree(t, leng, leng_scale1, leng_scale2, leng_limit,
|
||||
angleZ, angleX, width) {
|
||||
if(leng > leng_limit) {
|
||||
t2 = turtle3d("xu_move", t, leng);
|
||||
|
||||
line3d(
|
||||
turtle3d("pt", t), turtle3d("pt", t2),
|
||||
width);
|
||||
|
||||
tree(
|
||||
turtle3d("zu_turn", t2, angleZ),
|
||||
leng * leng_scale1, leng_scale1, leng_scale2, leng_limit,
|
||||
angleZ, angleX,
|
||||
width);
|
||||
|
||||
tree(
|
||||
turtle3d("xu_turn", t2, angleX),
|
||||
leng * leng_scale2, leng_scale1, leng_scale2, leng_limit,
|
||||
angleZ, angleX,
|
||||
width);
|
||||
}
|
||||
}
|
||||
|
||||
leng = 100;
|
||||
leng_limit = 1;
|
||||
leng_scale1 = 0.4;
|
||||
leng_scale2 = 0.9;
|
||||
angleZ = 60;
|
||||
angleX = 135;
|
||||
width = 2;
|
||||
|
||||
t = turtle3d("create");
|
||||
|
||||
tree(t, leng, leng_scale1, leng_scale2, leng_limit,
|
||||
angleZ, angleX, width);
|
Reference in New Issue
Block a user