rgeometry/data/
directed_edge.rs

1use super::EndPoint;
2use super::ILineSegment;
3use super::LineSegment;
4use super::LineSegmentView;
5use super::Point;
6use crate::{Intersects, PolygonScalar, TotalOrd};
7
8///////////////////////////////////////////////////////////////////////////////
9// DirectedEdge_
10
11#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
12// Directed edge from A to B, including A and excluding B.
13pub struct DirectedEdge_<T: TotalOrd, const N: usize> {
14  pub src: Point<T, N>,
15  pub dst: Point<T, N>,
16}
17
18// DirectedEdge_ -> LineSegment
19impl<T: TotalOrd, const N: usize> From<DirectedEdge_<T, N>> for LineSegment<T, N> {
20  fn from(edge: DirectedEdge_<T, N>) -> LineSegment<T, N> {
21    LineSegment::new(EndPoint::Inclusive(edge.src), EndPoint::Exclusive(edge.dst))
22  }
23}
24
25// DirectedEdge_ -> LineSegmentView
26impl<'a, T: TotalOrd, const N: usize> From<&'a DirectedEdge_<T, N>> for LineSegmentView<'a, T, N> {
27  fn from(edge: &'a DirectedEdge_<T, N>) -> LineSegmentView<'a, T, N> {
28    LineSegmentView::new(
29      EndPoint::Inclusive(&edge.src),
30      EndPoint::Exclusive(&edge.dst),
31    )
32  }
33}
34
35impl<'a, T> Intersects for &'a DirectedEdge_<T, 2>
36where
37  T: PolygonScalar,
38{
39  type Result = ILineSegment<'a, T>;
40  fn intersect(self, other: &'a DirectedEdge_<T, 2>) -> Option<Self::Result> {
41    LineSegmentView::from(self).intersect(LineSegmentView::from(other))
42  }
43}
44
45///////////////////////////////////////////////////////////////////////////////
46// DirectedEdge
47
48#[derive(Debug, Eq, PartialEq, Ord, PartialOrd)]
49// Directed edge from A to B, including A and excluding B.
50pub struct DirectedEdge<'a, T: TotalOrd, const N: usize = 2> {
51  pub src: &'a Point<T, N>,
52  pub dst: &'a Point<T, N>,
53}
54
55impl<T: TotalOrd, const N: usize> Copy for DirectedEdge<'_, T, N> {}
56impl<T: TotalOrd, const N: usize> Clone for DirectedEdge<'_, T, N> {
57  fn clone(&self) -> Self {
58    *self
59  }
60}
61
62impl<T: TotalOrd> DirectedEdge<'_, T, 2> {
63  pub fn contains(self, pt: &Point<T, 2>) -> bool
64  where
65    T: PolygonScalar,
66  {
67    LineSegmentView::from(self).contains(pt)
68  }
69}
70
71impl<'a, T: TotalOrd, const N: usize> From<DirectedEdge<'a, T, N>> for LineSegmentView<'a, T, N> {
72  fn from(edge: DirectedEdge<'a, T, N>) -> LineSegmentView<'a, T, N> {
73    LineSegmentView::new(EndPoint::Inclusive(edge.src), EndPoint::Exclusive(edge.dst))
74  }
75}
76
77impl<'a, T: TotalOrd, const N: usize> From<&DirectedEdge<'a, T, N>> for LineSegmentView<'a, T, N> {
78  fn from(edge: &DirectedEdge<'a, T, N>) -> LineSegmentView<'a, T, N> {
79    LineSegmentView::new(EndPoint::Inclusive(edge.src), EndPoint::Exclusive(edge.dst))
80  }
81}
82
83impl<'a, T> Intersects for DirectedEdge<'a, T, 2>
84where
85  T: PolygonScalar,
86{
87  type Result = ILineSegment<'a, T>;
88  fn intersect(self, other: DirectedEdge<'a, T, 2>) -> Option<Self::Result> {
89    LineSegmentView::from(self).intersect(LineSegmentView::from(other))
90  }
91}