Skip to main content

egml_core/model/geometry/primitives/
point.rs

1use crate::impl_abstract_geometric_primitive_traits;
2use crate::model::geometry::primitives::{
3    AbstractGeometricPrimitive, AsAbstractGeometricPrimitive, AsAbstractGeometricPrimitiveMut,
4};
5use crate::model::geometry::{DirectPosition, Envelope};
6use nalgebra::Isometry3;
7
8/// A 0-D geometry that wraps a single [`DirectPosition`].
9///
10/// Corresponds to `gml:Point` in [OGC 07-036 ยง10.3.1](https://docs.ogc.org/is/07-036/07-036.pdf).
11#[derive(Debug, Clone, PartialEq, Default)]
12pub struct Point {
13    pub(crate) abstract_geometric_primitive: AbstractGeometricPrimitive,
14    pos: DirectPosition,
15}
16
17impl Point {
18    /// Creates a new `Point` from a position.
19    ///
20    /// # Examples
21    ///
22    /// ```rust
23    /// use egml_core::model::geometry::DirectPosition;
24    /// use egml_core::model::geometry::primitives::Point;
25    ///
26    /// let pos = DirectPosition::new(1.0, 2.0, 3.0).unwrap();
27    /// let pt = Point::new(pos);
28    /// assert_eq!(pt.pos().x(), 1.0);
29    /// ```
30    pub fn new(pos: DirectPosition) -> Self {
31        Self {
32            abstract_geometric_primitive: AbstractGeometricPrimitive::default(),
33            pos,
34        }
35    }
36
37    /// Returns the coordinate of this point.
38    pub fn pos(&self) -> &DirectPosition {
39        &self.pos
40    }
41
42    pub fn set_pos(&mut self, pos: DirectPosition) {
43        self.pos = pos;
44    }
45}
46
47impl Point {
48    /// Applies a rigid-body transform to this point in place.
49    pub fn apply_transform(&mut self, m: &Isometry3<f64>) {
50        self.pos.apply_transform(m);
51    }
52
53    /// Returns a degenerate (zero-volume) envelope at the point's position.
54    pub fn compute_envelope(&self) -> Envelope {
55        Envelope::new_unchecked(self.pos, self.pos)
56    }
57}
58
59impl AsAbstractGeometricPrimitive for Point {
60    fn abstract_geometric_primitive(&self) -> &AbstractGeometricPrimitive {
61        &self.abstract_geometric_primitive
62    }
63}
64
65impl AsAbstractGeometricPrimitiveMut for Point {
66    fn abstract_geometric_primitive_mut(&mut self) -> &mut AbstractGeometricPrimitive {
67        &mut self.abstract_geometric_primitive
68    }
69}
70
71impl_abstract_geometric_primitive_traits!(Point);