create iterator structure
This commit is contained in:
parent
9b2845ca51
commit
58e5efa58d
4 changed files with 68 additions and 29 deletions
18
src/circle.rs
Normal file
18
src/circle.rs
Normal 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
|
||||||
|
}
|
||||||
|
}
|
|
@ -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(_) => (),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
45
src/lib.rs
45
src/lib.rs
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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),
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue