vanrijn/src/util/algebra_utils.rs

72 lines
1.8 KiB
Rust

use nalgebra::{Matrix3, Vector3};
pub fn try_change_of_basis_matrix(
x: &Vector3<f64>,
y: &Vector3<f64>,
z: &Vector3<f64>,
) -> Option<Matrix3<f64>> {
Some(Matrix3::from_rows(&[
x.transpose(),
y.transpose(),
z.transpose(),
]))
}
#[cfg(test)]
mod tests {
use super::*;
#[cfg(test)]
mod change_of_basis_matrix {
use super::*;
use quickcheck_macros::quickcheck;
#[test]
fn produces_isentity_when_passed_axes() {
let target: Matrix3<f64> = try_change_of_basis_matrix(
&Vector3::x_axis(),
&Vector3::y_axis(),
&Vector3::z_axis(),
)
.unwrap();
assert!(target == Matrix3::identity())
}
#[quickcheck]
fn swap_xy_does_not_change_z(v: Vector3<f64>) {
let target: Matrix3<f64> = try_change_of_basis_matrix(
&Vector3::y_axis(),
&Vector3::x_axis(),
&Vector3::z_axis(),
)
.unwrap();
let v2 = target * v;
assert!(v2.z == v.z)
}
#[quickcheck]
fn swap_xy_copies_y_to_x(v: Vector3<f64>) {
let target: Matrix3<f64> = try_change_of_basis_matrix(
&Vector3::y_axis(),
&Vector3::x_axis(),
&Vector3::z_axis(),
)
.unwrap();
let v2 = target * v;
assert!(v2.x == v.y)
}
#[quickcheck]
fn swap_xy_copies_x_to_y(v: Vector3<f64>) {
let target: Matrix3<f64> = try_change_of_basis_matrix(
&Vector3::y_axis(),
&Vector3::x_axis(),
&Vector3::z_axis(),
)
.unwrap();
let v2 = target * v;
assert!(v2.y == v.x)
}
}
}