1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use crate::{prelude::*, renderer::Rendering};
use num_traits::AsPrimitive;
use std::iter::Iterator;
pub trait Draw {
fn draw(&self, s: &mut PixState) -> PixResult<()>;
}
impl PixState {
#[inline]
pub fn clear(&mut self) -> PixResult<()> {
let color = self.settings.background;
self.renderer.set_draw_color(self.settings.background)?;
self.renderer.clear()?;
self.renderer.set_draw_color(color)?;
Ok(())
}
pub fn wireframe<V, P, T>(&mut self, vertexes: V, pos: P, angle: T, scale: T) -> PixResult<()>
where
V: AsRef<[PointF2]>,
P: Into<PointF2>,
T: AsPrimitive<Scalar>,
{
let s = &self.settings;
let pos: PointF2 = pos.into();
let scale: Scalar = scale.as_();
let mut angle: Scalar = angle.as_();
if let AngleMode::Degrees = s.angle_mode {
angle = angle.to_radians();
};
let (sin, cos) = angle.sin_cos();
let vs: Vec<PointI2> = vertexes
.as_ref()
.iter()
.map(|v| {
point!(
((v.x() * cos - v.y() * sin) * scale + pos.x()).round(),
((v.x() * sin + v.y() * cos) * scale + pos.y()).round()
)
.into()
})
.collect();
Ok(self.renderer.polygon(&vs, s.fill, s.stroke)?)
}
}