pub struct LSystemBuilder { /* private fields */ }Implementations§
Source§impl LSystemBuilder
impl LSystemBuilder
Sourcepub fn new() -> Self
pub fn new() -> Self
Examples found in repository?
examples/cantor_set.rs (line 7)
6fn main() {
7 let mut builder = LSystemBuilder::new();
8
9 let a = builder.token("A");
10 let b = builder.token("B");
11
12 builder.axiom(vec![a]);
13 builder.transformation_rule(a, vec![a, b, a]);
14 builder.transformation_rule(b, vec![b, b, b]);
15
16 let mut system = builder.finish();
17
18 // the total number of states (including the initial state!) to render
19 let step_limit = 6;
20
21 // At state number `step_limit`, our diagram has 3^(step_limit - 1) bars,
22 // so we make the width of our image an integer multiple of this number.
23 let width = 3_u32.pow(step_limit - 1) * 2;
24
25 // the vertical spacing between each bar in the render
26 let vertical_spacing = 5;
27
28 let mut lines = Vec::new();
29
30 for index in 0..step_limit {
31 let state = system.get_state();
32 let bar_width: u32 = width / state.len() as u32;
33
34 let mut x: u32 = 0;
35 let y = vertical_spacing * index;
36
37 for token in state {
38 if *token == a {
39 // draw a line
40 lines.push((x, y, x + bar_width, y));
41 }
42 x += bar_width;
43 }
44
45 system.step();
46 }
47
48 let padding: u32 = 5;
49 let render_width = 2 * padding + width as u32;
50 let render_height = 2 * padding + vertical_spacing * (step_limit - 1);
51
52 let mut buffer = ImageBuffer::new(render_width, render_height);
53
54 // Make the buffer entirely white
55 fill_mut(&mut buffer, Rgb([255u8, 255u8, 255u8]));
56
57 // Draw the lines
58 for (x1, y1, x2, y2) in lines.into_iter() {
59 for x in x1..=x2 {
60 for y in y1..=y2 {
61 let pixel = buffer.get_pixel_mut(x + padding, y + padding);
62 *pixel = Rgb([0u8, 0u8, 0u8]);
63 }
64 }
65 }
66
67 buffer
68 .save("cantor_set.png")
69 .expect("Failed to save to cantor_set.png");
70}Sourcepub fn token<S: Into<String>>(&mut self, name: S) -> ArenaId
pub fn token<S: Into<String>>(&mut self, name: S) -> ArenaId
Register a new token.
Returns a TokenId which can be used (in this LSystem) to refer to the registered token.
Examples found in repository?
examples/cantor_set.rs (line 9)
6fn main() {
7 let mut builder = LSystemBuilder::new();
8
9 let a = builder.token("A");
10 let b = builder.token("B");
11
12 builder.axiom(vec![a]);
13 builder.transformation_rule(a, vec![a, b, a]);
14 builder.transformation_rule(b, vec![b, b, b]);
15
16 let mut system = builder.finish();
17
18 // the total number of states (including the initial state!) to render
19 let step_limit = 6;
20
21 // At state number `step_limit`, our diagram has 3^(step_limit - 1) bars,
22 // so we make the width of our image an integer multiple of this number.
23 let width = 3_u32.pow(step_limit - 1) * 2;
24
25 // the vertical spacing between each bar in the render
26 let vertical_spacing = 5;
27
28 let mut lines = Vec::new();
29
30 for index in 0..step_limit {
31 let state = system.get_state();
32 let bar_width: u32 = width / state.len() as u32;
33
34 let mut x: u32 = 0;
35 let y = vertical_spacing * index;
36
37 for token in state {
38 if *token == a {
39 // draw a line
40 lines.push((x, y, x + bar_width, y));
41 }
42 x += bar_width;
43 }
44
45 system.step();
46 }
47
48 let padding: u32 = 5;
49 let render_width = 2 * padding + width as u32;
50 let render_height = 2 * padding + vertical_spacing * (step_limit - 1);
51
52 let mut buffer = ImageBuffer::new(render_width, render_height);
53
54 // Make the buffer entirely white
55 fill_mut(&mut buffer, Rgb([255u8, 255u8, 255u8]));
56
57 // Draw the lines
58 for (x1, y1, x2, y2) in lines.into_iter() {
59 for x in x1..=x2 {
60 for y in y1..=y2 {
61 let pixel = buffer.get_pixel_mut(x + padding, y + padding);
62 *pixel = Rgb([0u8, 0u8, 0u8]);
63 }
64 }
65 }
66
67 buffer
68 .save("cantor_set.png")
69 .expect("Failed to save to cantor_set.png");
70}Sourcepub fn transformation_rule(
&mut self,
predecessor: ArenaId,
successor: Vec<ArenaId>,
)
pub fn transformation_rule( &mut self, predecessor: ArenaId, successor: Vec<ArenaId>, )
Register a new transformation rule in this LSystem.
If any of the provided TokenId are invalid, this function will panic.
Examples found in repository?
examples/cantor_set.rs (line 13)
6fn main() {
7 let mut builder = LSystemBuilder::new();
8
9 let a = builder.token("A");
10 let b = builder.token("B");
11
12 builder.axiom(vec![a]);
13 builder.transformation_rule(a, vec![a, b, a]);
14 builder.transformation_rule(b, vec![b, b, b]);
15
16 let mut system = builder.finish();
17
18 // the total number of states (including the initial state!) to render
19 let step_limit = 6;
20
21 // At state number `step_limit`, our diagram has 3^(step_limit - 1) bars,
22 // so we make the width of our image an integer multiple of this number.
23 let width = 3_u32.pow(step_limit - 1) * 2;
24
25 // the vertical spacing between each bar in the render
26 let vertical_spacing = 5;
27
28 let mut lines = Vec::new();
29
30 for index in 0..step_limit {
31 let state = system.get_state();
32 let bar_width: u32 = width / state.len() as u32;
33
34 let mut x: u32 = 0;
35 let y = vertical_spacing * index;
36
37 for token in state {
38 if *token == a {
39 // draw a line
40 lines.push((x, y, x + bar_width, y));
41 }
42 x += bar_width;
43 }
44
45 system.step();
46 }
47
48 let padding: u32 = 5;
49 let render_width = 2 * padding + width as u32;
50 let render_height = 2 * padding + vertical_spacing * (step_limit - 1);
51
52 let mut buffer = ImageBuffer::new(render_width, render_height);
53
54 // Make the buffer entirely white
55 fill_mut(&mut buffer, Rgb([255u8, 255u8, 255u8]));
56
57 // Draw the lines
58 for (x1, y1, x2, y2) in lines.into_iter() {
59 for x in x1..=x2 {
60 for y in y1..=y2 {
61 let pixel = buffer.get_pixel_mut(x + padding, y + padding);
62 *pixel = Rgb([0u8, 0u8, 0u8]);
63 }
64 }
65 }
66
67 buffer
68 .save("cantor_set.png")
69 .expect("Failed to save to cantor_set.png");
70}Sourcepub fn axiom(&mut self, axiom: Vec<ArenaId>)
pub fn axiom(&mut self, axiom: Vec<ArenaId>)
Set the axiom for this LSystem.
Examples found in repository?
examples/cantor_set.rs (line 12)
6fn main() {
7 let mut builder = LSystemBuilder::new();
8
9 let a = builder.token("A");
10 let b = builder.token("B");
11
12 builder.axiom(vec![a]);
13 builder.transformation_rule(a, vec![a, b, a]);
14 builder.transformation_rule(b, vec![b, b, b]);
15
16 let mut system = builder.finish();
17
18 // the total number of states (including the initial state!) to render
19 let step_limit = 6;
20
21 // At state number `step_limit`, our diagram has 3^(step_limit - 1) bars,
22 // so we make the width of our image an integer multiple of this number.
23 let width = 3_u32.pow(step_limit - 1) * 2;
24
25 // the vertical spacing between each bar in the render
26 let vertical_spacing = 5;
27
28 let mut lines = Vec::new();
29
30 for index in 0..step_limit {
31 let state = system.get_state();
32 let bar_width: u32 = width / state.len() as u32;
33
34 let mut x: u32 = 0;
35 let y = vertical_spacing * index;
36
37 for token in state {
38 if *token == a {
39 // draw a line
40 lines.push((x, y, x + bar_width, y));
41 }
42 x += bar_width;
43 }
44
45 system.step();
46 }
47
48 let padding: u32 = 5;
49 let render_width = 2 * padding + width as u32;
50 let render_height = 2 * padding + vertical_spacing * (step_limit - 1);
51
52 let mut buffer = ImageBuffer::new(render_width, render_height);
53
54 // Make the buffer entirely white
55 fill_mut(&mut buffer, Rgb([255u8, 255u8, 255u8]));
56
57 // Draw the lines
58 for (x1, y1, x2, y2) in lines.into_iter() {
59 for x in x1..=x2 {
60 for y in y1..=y2 {
61 let pixel = buffer.get_pixel_mut(x + padding, y + padding);
62 *pixel = Rgb([0u8, 0u8, 0u8]);
63 }
64 }
65 }
66
67 buffer
68 .save("cantor_set.png")
69 .expect("Failed to save to cantor_set.png");
70}Sourcepub fn finish(self) -> LSystem
pub fn finish(self) -> LSystem
Consumes the builder, returning an LSystem instance.
This function will panic if you have not set an axiom before proceeding.
Examples found in repository?
examples/cantor_set.rs (line 16)
6fn main() {
7 let mut builder = LSystemBuilder::new();
8
9 let a = builder.token("A");
10 let b = builder.token("B");
11
12 builder.axiom(vec![a]);
13 builder.transformation_rule(a, vec![a, b, a]);
14 builder.transformation_rule(b, vec![b, b, b]);
15
16 let mut system = builder.finish();
17
18 // the total number of states (including the initial state!) to render
19 let step_limit = 6;
20
21 // At state number `step_limit`, our diagram has 3^(step_limit - 1) bars,
22 // so we make the width of our image an integer multiple of this number.
23 let width = 3_u32.pow(step_limit - 1) * 2;
24
25 // the vertical spacing between each bar in the render
26 let vertical_spacing = 5;
27
28 let mut lines = Vec::new();
29
30 for index in 0..step_limit {
31 let state = system.get_state();
32 let bar_width: u32 = width / state.len() as u32;
33
34 let mut x: u32 = 0;
35 let y = vertical_spacing * index;
36
37 for token in state {
38 if *token == a {
39 // draw a line
40 lines.push((x, y, x + bar_width, y));
41 }
42 x += bar_width;
43 }
44
45 system.step();
46 }
47
48 let padding: u32 = 5;
49 let render_width = 2 * padding + width as u32;
50 let render_height = 2 * padding + vertical_spacing * (step_limit - 1);
51
52 let mut buffer = ImageBuffer::new(render_width, render_height);
53
54 // Make the buffer entirely white
55 fill_mut(&mut buffer, Rgb([255u8, 255u8, 255u8]));
56
57 // Draw the lines
58 for (x1, y1, x2, y2) in lines.into_iter() {
59 for x in x1..=x2 {
60 for y in y1..=y2 {
61 let pixel = buffer.get_pixel_mut(x + padding, y + padding);
62 *pixel = Rgb([0u8, 0u8, 0u8]);
63 }
64 }
65 }
66
67 buffer
68 .save("cantor_set.png")
69 .expect("Failed to save to cantor_set.png");
70}Trait Implementations§
Source§impl Clone for LSystemBuilder
impl Clone for LSystemBuilder
Source§fn clone(&self) -> LSystemBuilder
fn clone(&self) -> LSystemBuilder
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for LSystemBuilder
impl Debug for LSystemBuilder
Source§impl Default for LSystemBuilder
impl Default for LSystemBuilder
Source§fn default() -> LSystemBuilder
fn default() -> LSystemBuilder
Returns the “default value” for a type. Read more
Auto Trait Implementations§
impl Freeze for LSystemBuilder
impl RefUnwindSafe for LSystemBuilder
impl Send for LSystemBuilder
impl Sync for LSystemBuilder
impl Unpin for LSystemBuilder
impl UnwindSafe for LSystemBuilder
Blanket Implementations§
Source§impl<Src, Scheme> ApproxFrom<Src, Scheme> for Srcwhere
Scheme: ApproxScheme,
impl<Src, Scheme> ApproxFrom<Src, Scheme> for Srcwhere
Scheme: ApproxScheme,
Source§fn approx_from(src: Src) -> Result<Src, <Src as ApproxFrom<Src, Scheme>>::Err>
fn approx_from(src: Src) -> Result<Src, <Src as ApproxFrom<Src, Scheme>>::Err>
Convert the given value into an approximately equivalent representation.
Source§impl<Dst, Src, Scheme> ApproxInto<Dst, Scheme> for Srcwhere
Dst: ApproxFrom<Src, Scheme>,
Scheme: ApproxScheme,
impl<Dst, Src, Scheme> ApproxInto<Dst, Scheme> for Srcwhere
Dst: ApproxFrom<Src, Scheme>,
Scheme: ApproxScheme,
Source§type Err = <Dst as ApproxFrom<Src, Scheme>>::Err
type Err = <Dst as ApproxFrom<Src, Scheme>>::Err
The error type produced by a failed conversion.
Source§fn approx_into(self) -> Result<Dst, <Src as ApproxInto<Dst, Scheme>>::Err>
fn approx_into(self) -> Result<Dst, <Src as ApproxInto<Dst, Scheme>>::Err>
Convert the subject into an approximately equivalent representation.
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, Dst> ConvAsUtil<Dst> for T
impl<T, Dst> ConvAsUtil<Dst> for T
Source§impl<T> ConvUtil for T
impl<T> ConvUtil for T
Source§fn approx_as<Dst>(self) -> Result<Dst, Self::Err>where
Self: Sized + ApproxInto<Dst>,
fn approx_as<Dst>(self) -> Result<Dst, Self::Err>where
Self: Sized + ApproxInto<Dst>,
Approximate the subject to a given type with the default scheme.
Source§fn approx_as_by<Dst, Scheme>(self) -> Result<Dst, Self::Err>
fn approx_as_by<Dst, Scheme>(self) -> Result<Dst, Self::Err>
Approximate the subject to a given type with a specific scheme.
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more