egml_core/model/geometry/primitives/
polygon.rs1use crate::model::base::Gml;
2use crate::model::geometry::{DirectPosition, Envelope, LinearRing};
3use crate::operations::geometry::Geometry;
4use crate::operations::surface::Surface;
5use crate::Error;
6use nalgebra::Isometry3;
7use rayon::prelude::*;
8
9#[derive(Debug, Clone, PartialEq)]
10pub struct Polygon {
11 pub gml: Gml,
12 pub exterior: LinearRing,
13 pub interior: Vec<LinearRing>,
14}
15
16impl Polygon {
17 pub fn new(gml: Gml, exterior: LinearRing, interior: Vec<LinearRing>) -> Result<Self, Error> {
18 Ok(Self {
19 gml,
20 exterior,
21 interior,
22 })
23 }
24
25 pub fn get_envelope(&self) -> Envelope {
26 self.exterior.envelope()
27 }
28}
29
30impl Geometry for Polygon {
31 fn points(&self) -> Vec<&DirectPosition> {
32 let mut all_points = Vec::new();
33 all_points.extend(self.exterior.points());
34
35 for ring in &self.interior {
36 all_points.extend(ring.points().iter());
37 }
38
39 all_points
40 }
41
42 fn apply_transform(&mut self, m: &Isometry3<f64>) {
43 self.exterior.apply_transform(m);
44
45 self.interior.par_iter_mut().for_each(|p| {
46 p.apply_transform(m);
47 });
48 }
49}
50
51impl Surface for Polygon {
52 fn outer_boundary_points(&self) -> Vec<&DirectPosition> {
53 self.exterior.outer_boundary_points()
54 }
55}