use std::collections::HashMap;
use nalgebra::Point2;
use crate::Coord;
pub type CornerMap = HashMap<Coord, Point2<f32>>;
pub fn corner_map_bounds(map: &CornerMap) -> Option<(i32, i32, i32, i32)> {
let mut keys = map.keys();
let first = keys.next()?;
let (mut min_u, mut min_v, mut max_u, mut max_v) = (first.u, first.v, first.u, first.v);
for g in keys {
min_u = min_u.min(g.u);
min_v = min_v.min(g.v);
max_u = max_u.max(g.u);
max_v = max_v.max(g.v);
}
Some((min_u, min_v, max_u, max_v))
}
pub fn complete_cell_corners(map: &CornerMap, u: i32, v: i32) -> Option<[Point2<f32>; 4]> {
let tl = *map.get(&Coord::new(u, v))?;
let tr = *map.get(&Coord::new(u + 1, v))?;
let br = *map.get(&Coord::new(u + 1, v + 1))?;
let bl = *map.get(&Coord::new(u, v + 1))?;
Some([tl, tr, br, bl])
}
#[cfg(test)]
mod tests {
use super::*;
fn unit_grid() -> CornerMap {
let mut map = CornerMap::new();
map.insert(Coord::new(0, 0), Point2::new(0.0, 0.0));
map.insert(Coord::new(1, 0), Point2::new(10.0, 0.0));
map.insert(Coord::new(1, 1), Point2::new(10.0, 10.0));
map.insert(Coord::new(0, 1), Point2::new(0.0, 10.0));
map
}
#[test]
fn bounds_none_when_empty() {
assert_eq!(corner_map_bounds(&CornerMap::new()), None);
}
#[test]
fn bounds_span_all_keys() {
let mut map = unit_grid();
map.insert(Coord::new(3, -2), Point2::new(1.0, 1.0));
assert_eq!(corner_map_bounds(&map), Some((0, -2, 3, 1)));
}
#[test]
fn complete_cell_returns_tl_tr_br_bl() {
let map = unit_grid();
let c = complete_cell_corners(&map, 0, 0).expect("complete cell");
assert_eq!(c[0], Point2::new(0.0, 0.0)); assert_eq!(c[1], Point2::new(10.0, 0.0)); assert_eq!(c[2], Point2::new(10.0, 10.0)); assert_eq!(c[3], Point2::new(0.0, 10.0)); }
#[test]
fn incomplete_cell_is_none() {
let mut map = unit_grid();
map.remove(&Coord::new(1, 1)); assert_eq!(complete_cell_corners(&map, 0, 0), None);
}
}