Package Exports
- @thi.ng/lsys
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@thi.ng/lsys) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
@thi.ng/lsys
This project is part of the @thi.ng/umbrella monorepo.
About
Small, functional, highly customizable, iterator based L-System architecture for arbitrary rules, with separation between symbol expansion and interpretation / execution. A base 2D turtle implementation is included. 0.5KB gzipped.
Partially based on Clojure version of @thi.ng/thingybot.
Installation
yarn add @thi.ng/lsys
Dependencies
Usage examples
Examples | |
---|---|
![]() |
![]() |
![]() |
![]() |
import * as lsys from "@thi.ng/lsys";
import * as g from "@thi.ng/geom";
import * as fs from "fs";
// example L-Systems shown above
const examples = [
{ rules: { s: "[f++f++f]", f: "f+f--f+f" }, delta: Math.PI / 3, iter: 5 },
{ rules: { s: "[f-f-f-f-f-f-f-f]", f: "f---f+f+f+f+f+f+f---f" }, delta: Math.PI / 4, iter: 6 },
{ rules: { s: "[x]", x: "-yf+xfx+fy-", y: "+xf-yfy-fx+" }, delta: Math.PI / 2, iter: 7 },
{ rules: { s: "[a]", a: "a-b--b+a++aa+b-", b: "+a-bb--b-a++a+b" }, delta: Math.PI / 3, iter: 5 }
];
const impl = lsys.TURTLE_IMPL_2D;
examples.forEach(({ rules, delta, iter }, i) =>
fs.writeFileSync(
`lsys-ex${i}.svg`,
g.asSvg(
g.svgDoc(
{ stroke: "#00f", "stroke-width": 0.25, width: 600, height: 600 },
...lsys.interpret(
// create turtle instance with customized delta (rot angle)
lsys.turtle2d({ delta }),
// customize implementation to process syms "a" & "b" as "f"
{ ...impl, a: impl.f, b: impl.f },
// recursively expand start rule "s"
lsys.expand(rules, "s", iter)
//convert result paths to polylines for SVG export
).paths.map(g.polyline)
)
)
)
);
Authors
- Karsten Schmidt
License
© 2019 Karsten Schmidt // Apache Software License 2.0