use boost_geometry::adapt::{register_polygon, register_ring};
use boost_geometry::model::{Polygon, Ring};
use boost_geometry::overlay::{JoinStrategy, buffer_convex_polygon, is_valid_polygon};
use boost_geometry::prelude::*;
type P = Point2D<f64, Cartesian>;
struct Boundary {
points: Vec<P>,
}
struct Parcel {
outer: Boundary,
holes: Vec<Boundary>,
}
register_ring!(Boundary, P, |s| s.points.iter());
register_polygon!(
Parcel,
P,
ring = Boundary,
|s| outer = &s.outer,
inners = s.holes.iter()
);
fn main() {
let parcel = Parcel {
outer: Boundary {
points: vec![
P::new(0.0, 0.0),
P::new(0.0, 2.0),
P::new(2.0, 2.0),
P::new(2.0, 0.0),
P::new(0.0, 0.0),
],
},
holes: vec![],
};
println!("parcel valid: {:?}", is_valid_polygon(&parcel));
let model: Polygon<P> = Polygon::new(Ring::from_vec(parcel.outer.points.clone()));
let mut grown = buffer_convex_polygon(
&model,
1.0,
JoinStrategy::Round {
points_per_circle: 360,
},
);
correct(&mut grown);
println!("buffered valid: {:?}", is_valid_polygon(&grown));
println!("area {:.3} -> {:.3}", area(&parcel), area(&grown));
}