diff --git a/src/experimental/_impl/_lsystem2_impl.scad b/src/experimental/_impl/_lsystem2_impl.scad index 7d98295f..903c4473 100644 --- a/src/experimental/_impl/_lsystem2_impl.scad +++ b/src/experimental/_impl/_lsystem2_impl.scad @@ -6,17 +6,17 @@ function _join(strs) = let(leng = len(strs)) [for(i = 0, s = strs[0]; i < leng; i = i + 1, s = str(s, strs[i])) s][leng - 1]; -function _produce1(base, rule) = _join([ +function _derive1(base, rule) = _join([ for(c = base) let(v = assoc_lookup(rule, c)) is_undef(v) ? c : v ]); -function _produce(base, rule, n, i = 0) = - i == n ? base : _produce(_produce1(base, rule), rule, n, i + 1); +function _derive(base, rule, n, i = 0) = + i == n ? base : _derive(_derive1(base, rule), rule, n, i + 1); -function produce(rule, n) = - _produce(assoc_lookup(rule, "S"), rule, n); +function derive(rule, n) = + _derive(assoc_lookup(rule, "S"), rule, n); function cmd(symbol, args) = symbol == "F" ? ["forward", args[0]] : diff --git a/src/experimental/lsystem2.scad b/src/experimental/lsystem2.scad index bee7077a..17946e8b 100644 --- a/src/experimental/lsystem2.scad +++ b/src/experimental/lsystem2.scad @@ -1,16 +1,21 @@ use ; use ; -function lsystem2(rule, n, angle, leng = 1, heading = 0, start_pt = [0, 0]) = +function lsystem2(rule, n, angle, leng = 1, heading = 0, start = [0, 0], forward_chars = "F") = let( - produced = produce(rule, n), + derived = derive(rule, n), + replaced = _join([ + for(c = derived) + let(idx = search(c, forward_chars)) + idx == [] ? c : "F" + ]), cmds = [ - for(s = produced) + for(s = replaced) let(c = cmd(s, [leng, angle])) if(c != []) c ] ) _lines( - turtle2d("create", start_pt[0], start_pt[0], heading), + turtle2d("create", start[0], start[0], heading), cmds ); \ No newline at end of file