Skip to main content

kasane_logic/geometry/shapes/
traits.rs

1use crate::{Coordinate, Line, Polygon, Triangle};
2
3/// 現実空間の図形に対して共通で定義することができる性質
4///
5/// <https://github.com/AirBee-Project/Kasane-Logic/blob/main/docs/geometry-relation.md>
6pub trait Shape {
7    fn center(&self) -> Coordinate;
8}
9
10/// [Coordinate] の集合へ分解可能であることを示す
11///
12/// <https://github.com/AirBee-Project/Kasane-Logic/blob/main/docs/geometry-relation.md>
13///
14/// # Examples
15/// ```
16/// use kasane_logic::{Coordinate, IntoCoordinates, Line};
17///
18/// let p0 = Coordinate::new(35.0, 139.0, 10.0).unwrap();
19/// let p1 = Coordinate::new(35.0001, 139.0001, 11.0).unwrap();
20/// let line = Line::new([p0, p1]);
21///
22/// let coords: Vec<Coordinate> = line.iter_coordinates().collect();
23/// assert_eq!(coords.len(), 2);
24/// ```
25pub trait IntoCoordinates {
26    fn into_coordinates(self) -> impl Iterator<Item = Coordinate>;
27    fn iter_coordinates(&self) -> impl Iterator<Item = Coordinate>;
28}
29
30/// [Line] の集合へ分解可能であることを示す
31///
32/// <https://github.com/AirBee-Project/Kasane-Logic/blob/main/docs/geometry-relation.md>
33///
34/// # Examples
35/// ```
36/// use kasane_logic::{Coordinate, IntoLines, Line, Triangle};
37///
38/// let p0 = Coordinate::new(35.0, 139.0, 10.0).unwrap();
39/// let p1 = Coordinate::new(35.0002, 139.0, 10.0).unwrap();
40/// let p2 = Coordinate::new(35.0, 139.0002, 10.0).unwrap();
41/// let tri = Triangle::new([p0, p1, p2]);
42///
43/// let lines: Vec<Line> = tri.into_lines().collect();
44/// assert_eq!(lines.len(), 3);
45/// ```
46pub trait IntoLines {
47    fn into_lines(self) -> impl Iterator<Item = Line>;
48    fn iter_lines(&self) -> impl Iterator<Item = Line>;
49}
50
51/// [Triangle] の集合へ分解可能であることを示す
52///
53/// <https://github.com/AirBee-Project/Kasane-Logic/blob/main/docs/geometry-relation.md>
54///
55/// # Examples
56/// ```
57/// use kasane_logic::{Coordinate, IntoTriangles, Polygon, Triangle};
58///
59/// let p0 = Coordinate::new(35.0, 139.0, 10.0).unwrap();
60/// let p1 = Coordinate::new(35.0003, 139.0, 10.0).unwrap();
61/// let p2 = Coordinate::new(35.0003, 139.0003, 10.0).unwrap();
62/// let p3 = Coordinate::new(35.0, 139.0003, 10.0).unwrap();
63/// let polygon = Polygon::new(vec![p0, p1, p2, p3], 0.01);
64///
65/// let triangles: Vec<Triangle> = polygon.iter_triangles().collect();
66/// assert_eq!(triangles.len(), 2);
67/// ```
68pub trait IntoTriangles {
69    fn into_triangles(self) -> impl Iterator<Item = Triangle>;
70    fn iter_triangles(&self) -> impl Iterator<Item = Triangle>;
71}
72
73/// [Polygon] の集合へ分解可能であることを示す
74///
75/// <https://github.com/AirBee-Project/Kasane-Logic/blob/main/docs/geometry-relation.md>
76///
77/// # Examples
78/// ```
79/// use kasane_logic::{Coordinate, IntoPolygons, Polygon, Solid};
80///
81/// let p0 = Coordinate::new(35.0, 139.0, 10.0).unwrap();
82/// let p1 = Coordinate::new(35.0003, 139.0, 10.0).unwrap();
83/// let p2 = Coordinate::new(35.0, 139.0003, 10.0).unwrap();
84/// let p3 = Coordinate::new(35.0002, 139.0002, 10.3).unwrap();
85///
86/// let surfaces = vec![
87///     vec![p0, p1, p2],
88///     vec![p0, p3, p1],
89///     vec![p1, p3, p2],
90///     vec![p2, p3, p0],
91/// ];
92///
93/// let solid = Solid::new(surfaces, 0.01).unwrap();
94/// let polygons: Vec<Polygon> = solid.into_polygons().collect();
95/// assert_eq!(polygons.len(), 4);
96/// ```
97pub trait IntoPolygons {
98    fn into_polygons(self) -> impl Iterator<Item = Polygon>;
99    fn iter_polygons(&self) -> impl Iterator<Item = Polygon>;
100}