create iterator structure

This commit is contained in:
histausse 2022-02-12 23:44:52 +01:00
parent 9b2845ca51
commit 58e5efa58d
Signed by: histausse
GPG key ID: 67486F107F62E9E9
4 changed files with 68 additions and 29 deletions

18
src/circle.rs Normal file
View file

@ -0,0 +1,18 @@
use crate::shapes::Shape;
/// An iterator containing the shapes to display
pub struct CircleShapes;
impl CircleShapes {
pub fn new() -> CircleShapes {
CircleShapes {}
}
}
impl Iterator for CircleShapes {
type Item = Shape;
fn next(&mut self) -> Option<Self::Item> {
None
}
}

View file

@ -2,14 +2,22 @@ use std::f64;
use crate::shapes::*; use crate::shapes::*;
pub fn draw_circle(circle: Circle, context: &web_sys::CanvasRenderingContext2d) { pub fn draw_circle(circle: Circle, context: &web_sys::CanvasRenderingContext2d) {
context.move_to(circle.center.x+circle.radius, circle.center.y); context.move_to(circle.center.x+circle.radius, circle.center.y);
context context
.arc(circle.center.x, circle.center.y, circle.radius, 0.0, f64::consts::PI * 2.0) .arc(circle.center.x, circle.center.y, circle.radius, 0.0, f64::consts::PI * 2.0)
.unwrap(); .unwrap();
} }
pub fn draw_line(line: Line, context: &web_sys::CanvasRenderingContext2d) { pub fn draw_line(line: Line, context: &web_sys::CanvasRenderingContext2d) {
context.move_to(line.p1.x, line.p1.y); context.move_to(line.p1.x, line.p1.y);
context context
.line_to(line.p2.x, line.p2.y); .line_to(line.p2.x, line.p2.y);
}
pub fn draw_shape(shape: Shape, context: &web_sys::CanvasRenderingContext2d) {
match shape {
Shape::Circle(circle) => draw_circle(circle, context),
Shape::Line(line) => draw_line(line, context),
Shape::Point(_) => (),
}
} }

View file

@ -3,33 +3,40 @@ use wasm_bindgen::JsCast;
mod drawing; mod drawing;
mod shapes; mod shapes;
mod circle;
use shapes::*; use shapes::*;
use circle::CircleShapes;
#[wasm_bindgen(start)] #[wasm_bindgen(start)]
pub fn start() { pub fn start() {
let document = web_sys::window().unwrap().document().unwrap(); let document = web_sys::window().unwrap().document().unwrap();
let canvas = document.get_element_by_id("canvas").unwrap(); let canvas = document.get_element_by_id("canvas").unwrap();
let canvas: web_sys::HtmlCanvasElement = canvas let canvas: web_sys::HtmlCanvasElement = canvas
.dyn_into::<web_sys::HtmlCanvasElement>() .dyn_into::<web_sys::HtmlCanvasElement>()
.map_err(|_| ()) .map_err(|_| ())
.unwrap(); .unwrap();
let context = canvas let context = canvas
.get_context("2d") .get_context("2d")
.unwrap() .unwrap()
.unwrap() .unwrap()
.dyn_into::<web_sys::CanvasRenderingContext2d>() .dyn_into::<web_sys::CanvasRenderingContext2d>()
.unwrap(); .unwrap();
context.begin_path(); context.begin_path();
drawing::draw_circle(Circle {center: Point {x: 75.0, y: 75.0}, radius: 70.0}, &context); let iter = CircleShapes::new();
drawing::draw_circle(Circle {center: Point {x: 75.0, y: 75.0}, radius: 35.0}, &context); for shape in iter {
drawing::draw_circle(Circle {center: Point {x: 60.0, y: 65.0}, radius: 5.0}, &context); drawing::draw_shape(shape, &context);
}
drawing::draw_line(Line {p1: Point {x: 0.0, y: 0.0}, p2: Point {x: 150.0, y: 150.0}}, &context); drawing::draw_circle(Circle {center: Point {x: 75.0, y: 75.0}, radius: 70.0}, &context);
drawing::draw_line(Line {p1: Point {x: 0.0, y: 150.0}, p2: Point {x: 150.0, y: 0.0}}, &context); drawing::draw_circle(Circle {center: Point {x: 75.0, y: 75.0}, radius: 35.0}, &context);
drawing::draw_circle(Circle {center: Point {x: 60.0, y: 65.0}, radius: 5.0}, &context);
context.stroke(); drawing::draw_line(Line {p1: Point {x: 0.0, y: 0.0}, p2: Point {x: 150.0, y: 150.0}}, &context);
drawing::draw_line(Line {p1: Point {x: 0.0, y: 150.0}, p2: Point {x: 150.0, y: 0.0}}, &context);
context.stroke();
} }

View file

@ -12,3 +12,9 @@ pub struct Line {
pub p1: Point, pub p1: Point,
pub p2: Point, pub p2: Point,
} }
pub enum Shape {
Point(Point),
Circle(Circle),
Line(Line),
}