#![allow(
clippy::float_cmp,
reason = "Reference distances are exact integer-valued literals (3-4-5)."
)]
use boost_geometry::adapt::Adapt;
use boost_geometry::algorithm::{area, distance, length};
use boost_geometry::cs::Cartesian;
use boost_geometry::model::{Point2D, Polygon};
use boost_geometry::tag::PointTag;
use boost_geometry::trait_::{Geometry, Point};
use geometry_model::polygon;
#[derive(Default)]
struct RoPoint([f64; 2]);
impl Geometry for RoPoint {
type Kind = PointTag;
type Point = Self;
}
impl Point for RoPoint {
type Scalar = f64;
type Cs = Cartesian;
const DIM: usize = 2;
fn get<const D: usize>(&self) -> f64 {
self.0[D]
}
}
#[test]
fn distance_through_hand_impl_ro_point() {
let a = RoPoint([0.0, 0.0]);
let b = RoPoint([3.0, 4.0]);
assert_eq!(distance(&a, &b), 5.0);
}
#[test]
fn distance_through_borrowed_array() {
let a_storage = [0.0_f64, 0.0];
let b_storage = [3.0_f64, 4.0];
assert_eq!(distance(&Adapt(&a_storage), &Adapt(&b_storage)), 5.0);
}
#[test]
fn distance_through_inline_adapt_borrow() {
let storage = [[0.0_f64, 0.0], [3.0, 4.0]];
let d = distance(&Adapt(&storage[0]), &Adapt(&storage[1]));
assert_eq!(d, 5.0);
}
mod linestring_of_borrows {
use super::*;
use boost_geometry::tag::LinestringTag;
use boost_geometry::trait_::Linestring;
pub struct Borrowed<'a>(pub Vec<Adapt<&'a [f64; 2]>>);
impl<'a> Geometry for Borrowed<'a> {
type Kind = LinestringTag;
type Point = Adapt<&'a [f64; 2]>;
}
impl<'a> Linestring for Borrowed<'a> {
fn points(&self) -> impl ExactSizeIterator<Item = &Adapt<&'a [f64; 2]>> + Clone {
self.0.iter()
}
}
#[test]
fn length_of_borrowed_three_point_polyline() {
let storage = [[0.0_f64, 0.0], [3.0, 4.0], [4.0, 3.0]];
let ls = Borrowed(storage.iter().map(Adapt).collect());
let got = length(&ls);
let expected = 5.0_f64 + 2.0_f64.sqrt();
assert!((got - expected).abs() < 1e-12);
}
}
#[test]
fn owned_polygon_area_unchanged_after_kc1() {
let p: Polygon<Point2D<f64, Cartesian>> =
polygon![[(2.0, 1.3), (4.1, 3.0), (5.3, 2.6), (2.9, 0.7), (2.0, 1.3)]];
assert!((area(&p) - 3.015).abs() < 1e-3);
}