|
| 1 | +//! Draws a simple geometric sort of flower with customizable dimensions. |
| 2 | +//! |
| 3 | +//! This example makes extensive use of the turtle arc methods: [`arc_left`] and [`arc_right`]. |
| 4 | +//! They both provide the ability to draw a circular arc defined by the given `radius` and `extent` |
| 5 | +//! parameters, while the first makes the turtle draw it to the left and the second to the right. |
| 6 | +
|
| 7 | +use turtle::{Angle, Distance, Drawing}; |
| 8 | + |
| 9 | +const TURTLE_SPEED: &str = "faster"; |
| 10 | +const BOTTOM_MARGIN: Distance = 25.0; |
| 11 | + |
| 12 | +const LEAF_FILL_COLOR: &str = "green"; |
| 13 | +const LEAF_BORDER_COLOR: &str = "dark green"; |
| 14 | +const LEAF_BORDER_WIDTH: Distance = 1.0; |
| 15 | +const LEFT_LEAF_RADIUS: Distance = 200.0; |
| 16 | +const LEFT_LEAF_EXTENT: Angle = 45.0; |
| 17 | +const RIGHT_LEAF_INCLINATION: Angle = 15.0; |
| 18 | +const RIGHT_LEAF_BOTTOM_RADIUS: Distance = 250.0; |
| 19 | +const RIGHT_LEAF_BOTTOM_EXTENT: Angle = 45.0; |
| 20 | +const RIGHT_LEAF_TOP_RADIUS: Distance = 157.0; |
| 21 | +const RIGHT_LEAF_TOP_EXTENT: Angle = 75.0; |
| 22 | + |
| 23 | +const TRUNK_COLOR: &str = LEAF_BORDER_COLOR; |
| 24 | +const TRUNK_WIDTH: Distance = 3.0; |
| 25 | +const TRUNK_PIECE_COUNT: usize = 4; |
| 26 | +const TRUNK_PIECE_RADIUS: Distance = 500.0; |
| 27 | +const TRUNK_PIECE_EXTENT: Angle = 15.0; |
| 28 | + |
| 29 | +const PETALS_COUNT: usize = 4; |
| 30 | +const PETALS_FILL_COLOR: &str = "purple"; |
| 31 | +const PETALS_BORDER_COLOR: &str = "dark purple"; |
| 32 | +const PETALS_BORDER_WIDTH: Distance = LEAF_BORDER_WIDTH; |
| 33 | +const PETALS_INIT_LEFT: Angle = 65.0; |
| 34 | +const PETALS_SIDE_RADIUS: Distance = 80.0; |
| 35 | +const PETALS_SIDE_EXTENT: Angle = 90.0; |
| 36 | +const PETALS_SPACE_GAP: Angle = 20.0; |
| 37 | +const PETALS_SPACE_RADIUS: Distance = 40.0; |
| 38 | +const PETALS_SPACE_EXTENT: Angle = 30.0; |
| 39 | + |
| 40 | +fn main() { |
| 41 | + // Acquiring resources. |
| 42 | + let mut drawing = Drawing::new(); |
| 43 | + let size = drawing.size(); |
| 44 | + let mut turtle = drawing.add_turtle(); |
| 45 | + |
| 46 | + // Initial positioning. |
| 47 | + turtle.set_speed("instant"); |
| 48 | + turtle.pen_up(); |
| 49 | + turtle.go_to([ |
| 50 | + -(size.width as f64) / 6.0, |
| 51 | + -(size.height as f64) / 2.0 + BOTTOM_MARGIN, |
| 52 | + ]); |
| 53 | + turtle.pen_down(); |
| 54 | + |
| 55 | + // Setup. |
| 56 | + turtle.use_degrees(); |
| 57 | + turtle.set_speed(TURTLE_SPEED); |
| 58 | + |
| 59 | + // Body. |
| 60 | + turtle.set_fill_color(LEAF_FILL_COLOR); |
| 61 | + turtle.set_pen_color(LEAF_BORDER_COLOR); |
| 62 | + |
| 63 | + for _ in 0..TRUNK_PIECE_COUNT { |
| 64 | + // Leaves: |
| 65 | + turtle.set_pen_size(LEAF_BORDER_WIDTH); |
| 66 | + turtle.set_pen_color(LEAF_BORDER_COLOR); |
| 67 | + turtle.begin_fill(); |
| 68 | + |
| 69 | + // Left leaf. |
| 70 | + turtle.arc_left(LEFT_LEAF_RADIUS, LEFT_LEAF_EXTENT); |
| 71 | + turtle.right(LEFT_LEAF_EXTENT); |
| 72 | + turtle.arc_right(LEFT_LEAF_RADIUS, -LEFT_LEAF_EXTENT); |
| 73 | + turtle.right(LEFT_LEAF_EXTENT); |
| 74 | + |
| 75 | + // Right leaf. |
| 76 | + turtle.right(RIGHT_LEAF_INCLINATION); |
| 77 | + turtle.arc_right(RIGHT_LEAF_BOTTOM_RADIUS, RIGHT_LEAF_BOTTOM_EXTENT); |
| 78 | + turtle.right(RIGHT_LEAF_INCLINATION); |
| 79 | + turtle.arc_right(RIGHT_LEAF_TOP_RADIUS, -RIGHT_LEAF_TOP_EXTENT); |
| 80 | + |
| 81 | + // Trunk. |
| 82 | + turtle.end_fill(); |
| 83 | + turtle.set_pen_size(TRUNK_WIDTH); |
| 84 | + turtle.set_pen_color(TRUNK_COLOR); |
| 85 | + turtle.arc_right(TRUNK_PIECE_RADIUS, TRUNK_PIECE_EXTENT); |
| 86 | + } |
| 87 | + |
| 88 | + // Petals. |
| 89 | + turtle.set_fill_color(PETALS_FILL_COLOR); |
| 90 | + turtle.set_pen_color(PETALS_BORDER_COLOR); |
| 91 | + turtle.set_pen_size(PETALS_BORDER_WIDTH); |
| 92 | + turtle.left(PETALS_INIT_LEFT); |
| 93 | + turtle.begin_fill(); |
| 94 | + turtle.arc_right(PETALS_SIDE_RADIUS, PETALS_SIDE_EXTENT); |
| 95 | + |
| 96 | + for _ in 0..PETALS_COUNT { |
| 97 | + turtle.left(PETALS_SPACE_GAP); |
| 98 | + turtle.arc_right(PETALS_SPACE_RADIUS, -PETALS_SPACE_EXTENT); |
| 99 | + turtle.right(2.0 * PETALS_SPACE_GAP + PETALS_SPACE_EXTENT); |
| 100 | + turtle.arc_left(PETALS_SPACE_RADIUS, PETALS_SPACE_EXTENT); |
| 101 | + } |
| 102 | + |
| 103 | + // Finish petals with error adjustments. |
| 104 | + turtle.left(PETALS_SPACE_GAP); |
| 105 | + turtle.arc_left(PETALS_SIDE_RADIUS + 1.0, 3.0 - PETALS_SIDE_EXTENT); |
| 106 | + turtle.end_fill(); |
| 107 | + |
| 108 | + // Reveal final drawing. |
| 109 | + turtle.hide(); |
| 110 | +} |
0 commit comments