geometry_algorithm/
make.rs1use geometry_model::{Box, Segment};
13use geometry_trait::PointMut;
14
15use crate::assign::assign_values;
16
17#[must_use]
27pub fn make_point<P>(values: &[P::Scalar]) -> P
28where
29 P: PointMut + Default,
30{
31 let mut p = P::default();
32 assign_values(&mut p, values);
33 p
34}
35
36#[must_use]
47pub fn make_box<P>(min_coords: &[P::Scalar], max_coords: &[P::Scalar]) -> Box<P>
48where
49 P: PointMut + Default,
50{
51 Box::from_corners(make_point(min_coords), make_point(max_coords))
52}
53
54#[must_use]
64pub fn make_segment<P>(start_coords: &[P::Scalar], end_coords: &[P::Scalar]) -> Segment<P>
65where
66 P: PointMut + Default,
67{
68 Segment::new(make_point(start_coords), make_point(end_coords))
69}
70
71#[cfg(test)]
72#[allow(
73 clippy::float_cmp,
74 reason = "Constructed coordinates are read back as exact literals."
75)]
76mod tests {
77 use super::{make_box, make_point, make_segment};
82 use geometry_cs::Cartesian;
83 use geometry_model::{Box, Point2D, Point3D, Segment};
84 use geometry_trait::Point as _;
85
86 type Pt2 = Point2D<f64, Cartesian>;
87 type Pt3 = Point3D<f64, Cartesian>;
88
89 #[test]
91 fn point2_from_slice() {
92 let p: Pt2 = make_point(&[123.0, 456.0]);
93 assert_eq!(p.get::<0>(), 123.0);
94 assert_eq!(p.get::<1>(), 456.0);
95 }
96
97 #[test]
99 fn point3_from_slice() {
100 let p: Pt3 = make_point(&[123.0, 456.0, 789.0]);
101 assert_eq!(p.get::<0>(), 123.0);
102 assert_eq!(p.get::<1>(), 456.0);
103 assert_eq!(p.get::<2>(), 789.0);
104 }
105
106 #[test]
108 fn box_from_corners() {
109 let b: Box<Pt2> = make_box(&[123.0, 456.0], &[789.0, 1011.0]);
110 assert_eq!(b.min().get::<0>(), 123.0);
111 assert_eq!(b.min().get::<1>(), 456.0);
112 assert_eq!(b.max().get::<0>(), 789.0);
113 assert_eq!(b.max().get::<1>(), 1011.0);
114 }
115
116 #[test]
117 fn segment_from_endpoints() {
118 let s: Segment<Pt2> = make_segment(&[0.0, 0.0], &[3.0, 4.0]);
119 assert_eq!(s.start().get::<0>(), 0.0);
120 assert_eq!(s.end().get::<0>(), 3.0);
121 }
122}