lj_rust/src/transformer/homography.rs

65 lines
1.5 KiB
Rust

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<Point> {
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() }]);
}
}