diff --git a/src/face_crawler.rs b/src/face_crawler.rs index 1c4b23a..391b566 100644 --- a/src/face_crawler.rs +++ b/src/face_crawler.rs @@ -101,8 +101,8 @@ enum Transition{ } best_transtition } -pub fn crawl_fev(mut fev:FEV,mesh:&impl MeshQuery,relative_body:&Body,time_limit:Time)->Option<(F,Time)>{ - let mut time=relative_body.time; +pub fn crawl_fev(mut fev:FEV,mesh:&impl MeshQuery,relative_body:&Body,start_time:Time,time_limit:Time)->Option<(F,Time)>{ + let mut time=start_time; loop{ match next_transition(&fev,time,mesh,relative_body,time_limit){ Transition::Miss=>return None, @@ -115,10 +115,10 @@ pub enum CrawlResult{ Closest(FEV), Hit(F,Time), } -pub fn crawl_fev_from_negative_infinity(mut fev:FEV,mesh:&impl MeshQuery,relative_body:&Body)->CrawlResult{ +pub fn crawl_fev_from_negative_infinity(mut fev:FEV,mesh:&impl MeshQuery,relative_body:&Body,time_limit:Time)->CrawlResult{ let mut time=Time::MIN; loop{ - match next_transition(&fev,time,mesh,relative_body,relative_body.time){ + 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 diff --git a/src/model_physics.rs b/src/model_physics.rs index 295f0bb..8063d30 100644 --- a/src/model_physics.rs +++ b/src/model_physics.rs @@ -355,18 +355,18 @@ impl MinkowskiMesh<'_>{ } pub fn predict_collision_in(&self,relative_body:&crate::physics::Body,time_limit:crate::integer::Time)->Option<(MinkowskiFace,crate::integer::Time)>{ let start_vert=FEV::::Vert(self.farthest_vert((-relative_body.clone()).infinity_dir())); - match crate::face_crawler::crawl_fev_from_negative_infinity(start_vert,self,relative_body){ + 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,time_limit) + crate::face_crawler::crawl_fev(fev,self,relative_body,relative_body.time,time_limit) }, crate::face_crawler::CrawlResult::Hit(_,_)=>None,//already in or passed } } pub fn predict_collision_out(&self,relative_body:&crate::physics::Body,time_limit:crate::integer::Time)->Option<(MinkowskiFace,crate::integer::Time)>{ let start_vert=FEV::::Vert(self.farthest_vert(relative_body.infinity_dir())); - match crate::face_crawler::crawl_fev_from_negative_infinity(start_vert,self,&-relative_body.clone()){ + 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).map(|t|(t.0,-t.1)) + 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)), }