use crate::transformer::Transformers; use crate::point::Point; use crate::worldstate::{WorldState,EDH}; use serde::{Serialize,Deserialize}; /// Homography #[derive(Serialize,Deserialize,Debug,Clone,Copy)] pub struct Homography {} impl Transformers for Homography { fn apply(&self, point_list: &[Point], ws: &WorldState) -> Vec { let edh : &EDH = &ws.edh; point_list.iter() .map(| point | edh.apply(point)) .collect() } } #[cfg(test)] mod tests { use super::*; #[test] fn identity_matrix_let_point_unchanged() { let p0 = Point { x: -1500.0, y: 1500.0, ..Point::default() }; let edh = EDH::new(vec![ vec![ 1.0, 0.0, 0.0 ], vec![ 0.0, 1.0, 0.0 ], vec![ 0.0, 0.0, 1.0 ] ]).unwrap(); let ws = WorldState { edh : edh, ..WorldState::default() }; let homography = Homography{}; let result = homography.apply(&[p0], &ws); assert_eq!(result, vec![Point { x: -1500.0, y: 1500.0, ..Point::default() }]); } #[test] fn rotation_matrix_rotate_the_point() { let p0 = Point { x: -1500.0, y: 1500.0, ..Point::default() }; let edh = EDH::new(vec![ vec![ 1.24107321e-03, 1.00500127e-03, 7.15439347e-01], vec![-9.93223912e-04, 1.22652939e-03,-6.98671238e-01], vec![ 1.06017142e-17,-4.69459541e-17, 3.32700590e-05] ]).unwrap(); let ws = WorldState { edh : edh, ..WorldState::default() }; let homography = Homography{}; let result = homography.apply(&[p0], &ws); assert_eq!(result, vec![Point { x: 10860.557, y: 79078.87, ..Point::default() }]); } }