use crate::geometry::Point;
#[derive(Copy, Clone, PartialEq, Debug)]
pub struct PSlot {
pub border: [Point; 4],
}
impl PSlot {
pub fn new(border: [Point; 4]) -> PSlot {
PSlot {border}
}
pub fn new_phwl(p: Point, h: f64, w: f64, l: f64) -> PSlot {
let pi = std::f64::consts::PI;
let p2 = Point::new(
p.x + w*(h - pi/2.0).cos(),
p.y + w*(h - pi/2.0).sin()
);
let p3 = Point::new(p2.x + l*h.cos(), p2.y + l*h.sin());
let p4 = Point::new(p.x + l*h.cos(), p.y + l*h.sin());
PSlot {border: [p, p2, p3, p4]}
}
pub fn default() -> PSlot {
PSlot::new_phwl(Point::default(), 0.0, 2.2, 6.86)
}
pub fn heading(&self) -> f64 {
(self.border[3].y - self.border[0].y)
.atan2(self.border[3].x - self.border[0].x)
}
pub fn length(&self) -> f64 {
(
(self.border[3].x - self.border[0].x).powi(2)
+ (self.border[3].y - self.border[0].y).powi(2)
).sqrt()
}
pub fn width(&self) -> f64 {
(
(self.border[1].x - self.border[0].x).powi(2)
+ (self.border[1].y - self.border[0].y).powi(2)
).sqrt()
}
pub fn parallel(&self) -> bool {
let d1 = (
(self.border[1].x - self.border[0].x).powi(2)
+ (self.border[1].y - self.border[0].y).powi(2)
).sqrt();
let d2 = (
(self.border[2].x - self.border[1].x).powi(2)
+ (self.border[2].y - self.border[1].y).powi(2)
).sqrt();
d1 < d2
}
pub fn right(&self) -> bool {
(
(self.border[1].x - self.border[0].x)
* (self.border[3].y - self.border[0].y)
- (self.border[1].y - self.border[0].y)
* (self.border[3].x - self.border[0].x)
) > 0.0
}
pub fn inside(&self, p: Point) -> bool {
let mut inside = false;
let mut j = 3;
for i in 0..4 {
if
((self.border[i].y > p.y) != (self.border[j].y > p.y))
&& (
p.x < self.border[i].x
+ (self.border[j].x - self.border[i].x)
* (p.y - self.border[i].y)
/ (self.border[j].y - self.border[i].y)
)
{
inside = !inside;
}
j = i;
}
inside
}
}