use notan::draw::*;
use notan::prelude::*;
#[notan_main]
fn main() -> Result<(), String> {
notan::init().add_config(DrawConfig).draw(draw).build()
}
fn draw(gfx: &mut Graphics) {
let mut draw = gfx.create_draw();
draw.clear(Color::BLACK);
let center_x: f32 = 400.0; let center_y: f32 = 300.0; let radius: f32 = 150.0;
let mut draw = gfx.create_draw();
draw.clear(Color::BLACK);
{
let mut path = draw.path();
path.move_to(center_x, center_y);
draw_arc(&mut path, center_x, center_y, radius, 120.0, 240.0);
path.color(Color::GREEN).stroke(4.0);
}
{
let mut path = draw.path();
path.move_to(center_x, center_y);
draw_circle_section(&mut path, center_x, center_y, radius, 240.0, 360.0);
path.color(Color::BLUE).stroke(4.0).fill();
}
{
let mut path = draw.path();
path.move_to(center_x, center_y);
draw_arc(&mut path, center_x, center_y, radius, 0.0, 120.0);
path.color(Color::RED).stroke(4.0);
}
gfx.render(&draw);
}
fn draw_arc(
path: &mut Path,
center_x: f32,
center_y: f32,
radius: f32,
start_angle: f32,
end_angle: f32,
) -> &mut Path {
let start_angle = start_angle + 270.0;
let end_angle = end_angle + 270.0;
let (start_x, start_y) = get_coords(center_x, center_y, radius, start_angle);
path.move_to(start_x, start_y);
for degrees in ((start_angle as u32)..(end_angle as u32)).step_by(5) {
let (x1, y1) = get_coords(center_x, center_y, radius, degrees as f32);
path.line_to(x1, y1);
}
let (end_x, end_y) = get_coords(center_x, center_y, radius, end_angle);
path.line_to(end_x, end_y);
path
}
fn draw_circle_section(
path: &mut Path,
center_x: f32,
center_y: f32,
radius: f32,
start_angle: f32,
end_angle: f32,
) -> &mut Path {
let start_angle = start_angle + 270.0;
let end_angle = end_angle + 270.0;
let (start_x, start_y) = get_coords(center_x, center_y, radius, start_angle);
path.line_to(start_x, start_y);
for degrees in ((start_angle as u32)..(end_angle as u32)).step_by(5) {
let (x1, y1) = get_coords(center_x, center_y, radius, degrees as f32);
path.line_to(x1, y1);
}
let (end_x, end_y) = get_coords(center_x, center_y, radius, end_angle);
path.line_to(end_x, end_y);
path.line_to(center_x, center_y);
path
}
fn get_coords(center_x: f32, center_y: f32, radius: f32, degrees: f32) -> (f32, f32) {
let x = center_x + radius * (degrees * std::f32::consts::PI / 180.0).cos();
let y = center_y + radius * (degrees * std::f32::consts::PI / 180.0).sin();
(x, y)
}