summaryrefslogtreecommitdiff
path: root/physics/src/constraint/anchor.rs
diff options
context:
space:
mode:
authoreug-vs <eugene@eug-vs.xyz>2024-12-15 13:17:43 +0100
committereug-vs <eugene@eug-vs.xyz>2024-12-15 13:17:43 +0100
commit70afc5a7d871919776a64782e8b93404e6b0defd (patch)
treec3d8a273bddf4cbc3c55d06c751766b93b961a1f /physics/src/constraint/anchor.rs
parent297efa5127e83bea57132c503680dd348a725db5 (diff)
downloadparticle-physics-70afc5a7d871919776a64782e8b93404e6b0defd.tar.gz
feat!: add raylib rendering
Diffstat (limited to 'physics/src/constraint/anchor.rs')
-rw-r--r--physics/src/constraint/anchor.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/physics/src/constraint/anchor.rs b/physics/src/constraint/anchor.rs
new file mode 100644
index 0000000..c90cfb2
--- /dev/null
+++ b/physics/src/constraint/anchor.rs
@@ -0,0 +1,43 @@
+use nalgebra::{DVector, RowDVector};
+
+use crate::particle_system::ParticleSystem;
+use crate::algebra::{Point, Scalar, N};
+
+use super::Constraint;
+
+pub struct AnchorConstraint {
+ pub particle_id: usize,
+ pub anchor: Point,
+
+ jacobian: RowDVector<Scalar>,
+}
+
+impl ParticleSystem {
+ pub fn add_anchor_constraint(&mut self, particle_id: usize) {
+ let anchor = self.particles[particle_id].position;
+ self.constraints.push(Box::new(AnchorConstraint {
+ particle_id,
+ anchor,
+ jacobian: RowDVector::zeros(self.particles.len() * N),
+ }));
+ }
+}
+
+impl Constraint for AnchorConstraint {
+ fn get_particles(&self) -> Vec<usize> {
+ vec![self.particle_id]
+ }
+
+ fn c(&self, q: &DVector<Scalar>) -> Scalar {
+ let position = q.fixed_rows(self.particle_id * N);
+ (position - self.anchor.coords).norm()
+ }
+
+ fn set_jacobian(&mut self, jacobian: RowDVector<Scalar>) {
+ self.jacobian = jacobian
+ }
+
+ fn jacobian_prev(&self) -> RowDVector<Scalar> {
+ self.jacobian.clone()
+ }
+}