diff --git a/src/experimental/note.md b/src/experimental/note.md index 83ba64fd..27512503 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -25,6 +25,8 @@ new: - m_replace? +- lsystem2, lsystem3, add seed param + deprecated: rails2sections: use m_transpose has diff --git a/src/turtle/_impl/_lsystem2_impl.scad b/src/turtle/_impl/_lsystem2_impl.scad index 7c18d1a1..ca199c76 100644 --- a/src/turtle/_impl/_lsystem2_impl.scad +++ b/src/turtle/_impl/_lsystem2_impl.scad @@ -3,7 +3,7 @@ use <../turtle2d.scad>; function _lsystem2_join(str_lt) = _join(str_lt); -function _lsystem2_derive(axiom, rules, n, rule_prs) = _derive(axiom, rules, n, rule_prs); +function _lsystem2_derive(axiom, rules, n, rule_prs, seed) = _derive(axiom, rules, n, rule_prs, seed); function _next_stack(t, code, stack) = code == "[" ? [t, each stack] : diff --git a/src/turtle/_impl/_lsystem3_impl.scad b/src/turtle/_impl/_lsystem3_impl.scad index ec0496b1..19108a19 100644 --- a/src/turtle/_impl/_lsystem3_impl.scad +++ b/src/turtle/_impl/_lsystem3_impl.scad @@ -3,7 +3,7 @@ use <../turtle3d.scad>; function _lsystem3_join(str_lt) = _join(str_lt); -function _lsystem3_derive(axiom, rules, n, rule_prs) = _derive(axiom, rules, n, rule_prs); +function _lsystem3_derive(axiom, rules, n, rule_prs, seed) = _derive(axiom, rules, n, rule_prs, seed); function _next_stack(t, code, stack) = code == "[" ? [t, each stack] : diff --git a/src/turtle/_impl/_lsystem_comm.scad b/src/turtle/_impl/_lsystem_comm.scad index 02e83b4a..bb05558b 100644 --- a/src/turtle/_impl/_lsystem_comm.scad +++ b/src/turtle/_impl/_lsystem_comm.scad @@ -8,16 +8,16 @@ function _join(str_lt) = let(leng = len(str_lt)) [for(i = 0, s = str_lt[0]; i < leng; i = i + 1, s = str(s, str_lt[i])) s][leng - 1]; -function c_or_v(c, v, rules, rules_pr, leng, i = 0) = +function c_or_v(c, v, rules, rules_pr, leng, seed, i = 0) = i == leng ? c : let(idx = search([v[i]], rules, num_returns_per_match=0, index_col_num = 1)[0][0]) - rand(0, 1) <= rules_pr[idx] ? v[i] : c_or_v(c, v, rules, rules_pr, leng, i + 1); + rand(0, 1, seed + i) <= rules_pr[idx] ? v[i] : c_or_v(c, v, rules, rules_pr, leng, seed, i + 1); -function _derive1_p(base, rules, rules_pr) = +function _derive1_p(base, rules, rules_pr, seed) = _join([ for(c = base) let(v = [for(r = rules) if(r[0] == c) r[1]]) - v == [] ? c : c_or_v(c, v, rules, rules_pr, len(v)) + v == [] ? c : c_or_v(c, v, rules, rules_pr, len(v), seed) ]); function _derive1(base, rules) = _join([ @@ -26,9 +26,10 @@ function _derive1(base, rules) = _join([ is_undef(v) ? c : v ]); -function _derive(base, rules, n, rule_prs) = +function _derive(base, rules, n, rule_prs, seed) = let( - derive = is_undef(rule_prs) ? function(base) _derive1(base, rules) : function(base) _derive1_p(base, rules, rule_prs), + sd = is_undef(seed) ? rand(0, 1, seed) * 1000 : seed, + derive = is_undef(rule_prs) ? function(base) _derive1(base, rules) : function(base) _derive1_p(base, rules, rule_prs, sd), bs = [ for(i = 0, b = derive(base); i < n; i = i + 1, b = i != n ? derive(b) : undef) b diff --git a/src/turtle/lsystem2.scad b/src/turtle/lsystem2.scad index df965c5c..5a7c939d 100644 --- a/src/turtle/lsystem2.scad +++ b/src/turtle/lsystem2.scad @@ -11,9 +11,9 @@ use <_impl/_lsystem2_impl.scad>; use ; -function lsystem2(axiom, rules, n, angle, leng = 1, heading = 0, start = [0, 0], forward_chars = "F", rule_prs) = +function lsystem2(axiom, rules, n, angle, leng = 1, heading = 0, start = [0, 0], forward_chars = "F", rule_prs, seed) = let( - derived = _lsystem2_derive(axiom, rules, n, rule_prs), + derived = _lsystem2_derive(axiom, rules, n, rule_prs, seed), codes = forward_chars == "F" ? derived : _lsystem2_join([ for(c = derived) let(idx = search(c, forward_chars)) diff --git a/src/turtle/lsystem3.scad b/src/turtle/lsystem3.scad index 828a3e3f..2c1371d1 100644 --- a/src/turtle/lsystem3.scad +++ b/src/turtle/lsystem3.scad @@ -11,9 +11,9 @@ use <_impl/_lsystem3_impl.scad>; use ; -function lsystem3(axiom, rules, n, angle, leng = 1, heading = 0, start = [0, 0, 0], forward_chars = "F", rule_prs) = +function lsystem3(axiom, rules, n, angle, leng = 1, heading = 0, start = [0, 0, 0], forward_chars = "F", rule_prs, seed) = let( - derived = _lsystem3_derive(axiom, rules, n, rule_prs), + derived = _lsystem3_derive(axiom, rules, n, rule_prs, seed), codes = forward_chars == "F" ? derived : _lsystem3_join([ for(c = derived) let(idx = search(c, forward_chars))