89 lines
2.0 KiB
Rust
89 lines
2.0 KiB
Rust
use crate::point::Point;
|
|
use crate::transformer::Transformers;
|
|
use crate::worldstate::{WorldState, EDH};
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
/// 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()
|
|
}]
|
|
);
|
|
}
|
|
}
|