include relative point
This commit is contained in:
@@ -84,8 +84,9 @@ const fn choose_any_direction()->Planar64Vec3{
|
||||
}
|
||||
|
||||
fn reduce_simplex(
|
||||
mesh:&MinkowskiMesh,
|
||||
mut simplex:Simplex,
|
||||
mesh:&MinkowskiMesh,
|
||||
point:Planar64Vec3,
|
||||
)->(Planar64Vec3,Simplex){
|
||||
match simplex.len(){
|
||||
0=>(choose_any_direction(),simplex),
|
||||
@@ -93,7 +94,7 @@ fn reduce_simplex(
|
||||
1=>{
|
||||
// --debug.profilebegin("reduceSimplex0")
|
||||
// local a = a1 - a0
|
||||
let p0=mesh.vert(simplex[0]);
|
||||
let p0=mesh.vert(simplex[0])+point;
|
||||
|
||||
// local p = -a
|
||||
let p=-p0;
|
||||
@@ -115,8 +116,8 @@ fn reduce_simplex(
|
||||
// --debug.profilebegin("reduceSimplex1")
|
||||
// local a = a1 - a0
|
||||
// local b = b1 - b0
|
||||
let p0=mesh.vert(simplex[0]);
|
||||
let p1=mesh.vert(simplex[1]);
|
||||
let p0=mesh.vert(simplex[0])+point;
|
||||
let p1=mesh.vert(simplex[1])+point;
|
||||
|
||||
// local p = -a
|
||||
// local u = b - a
|
||||
@@ -161,9 +162,9 @@ fn reduce_simplex(
|
||||
// local a = a1 - a0
|
||||
// local b = b1 - b0
|
||||
// local c = c1 - c0
|
||||
let p0=mesh.vert(simplex[0]);
|
||||
let p1=mesh.vert(simplex[1]);
|
||||
let p2=mesh.vert(simplex[2]);
|
||||
let p0=mesh.vert(simplex[0])+point;
|
||||
let p1=mesh.vert(simplex[1])+point;
|
||||
let p2=mesh.vert(simplex[2])+point;
|
||||
|
||||
// local p = -a
|
||||
// local u = b - a
|
||||
@@ -256,10 +257,10 @@ fn reduce_simplex(
|
||||
// local b = b1 - b0
|
||||
// local c = c1 - c0
|
||||
// local d = d1 - d0
|
||||
let p0=mesh.vert(simplex[0]);
|
||||
let p1=mesh.vert(simplex[1]);
|
||||
let p2=mesh.vert(simplex[2]);
|
||||
let p3=mesh.vert(simplex[3]);
|
||||
let p0=mesh.vert(simplex[0])+point;
|
||||
let p1=mesh.vert(simplex[1])+point;
|
||||
let p2=mesh.vert(simplex[2])+point;
|
||||
let p3=mesh.vert(simplex[3])+point;
|
||||
|
||||
// local p = -a
|
||||
// local u = b - a
|
||||
@@ -470,7 +471,7 @@ pub fn contains_point(mesh:&MinkowskiMesh,point:Planar64Vec3)->bool{
|
||||
// local dist = a:Dot(norm)
|
||||
// local hits = -dist < radiusP + radiusQ
|
||||
// return hits
|
||||
mesh.vert(simplex[1]).dot(direction).is_positive()
|
||||
(mesh.vert(simplex[1])+point).dot(direction).is_positive()
|
||||
},
|
||||
// on_escape
|
||||
|_simplex|{
|
||||
@@ -504,7 +505,7 @@ pub fn closest_fev(mesh:&MinkowskiMesh,point:Planar64Vec3)->Topology{
|
||||
// )
|
||||
fn minimum_difference<const ENABLE_FAST_FAIL:bool,T>(
|
||||
mesh:&MinkowskiMesh,
|
||||
rel_pos:Planar64Vec3,
|
||||
point:Planar64Vec3,
|
||||
on_exact:impl FnOnce(Simplex,Planar64Vec3)->T,
|
||||
on_escape:impl FnOnce(Simplex)->T,
|
||||
on_fast_fail:impl FnOnce()->T,
|
||||
@@ -513,7 +514,7 @@ fn minimum_difference<const ENABLE_FAST_FAIL:bool,T>(
|
||||
// local new_point_p = queryP(initialAxis)
|
||||
// local new_point_q = queryQ(-initialAxis)
|
||||
// local direction, a0, a1, b0, b1, c0, c1, d0, d1
|
||||
let mut direction=mesh.hint_point()+rel_pos;
|
||||
let mut direction=mesh.hint_point()+point;
|
||||
// degenerate case
|
||||
if direction==vec3::zero(){
|
||||
direction=choose_any_direction();
|
||||
@@ -537,7 +538,7 @@ fn minimum_difference<const ENABLE_FAST_FAIL:bool,T>(
|
||||
let next_point=mesh.farthest_vert(direction);
|
||||
|
||||
// if -direction:Dot(next_point) > (exitRadius + radiusP + radiusQ)*direction.magnitude then
|
||||
if ENABLE_FAST_FAIL&&direction.dot(mesh.vert(next_point)+rel_pos).is_negative(){
|
||||
if ENABLE_FAST_FAIL&&direction.dot(mesh.vert(next_point)+point).is_negative(){
|
||||
return on_fast_fail();
|
||||
}
|
||||
|
||||
@@ -561,6 +562,6 @@ fn minimum_difference<const ENABLE_FAST_FAIL:bool,T>(
|
||||
}
|
||||
|
||||
// direction, a0, a1, b0, b1, c0, c1, d0, d1 = reduceSimplex(new_point_p, new_point_q, a0, a1, b0, b1, c0, c1)
|
||||
(direction,simplex)=reduce_simplex(mesh,simplex);
|
||||
(direction,simplex)=reduce_simplex(simplex,mesh,point);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user