use geo::{Destination, Geodesic};
use geo_types::{Coord, LineString, Point, Polygon};
pub fn compute_buffer(center: Point<f64>, distance_m: f64, segments: usize) -> Polygon<f64> {
let mut coords: Vec<Coord<f64>> = (0..segments)
.map(|i| {
let bearing = (i as f64) * 360.0 / (segments as f64);
let dest = Geodesic.destination(center, bearing, distance_m);
Coord {
x: dest.x(),
y: dest.y(),
}
})
.collect();
coords.reverse();
coords.push(coords[0]);
Polygon::new(LineString::from(coords), vec![])
}
#[cfg(test)]
mod tests {
use super::*;
use geo::GeodesicArea;
#[test]
fn buffer_area_is_the_disk_not_its_complement() {
let poly = compute_buffer(Point::new(-82.5, 36.5), 5000.0, 64);
let area_km2 = poly.geodesic_area_unsigned() / 1_000_000.0;
assert!(
(70.0..85.0).contains(&area_km2),
"expected ~78 km², got {area_km2}"
);
}
}