8 releases (breaking)
0.7.0 | Feb 13, 2023 |
---|---|
0.6.0 | Feb 3, 2023 |
0.5.0 | Feb 3, 2023 |
0.4.1 | Feb 3, 2023 |
0.1.0 | Feb 2, 2023 |
#189 in Simulation
37 downloads per month
41KB
786 lines
Anabaena
L-System (Lindenmayer system) for Rust.
Features
- Generic L-System alphabet
- Support for stochastic grammars
- Support for context sensitive grammars
- Support for parametric grammars
- Mutable context support during individual production rules, and summarized after a round is complete
- Streaming iterator implementation
Examples
Algae
Taken from the Wikipedia article on L-Systems, the following is an implementation of the algae example:
use anabaena::{LSystem, LRulesHash, LRulesSet, Total};
use std::collections::HashMap;
use streaming_iterator::StreamingIterator;
let rules: LRulesHash<(), char, LRulesSet<char>> = |_| HashMap::from([
(
'A',
LRulesSet::new(vec![
(1, vec!['A', 'B']),
]),
),
(
'B',
LRulesSet::new(vec![
(1, vec!['A']),
]),
)
]);
let axiom: Vec<char> = vec!['A'];
let mut lsystem: LSystem<_,_,_, Total> = LSystem::new(
axiom,
rules,
);
assert_eq!(lsystem.next(), Some(&"AB".chars().collect()));
assert_eq!(lsystem.next(), Some(&"ABA".chars().collect()));
assert_eq!(lsystem.next(), Some(&"ABAAB".chars().collect()));
assert_eq!(lsystem.next(), Some(&"ABAABABA".chars().collect()));
assert_eq!(lsystem.next(), Some(&"ABAABABAABAAB".chars().collect()));
assert_eq!(lsystem.next(), Some(&"ABAABABAABAABABAABABA".chars().collect()));
assert_eq!(lsystem.next(), Some(&"ABAABABAABAABABAABABAABAABABAABAAB".chars().collect()));
Examples with Turtle.rs
Most of the other examples in the Wikipedia article are implemented in the examples/
folder, which
use the turtle.rs library to render the results. You can run the B-Tree example,
for instance, with the following command:
cargo run --example btree
Dependencies
~335–770KB
~15K SLoC