naive solve and decompose

This commit is contained in:
Quaternions 2024-08-21 18:56:31 -07:00
parent 6ed5dd8028
commit 24a7fce2a9

View File

@ -46,24 +46,70 @@ impl CI<'_>{
} }
} }
const fn solve0()->Planar64Vec3{ //note that this is horrible with fixed point arithmetic
Planar64Vec3::ZERO fn solve1(c0:&Contact)->Option<Planar64Vec3>{
let det=c0.normal.dot(c0.velocity);
if det.get().abs()<EPSILON.get(){
return None;
}
let d0=c0.normal.dot(c0.position);
Some(c0.normal*d0/det)
}
fn solve2(c0:&Contact,c1:&Contact)->Option<Planar64Vec3>{
let u0_u1=c0.velocity.cross(c1.velocity);
let n0_n1=c0.normal.cross(c1.normal);
let det=u0_u1.dot(n0_n1);
if det.get().abs()<EPSILON.get(){
return None;
}
let d0=c0.normal.dot(c0.position);
let d1=c1.normal.dot(c1.position);
Some((c1.normal.cross(u0_u1)*d0+u0_u1.cross(c0.normal)*d1)/det)
}
fn solve3(c0:&Contact,c1:&Contact,c2:&Contact)->Option<Planar64Vec3>{
let n0_n1=c0.normal.cross(c1.normal);
let det=c2.normal.dot(n0_n1);
if det.get().abs()<EPSILON.get(){
return None;
}
let d0=c0.normal.dot(c0.position);
let d1=c1.normal.dot(c1.position);
let d2=c2.normal.dot(c2.position);
Some((c1.normal.cross(c2.normal)*d0+c2.normal.cross(c0.normal)*d1+c0.normal.cross(c1.normal)*d2)/det)
} }
fn solve1(c0:&Contact)->Option<Planar64Vec3>{ fn decompose1(point:Planar64Vec3,u0:Planar64Vec3)->Option<Planar64>{
let d0=c0.normal.dot(c0.position); let det=u0.dot(u0);
let det=c0.normal.dot(c0.velocity); if det==Planar64::ZERO{
if det.abs()<EPSILON{ return None;
None
}else{
Some(c0.normal*d0/det)
} }
let s0=u0.dot(point)/det;
Some(s0)
}
fn decompose2(point:Planar64Vec3,u0:Planar64Vec3,u1:Planar64Vec3)->Option<(Planar64,Planar64)>{
let u0_u1=u0.cross(u1);
let det=u0_u1.dot(u0_u1);
if det==Planar64::ZERO{
return None;
}
let s0=u0_u1.dot(point.cross(u1))/det;
let s1=u0_u1.dot(u0.cross(point))/det;
Some((s0,s1))
}
fn decompose3(point:Planar64Vec3,u0:Planar64Vec3,u1:Planar64Vec3,u2:Planar64Vec3)->Option<(Planar64,Planar64,Planar64)>{
let det=u0.cross(u1).dot(u2);
if det==Planar64::ZERO{
return None;
}
let s0=point.cross(u1).dot(u2)/det;
let s1=u0.cross(point).dot(u2)/det;
let s2=u0.cross(u1).dot(point)/det;
Some((s0,s1,s2))
} }
const fn is_space_enclosed_0_1()->bool{ const fn is_space_enclosed_0_1()->bool{
false false
} }
fn is_space_enclosed_2( fn is_space_enclosed_2(
a:Planar64Vec3, a:Planar64Vec3,
b:Planar64Vec3, b:Planar64Vec3,