diff options
author | eug-vs <eugene@eug-vs.xyz> | 2024-12-15 13:17:43 +0100 |
---|---|---|
committer | eug-vs <eugene@eug-vs.xyz> | 2024-12-15 13:17:43 +0100 |
commit | 70afc5a7d871919776a64782e8b93404e6b0defd (patch) | |
tree | c3d8a273bddf4cbc3c55d06c751766b93b961a1f /src/algebra | |
parent | 297efa5127e83bea57132c503680dd348a725db5 (diff) | |
download | particle-physics-70afc5a7d871919776a64782e8b93404e6b0defd.tar.gz |
feat!: add raylib rendering
Diffstat (limited to 'src/algebra')
-rw-r--r-- | src/algebra/mod.rs | 1 | ||||
-rw-r--r-- | src/algebra/subspace.rs | 69 |
2 files changed, 0 insertions, 70 deletions
diff --git a/src/algebra/mod.rs b/src/algebra/mod.rs deleted file mode 100644 index 13dcd6a..0000000 --- a/src/algebra/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod subspace; diff --git a/src/algebra/subspace.rs b/src/algebra/subspace.rs deleted file mode 100644 index 3b32ba7..0000000 --- a/src/algebra/subspace.rs +++ /dev/null @@ -1,69 +0,0 @@ -use nalgebra::SMatrix; - -use crate::{particle_system::Scalar, particle_system::N, Point, Vector}; - -type ProjectionMatrix = SMatrix<Scalar, N, N>; - -pub struct Subspace<const DIM: usize> { - point: Point, - vectors: [Vector; DIM], - projection_matrix: ProjectionMatrix, -} - -pub type Line = Subspace<1>; -pub type Plane = Subspace<2>; - -impl<const DIM: usize> Subspace<DIM> { - pub fn new(point: Point, mut vectors: [Vector; DIM]) -> Self { - for vector in &mut vectors { - vector.normalize_mut(); - } - - Self { - point, - vectors, - projection_matrix: { - let v = SMatrix::<Scalar, N, DIM>::from_columns(&vectors); - let transpose = v.transpose(); - let inverse = (transpose * v).try_inverse().unwrap(); - v * inverse * transpose - } - } - } - - pub fn project_point(&self, point: Point) -> Point { - self.projection_matrix * (point - self.point.coords) + self.point.coords - } - - pub fn distance(&self, point: Point) -> Scalar { - let projected = self.project_point(point); - (projected - point).norm() - } -} - -#[cfg(test)] -mod tests { - use crate::{algebra::subspace::Line, Point, Vector}; - - #[test] - fn test_projection_onto_line() { - let line = Line::new(Point::new(1.0, 0.0), [Vector::new(3.0, 1.0)]); - let point = Point::new(3.0, 4.0); - - let matrix = line.projection_matrix; - { - let diff = matrix * matrix - matrix; - assert!(diff.norm() < 0.001, "Projection matrix squared should be equal to itself: {}, {}", matrix, matrix* matrix); - } - { - let diff = matrix - matrix.transpose(); - assert!(diff.norm() < 0.001, "Projection matrix transpose should be equal to itself: {}, {}", matrix, matrix.transpose()); - } - - { - let projected = line.project_point(point); - let diff = projected - Point::new(4.0, 1.0); - assert!(diff.norm() < 0.001, "Point projected incorrectly"); - } - } -} |