combine crawl into one loop

This commit is contained in:
Quaternions 2023-11-17 13:43:44 -08:00
parent 8839b8fbb3
commit e6c955a958
2 changed files with 7 additions and 26 deletions

View File

@ -111,17 +111,3 @@ pub fn crawl_fev<F:Copy,E:Copy+DirectedEdge,V:Copy>(mut fev:FEV<F,E,V>,mesh:&imp
}
}
}
pub enum CrawlResult<F,E:DirectedEdge,V>{
Closest(FEV<F,E,V>),
Hit(F,Time),
}
pub fn crawl_fev_from_negative_infinity<F:Copy,E:Copy+DirectedEdge,V:Copy>(mut fev:FEV<F,E,V>,mesh:&impl MeshQuery<F,E,V>,relative_body:&Body,time_limit:Time)->CrawlResult<F,E,V>{
let mut time=Time::MIN;
loop{
match next_transition(&fev,time,mesh,relative_body,time_limit){
Transition::Miss=>return CrawlResult::Closest(fev),
Transition::Next(next_fev,next_time)=>(fev,time)=(next_fev,next_time),
Transition::Hit(face,time)=>return CrawlResult::Hit(face,time),//algorithm breaks down inside without full fat voronoi
}
}
}

View File

@ -356,23 +356,18 @@ impl MinkowskiMesh<'_>{
pub fn predict_collision_in(&self,relative_body:&crate::physics::Body,time_limit:crate::integer::Time)->Option<(MinkowskiFace,crate::integer::Time)>{
(-relative_body.clone()).infinity_dir().map_or(None,|dir|{
let start_vert=FEV::<MinkowskiFace,MinkowskiDirectedEdge,MinkowskiVert>::Vert(self.farthest_vert(dir));
match crate::face_crawler::crawl_fev_from_negative_infinity(start_vert,self,relative_body,relative_body.time){
crate::face_crawler::CrawlResult::Closest(fev)=>{
crate::face_crawler::crawl_fev(fev,self,relative_body,relative_body.time,time_limit)
},
crate::face_crawler::CrawlResult::Hit(_,_)=>None,//already in or passed
}
let start_time=crate::integer::Time::MIN;//relative_body.time
crate::face_crawler::crawl_fev(start_vert,self,relative_body,start_time,time_limit)
})
}
pub fn predict_collision_out(&self,relative_body:&crate::physics::Body,time_limit:crate::integer::Time)->Option<(MinkowskiFace,crate::integer::Time)>{
//This doesn't work if the out-path goes back in. it must be the final exit.
relative_body.infinity_dir().map_or(None,|dir|{
let start_vert=FEV::<MinkowskiFace,MinkowskiDirectedEdge,MinkowskiVert>::Vert(self.farthest_vert(dir));
match crate::face_crawler::crawl_fev_from_negative_infinity(start_vert,self,&-relative_body.clone(),-time_limit){
crate::face_crawler::CrawlResult::Closest(fev)=>{
crate::face_crawler::crawl_fev(fev,self,&-relative_body.clone(),-time_limit,-relative_body.time).map(|t|(t.0,-t.1))
},
crate::face_crawler::CrawlResult::Hit(face,time)=>Some((face,-time)),
}
let start_time=crate::integer::Time::MIN;//-time_limit
crate::face_crawler::crawl_fev(start_vert,self,&-relative_body.clone(),start_time,-relative_body.time)
.filter(|t|-t.1<time_limit)
.map(|t|(t.0,-t.1))
})
}
pub fn predict_collision_face_out(&self,relative_body:&crate::physics::Body,time_limit:crate::integer::Time,contact_face_id:MinkowskiFace)->Option<(MinkowskiEdge,crate::integer::Time)>{