127 lines
3.6 KiB
Rust

//! Draws a simple geometric sort of flower with customizable dimensions.
//!
//! This example makes extensive use of the turtle arc methods: circle_left and circle_right.
//! Ported from the turtle crate example.
use turtle_lib::*;
const BOTTOM_MARGIN: f32 = 25.0;
const LEAF_FILL_COLOR: Color = Color {
r: 0.0,
g: 0.5,
b: 0.0,
a: 1.0,
}; // green
const LEAF_BORDER_COLOR: Color = Color {
r: 0.0,
g: 0.39,
b: 0.0,
a: 1.0,
}; // dark green
const LEAF_BORDER_WIDTH: f32 = 1.0;
const LEFT_LEAF_RADIUS: f32 = 200.0;
const LEFT_LEAF_EXTENT: f32 = 45.0;
const RIGHT_LEAF_INCLINATION: f32 = 15.0;
const RIGHT_LEAF_BOTTOM_RADIUS: f32 = 250.0;
const RIGHT_LEAF_BOTTOM_EXTENT: f32 = 45.0;
const RIGHT_LEAF_TOP_RADIUS: f32 = 157.0;
const RIGHT_LEAF_TOP_EXTENT: f32 = 75.0;
const TRUNK_COLOR: Color = LEAF_BORDER_COLOR;
const TRUNK_WIDTH: f32 = 3.0;
const TRUNK_PIECE_COUNT: usize = 4;
const TRUNK_PIECE_RADIUS: f32 = 500.0;
const TRUNK_PIECE_EXTENT: f32 = 15.0;
const PETALS_COUNT: usize = 4;
const PETALS_FILL_COLOR: Color = Color {
r: 0.5,
g: 0.0,
b: 0.5,
a: 1.0,
}; // purple
const PETALS_BORDER_COLOR: Color = Color {
r: 0.55,
g: 0.0,
b: 0.55,
a: 1.0,
}; // dark purple
const PETALS_BORDER_WIDTH: f32 = LEAF_BORDER_WIDTH;
const PETALS_INIT_LEFT: f32 = 65.0;
const PETALS_SIDE_RADIUS: f32 = 80.0;
const PETALS_SIDE_EXTENT: f32 = 90.0;
const PETALS_SPACE_GAP: f32 = 20.0;
const PETALS_SPACE_RADIUS: f32 = 40.0;
const PETALS_SPACE_EXTENT: f32 = 30.0;
#[turtle_main("Flower")]
fn draw(turtle: &mut TurtlePlan) {
// Initial positioning - bottom left area
turtle
.pen_up()
.go_to(vec2(-100.0, -200.0 + BOTTOM_MARGIN))
.left(90.0)
.pen_down();
// Setup
turtle
.set_fill_color(LEAF_FILL_COLOR)
.set_pen_color(LEAF_BORDER_COLOR);
for _ in 0..TRUNK_PIECE_COUNT {
// Leaves
turtle
.set_pen_width(LEAF_BORDER_WIDTH)
.set_pen_color(LEAF_BORDER_COLOR)
.begin_fill();
// Left leaf
turtle
.circle_left(LEFT_LEAF_RADIUS, LEFT_LEAF_EXTENT, 45)
.right(LEFT_LEAF_EXTENT)
.circle_right(LEFT_LEAF_RADIUS, -LEFT_LEAF_EXTENT, 45)
.right(LEFT_LEAF_EXTENT);
// Right leaf
turtle.right(RIGHT_LEAF_INCLINATION);
// Note: circle_left with negative radius is same as circle_right
// Using circle_right with negative extent instead
turtle
.circle_right(RIGHT_LEAF_BOTTOM_RADIUS, RIGHT_LEAF_BOTTOM_EXTENT, 45)
.right(RIGHT_LEAF_INCLINATION)
.circle_right(RIGHT_LEAF_TOP_RADIUS, -RIGHT_LEAF_TOP_EXTENT, 75);
// Trunk piece
turtle
.end_fill()
.set_pen_width(TRUNK_WIDTH)
.set_pen_color(TRUNK_COLOR)
.circle_right(TRUNK_PIECE_RADIUS, TRUNK_PIECE_EXTENT, 50);
}
// Petals
turtle
.set_fill_color(PETALS_FILL_COLOR)
.set_pen_color(PETALS_BORDER_COLOR)
.set_pen_width(PETALS_BORDER_WIDTH)
.left(PETALS_INIT_LEFT)
.begin_fill()
.circle_right(PETALS_SIDE_RADIUS, PETALS_SIDE_EXTENT, 90);
for _ in 0..PETALS_COUNT {
turtle
.left(PETALS_SPACE_GAP)
.circle_right(PETALS_SPACE_RADIUS, -PETALS_SPACE_EXTENT, 30)
.right(2.0 * PETALS_SPACE_GAP + PETALS_SPACE_EXTENT)
.circle_left(PETALS_SPACE_RADIUS, PETALS_SPACE_EXTENT, 30);
}
// Finish petals with error adjustments
turtle
.left(PETALS_SPACE_GAP)
.circle_left(PETALS_SIDE_RADIUS + 1.0, 3.0 - PETALS_SIDE_EXTENT, 87)
.end_fill();
}