/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 0 - 2 0 2 0 , ĠD ani lo ĠP ian ini Ġand Ġcontributors Ċ Ġ* Ġlisted Ġin Ġthe Ġmain Ġproject 's Ġal che mist / build . gradle . k ts Ġfile . Ċ Ġ* Ċ Ġ* ĠThis Ġfile Ġis Ġpart Ġof ĠAl che mist , Ġand Ġis Ġdistributed Ġunder Ġthe Ġterms Ġof Ġthe Ċ Ġ* ĠGNU ĠGeneral ĠPublic ĠLicense , Ġwith Ġa Ġlinking Ġexception , Ċ Ġ* Ġas Ġdescribed Ġin Ġthe Ġfile ĠLICENSE Ġin Ġthe ĠAl che mist Ġdistribution 's Ġtop Ġdirectory . Ċ Ġ*/ Ċ Ċ package Ġit . uni bo . al che mist . model . implement ations . actions . navigation str ategies Ċ Ċ import Ġit . uni bo . al che mist . model . implement ations . positions . E uclidean 2 D Position Ċ import Ġit . uni bo . al che mist . model . interfaces . Navigation Action 2 D Ċ import Ġit . uni bo . al che mist . model . interfaces . Navigation Strategy Ċ import Ġit . uni bo . al che mist . model . interfaces . geometry . e uclidean 2 d . Convex Polygon Ċ import Ġit . uni bo . al che mist . model . interfaces . geometry . e uclidean 2 d . E uclidean 2 D Convex Shape Ċ import Ġit . uni bo . al che mist . model . interfaces . geometry . e uclidean 2 d . graph . E uclidean 2 D Pass age Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Navigation Strategy ] Ġallowing Ġto Ġfollow Ġa Ġgiven Ġ[ route ]. Ċ Ġ* ĠThe Ġ[ route ] Ġconsists Ġof Ġa Ġlist Ġof Ġpositions Ġ(= Ġway points ) Ġthat Ġmay Ġor Ġmay Ġnot Ġbe Ġin Ġsight Ġof Ġeach Ċ Ġ* Ġother Ġ( i . e . Ġthe Ġpath Ġleading Ġfrom Ġa Ġway point Ġto Ġthe Ġnext Ġone Ġmay Ġor Ġmay Ġnot Ġbe Ġrepresent able Ċ Ġ* Ġas Ġa Ġsingle Ġsegment ), Ġfor Ġthis Ġreason Ġ[ P urs uing ] Ġbehavior Ġis Ġused Ġto Ġreach Ġeach Ġway point . Ċ Ġ* ĠIn Ġthis Ġcontext , Ġa Ġway point Ġis Ġconsidered Ġreached Ġwhen Ġit 's Ġinside Ġthe Ġcurrent Ġroom Ġ( not Ġwhen Ġthe Ċ Ġ* Ġpe de stri an Ġreach Ġthat Ġexact Ġposition ), Ġapart Ġfrom Ġthe Ġlast Ġway point Ġwhich Ġis Ġactually Ġappro ached . Ċ Ġ* ĠC uts Ġto Ġthe Ġroute Ġare Ġallowed Ġ( i . e . Ġif Ġthe Ġpe de stri an Ġfinds Ġa Ġway point Ġwhich Ġis Ġfar ther Ġthan Ġthe Ċ Ġ* Ġexpected Ġnext Ġone , Ġhe / she Ġskip s Ġall Ġthe Ġway points Ġin Ġbetween ). Ċ Ġ* Ċ Ġ* Ġ@ param ĠT Ġthe Ġconcent ration Ġtype . Ċ Ġ* Ġ@ param ĠL Ġthe Ġtype Ġof Ġland marks Ġof Ġthe Ġpe de stri an 's Ġc ognitive Ġmap . Ċ Ġ* Ġ@ param ĠR Ġthe Ġtype Ġof Ġedges Ġof Ġthe Ġpe de stri an 's Ġc ognitive Ġmap , Ġrepresenting Ġthe Ġ[ R ] el ations Ġbetween Ġland marks . Ċ Ġ*/ Ċ open Ġclass ĠRoute Following < T , ĠL Ġ: ĠE uclidean 2 D Convex Shape , ĠR > Ġconstructor ( ĊĠĠĠ Ġaction : ĠNavigation Action 2 D < T , ĠL , ĠR , ĠConv ex Polygon , ĠE uclidean 2 D Pass age >, ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġroute Ġto Ġfollow . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġval Ġroute : ĠList < E uclidean 2 D Position > Ċ ) Ġ: ĠDynamic P urs uing < T , ĠL , ĠR >( action , Ġaction . environment . origin . take If Ġ{ Ġroute . isEmpty () Ġ} Ġ?: Ġroute [ 0 ]) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar ĠindexOf Next Waypoint : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġin Ġan Ġunexpected Ġroom Ġthe Ġpe de stri an Ġgets Ġback Ġto Ġ[ previous Room ] Ġso Ġas Ġto Ġcontinue Ġfollowing Ġthe ĊĠĠĠĠ Ġ* Ġroute Ġcorrectly . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġin Unexpected New Room ( ĊĠĠĠĠĠĠĠ Ġprevious Room : ĠConv ex Polygon , ĊĠĠĠĠĠĠĠ Ġexpected New Room : ĠConv ex Polygon , ĊĠĠĠĠĠĠĠ Ġactual New Room : ĠConv ex Polygon ĊĠĠĠ Ġ) Ġ= Ġwith ( action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo ors In S ight () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . head Ġ== Ġprevious Room Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. min By OrNull Ġ{ Ġit . distance To Pe de stri an () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġcross Door ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġin New Room ( actual New Room ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġin New Room ( new Room : ĠConv ex Polygon ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( route . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction . stop () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( waypoint Reached ( new Room )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Destination ( route [ indexOf Next Waypoint ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . in New Room ( new Room ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġa Ġnew Ġway point Ġhas Ġbeen Ġreached Ġand Ġupdates Ġ[ indexOf Next Waypoint ] Ġaccordingly . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġway point Reached ( current Room : ĠConv ex Polygon ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( indexOf Next Waypoint Ġ>= Ġroute . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠindexOf Far ther Waypoint Reached Ġ= Ġroute . indexOf Last Ġ{ Ġis Reached ( it , Ġcurrent Room ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Waypoint Reached Ġ= ĠindexOf Far ther Waypoint Reached Ġ>= ĠindexOf Next Waypoint ĊĠĠĠĠĠĠĠ Ġif Ġ( new Waypoint Reached ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠindexOf Next Waypoint Ġ= Ġ( indexOf Far ther Waypoint Reached Ġ+ Ġ 1 ). coerce At Most ( route . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Waypoint Reached ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġgiven Ġ[ waypoint ] Ġis Ġreached Ġ( as Ġstated Ġabove , Ġif Ġit 's Ġinside Ġ[ current Room ]). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġis Reached ( waypoint : ĠE uclidean 2 D Position , Ġcurrent Room : ĠConv ex Polygon ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġcurrent Room . contains ( waypoint ) Ċ } Ċ