55 lines
1.3 KiB
Rust
55 lines
1.3 KiB
Rust
use crate::errors::{LJError, LJResult};
|
|
use crate::point::{Color, Point};
|
|
use log::debug;
|
|
use nalgebra::base::{Matrix1x3, Matrix3};
|
|
|
|
#[derive(Debug, Default)]
|
|
pub struct EDH {
|
|
pub matrix: Matrix3<f32>,
|
|
}
|
|
|
|
impl EDH {
|
|
pub fn new(vec: Vec<Vec<f32>>) -> LJResult<EDH> {
|
|
if vec.len() != 3 || vec[0].len() != 3 || vec[1].len() != 3 || vec[2].len() != 3 {
|
|
return Err(Box::new(LJError::BadEDH));
|
|
}
|
|
|
|
// this is the matrix already transposed.
|
|
let matrix = Matrix3::new(
|
|
vec[0][0], vec[1][0], vec[2][0], vec[0][1], vec[1][1], vec[2][1], vec[0][2], vec[1][2],
|
|
vec[2][2],
|
|
);
|
|
|
|
Ok(EDH { matrix })
|
|
}
|
|
|
|
pub fn apply(&self, point: &Point) -> Point {
|
|
let p = Matrix1x3::new(point.x, point.y, 1.0);
|
|
let p = p * self.matrix;
|
|
let new_p = Point {
|
|
x: p[0] / p[2],
|
|
y: p[1] / p[2],
|
|
..*point
|
|
};
|
|
|
|
debug!("{:?} => {:?}", point, new_p);
|
|
|
|
new_p
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Default)]
|
|
pub struct WorldState {
|
|
pub edh: EDH,
|
|
pub resampler: Vec<f32>,
|
|
pub client_key: String,
|
|
pub intensity: u8,
|
|
pub kpps: u32,
|
|
pub color: Color,
|
|
pub draw_black: bool,
|
|
pub draw_grid: bool,
|
|
pub grid: Vec<Point>,
|
|
}
|
|
|
|
impl WorldState {}
|