use nalgebra::{DVector, RowDVector}; use crate::{ algebra::{subspace::Line, Point, Scalar, Vector, N}, particle_system::ParticleSystem, }; use super::Constraint; pub struct SliderConstraint { pub particle_id: usize, pub line: Line, jacobian: RowDVector, } impl ParticleSystem { pub fn add_slider_constraint(&mut self, particle_id: usize, direction: Vector) { let point = self.particles[particle_id].position; self.constraints.push(Box::new(SliderConstraint { particle_id, line: Line::new(point, [direction]), jacobian: RowDVector::zeros(self.particles.len() * N), })); } } impl Constraint for SliderConstraint { fn get_particles(&self) -> Vec { vec![self.particle_id] } fn c(&self, q: &DVector) -> Scalar { let position = q.fixed_rows::(self.particle_id * N); let point = Point::from_coordinates(position.into()); self.line.distance(point) } fn set_jacobian(&mut self, jacobian: RowDVector) { self.jacobian = jacobian } fn jacobian_prev(&self) -> RowDVector { self.jacobian.clone() } }