package Ġcom . pol ito . s ism ic . Inter actors . Helpers Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġcom . pol ito . s ism ic . Domain . Ne ighbours Node Data Ċ import Ġcom . pol ito . s ism ic . Domain . Ne ighbours Node Square Ċ import Ġcom . pol ito . s ism ic . R Ċ Ċ // Could Ġwork Ġwith Ġclasses Ġbut Ġwith Ġindexes Ġis Ġfaster Ċ class ĠParameters For Coordinate Helper ( val ĠmContext Ġ: ĠContext ) Ġ{ ĊĊĠĠĠ Ġ// DB Ġprecision Ġfor Ġlat Ġand Ġlong Ġis Ġ 3 Ġdecimal ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// elements Ġare Ġvery Ġfar Ġin Ġthe Ġdatabase ĊĠĠĠĠĠĠĠ Ġval ĠS EN SI B ILITY Ġ= Ġ 0 . 1 0 ĊĠĠĠĠĠĠĠ Ġfun Ġdist From ( lat 1 : ĠDouble , Ġlng 1 : ĠDouble , Ġlat 2 : ĠDouble , Ġlng 2 : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġearth Radius Ġ= Ġ 6 3 7 1 0 0 0 . 0 Ġ// meters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Lat Ġ= ĠMath . to Radians (( lat 2 Ġ- Ġlat 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Lng Ġ= ĠMath . to Radians (( lng 2 Ġ- Ġlng 1 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠMath . sin ( d Lat Ġ/ Ġ 2 ) Ġ* ĠMath . sin ( d Lat Ġ/ Ġ 2 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . cos ( Math . to Radians ( lat 1 )) Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . cos ( Math . to Radians ( lat 2 )) Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . sin ( d Lng Ġ/ Ġ 2 ) Ġ* ĠMath . sin ( d Lng Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġ 2 Ġ* ĠMath . atan 2 ( Math . sqrt ( a ), ĠMath . sqrt ( 1 Ġ- Ġa )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdist Ġ= Ġ( earth Radius Ġ* Ġc ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdist Ġ/ Ġ 1 0 0 0 Ġ// ( KM ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġm Csv Helper Ġ: ĠCsv Helper Ġ= ĠCsv Helper ( mContext ) ĊĠĠĠ Ġ// just Ġlat / lon ĊĊĠĠĠ Ġprivate Ġvar Ġm Coordinate Array Ġ: ĠArray < Triple < String , ĠDouble , ĠDouble >> Ġ= ĠarrayOf () ĊĠĠĠ Ġprivate Ġval Ġm Map Ġ: ĠHashMap < String , ĠArray < String >> Ġ= Ġhash Map Of () ĊĠĠĠ Ġprivate Ġvar Ġinitialized Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġinitialize () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( initialized ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġtmp List Ġ= Ġmutable ListOf < Triple < String , ĠDouble , ĠDouble >>() ĊĠĠĠĠĠĠĠ Ġm Csv Helper . read From Raw ( R . raw . spe tt ri 2 0 0 8 ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Map . put ( it [ Coordinate Database Parameters . ID . ordinal ], Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp List . add ( Triple ( it [ Coordinate Database Parameters . ID . ordinal ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ Coordinate Database Parameters . LON . ordinal ]. toDouble (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ Coordinate Database Parameters . LAT . ordinal ]. toDouble ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Coordinate Array Ġ= Ġtmp List . to Typed Array () ĊĠĠĠĠĠĠĠ Ġinitialized Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Closest Points To ( x Ġ: ĠDouble , Ġy Ġ: ĠDouble ) Ġ: ĠNe ighbours Node Square ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! initialized ) Ġreturn ĠNe ighbours Node Square . Invalid ĊĠĠĠĠĠĠĠ Ġif Ġ( x Ġ== Ġ- 1 . 0 Ġ|| Ġy Ġ== Ġ- 1 . 0 ) Ġreturn ĠNe ighbours Node Square . Invalid ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Triple < String , ĠDouble , ĠInt >>() ĊĊĠĠĠĠĠĠĠ Ġ// get Ġto Ġthe Ġclosest Ġpoint Ġin Ġlongitude ĊĠĠĠĠĠĠĠ Ġval Ġinit Index Ġ= Ġ( 0 Ġuntil Ġm Coordinate Array . size ). first OrNull Ġ{ Ġm Coordinate Array [ it ]. second Ġ>= Ġx Ġ} Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( init Index Ġ== Ġ- 1 ) Ġreturn ĠNe ighbours Node Square . Invalid ĊĊĠĠĠĠĠĠĠ Ġ// search Ġleft Ġand Ġright Ġfrom Ġinitial Ġindex . Ġit Ġstops Ġwhen Ġthe Ġdistance Ġfrom Ġa Ġpoint Ġis Ġgreater Ġthan Ġthe Ġsum Ġof Ġthe Ġclosest Ġone ĊĠĠĠĠĠĠĠ Ġ// the Ġreturn Ġlists Ġhave Ġan Ġindex Ġfor Ġthe Ġmap Ġto Ġthe Ġpoint Ġand Ġthe Ġdistance Ġfrom Ġthe Ġinput Ġpoint ĊĠĠĠĠĠĠĠ Ġval Ġleft Values Ġ= Ġ Ġinner Get Closest Point ( x , Ġy , Ġtrue , Ġinit Index , ĠDouble . MAX _ VALUE , Ġmutable ListOf (), Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġright Values Ġ= Ġ Ġinner Get Closest Point ( x , Ġy , Ġfalse , Ġinit Index , ĠDouble . MAX _ VALUE , Ġmutable ListOf (), Ġ 0 ) ĊĊĠĠĠĠĠĠĠ ĠLog . d (" End Ġof Ġrecursion ", Ġ" Left Ġlist :" Ġ+ Ġleft Values . toString () Ġ+ Ġ" ĠRight Ġlist : Ġ" Ġ+ Ġright Values . toString ()) ĊĠĠĠĠĠĠĠ Ġresult . addAll ( left Values ) ĊĠĠĠĠĠĠĠ Ġresult . addAll ( right Values ) ĊĠĠĠĠĠĠĠ Ġ// order Ġby Ġdistance ĊĠĠĠĠĠĠĠ Ġresult . sortBy Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d (" End Ġof Ġrecursion ", Ġ" Sorted Ġlist :" Ġ+ Ġresult . toString ()) ĊĠĠĠĠĠĠĠ Ġ// ret uns Ġan Ġobject Ġsquare Ġof Ġnodes Ġwith Ġid , Ġlong , Ġlatitude Ġand Ġdistance Ġfrom Ġinput Ġcoordinate Ġ( in Ġkm ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Square From Candidates Nodes ( x , Ġy , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Row Data For Node ( requested NodeId Ġ: ĠString ) Ġ: ĠArray < String > ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! initialized ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! m Map . containsKey ( requested NodeId )) Ġreturn Ġempty Array () ĊĠĠĠĠĠĠĠ Ġreturn Ġm Map [ requested NodeId ] !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Square From Candidates Nodes ( input Lon Ġ: ĠDouble , Ġinput Lat : ĠDouble , Ġcandidates List : ĠList < Triple < String , ĠDouble , ĠInt >> ): ĠNe ighbours Node Square Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcandidate NE Ġ: ĠNe ighbours Node Data ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġcandidate NO Ġ: ĠNe ighbours Node Data ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġcandidate SE Ġ: ĠNe ighbours Node Data ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġcandidate SO Ġ: ĠNe ighbours Node Data ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// candidates List . forEach Indexed Ġ{ Ġindex , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġval Ġcandidate Lon Ġ= ĠgetData For Node ( candidates List [ index ]. first , ĠCoordinate Database Parameters . LON ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġval Ġcandidate Lat Ġ= ĠgetData For Node ( candidates List [ index ]. first , ĠCoordinate Database Parameters . LAT ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġif Ġ( candidate Lon Ġ<= Ġinput Lon Ġ&& Ġcandidate Lat Ġ<= Ġinput Lat Ġ&& Ġcandidate SE Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġcandidate SE Ġ= ĠNe ighbours Node Data ( candidates List [ index ]. first , Ġcandidate Lon , Ġcandidate Lat , Ġdist From ( input Lat , Ġinput Lon , Ġcandidate Lat , Ġcandidate Lon )) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġelse Ġif Ġ( candidate Lon Ġ<= Ġinput Lon Ġ&& Ġcandidate Lat Ġ> Ġinput Lat Ġ&& Ġcandidate NE Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġcandidate NE Ġ= ĠNe ighbours Node Data ( candidates List [ index ]. first , Ġcandidate Lon , Ġcandidate Lat , Ġdist From ( input Lat , Ġinput Lon , Ġcandidate Lat , Ġcandidate Lon )) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġelse Ġif Ġ( candidate Lon Ġ> Ġinput Lon Ġ&& Ġcandidate Lat Ġ> Ġinput Lat Ġ&& Ġcandidate NO Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġcandidate NO Ġ= ĠNe ighbours Node Data ( candidates List [ index ]. first , Ġcandidate Lon , Ġcandidate Lat , Ġdist From ( input Lat , Ġinput Lon , Ġcandidate Lat , Ġcandidate Lon )) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġelse Ġif Ġ( candidate Lon Ġ> Ġinput Lon Ġ&& Ġcandidate Lat Ġ<= Ġinput Lat Ġ&& Ġcandidate SO Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġcandidate SO Ġ= ĠNe ighbours Node Data ( candidates List [ index ]. first , Ġcandidate Lon , Ġcandidate Lat , Ġdist From ( input Lat , Ġinput Lon , Ġcandidate Lat , Ġcandidate Lon )) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ//} ĊĊĠĠĠĠĠĠĠ Ġ// build Ġa Ġsquare Ġif Ġpossible ĊĠĠĠĠĠĠĠ ĠLog . d (" Input Ġlimit State Points ", Ġ" Input Ġlongitude Ġis : Ġ"+ Ġinput Lon Ġ+ Ġ" ĠInput Ġlatitude Ġis :" Ġ+ Ġinput Lat ) ĊĠĠĠĠĠĠĠ Ġcandidates List . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidate Lon Ġ= ĠgetData For Node ( it . first , ĠCoordinate Database Parameters . LON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidate Lat Ġ= ĠgetData For Node ( it . first , ĠCoordinate Database Parameters . LAT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it . third ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( candidate NE Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate NE Ġ= ĠNe ighbours Node Data ( it . first , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Lon , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Lat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdist From ( input Lat , Ġinput Lon , Ġcandidate Lat , Ġcandidate Lon )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" N EN ode ", Ġcandidate NE . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( candidate SE Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate SE Ġ= ĠNe ighbours Node Data ( it . first , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Lon , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Lat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdist From ( input Lat , Ġinput Lon , Ġcandidate Lat , Ġcandidate Lon )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" S EN ode ", Ġcandidate SE . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( candidate SO Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate SO Ġ= ĠNe ighbours Node Data ( it . first , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Lon , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Lat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdist From ( input Lat , Ġinput Lon , Ġcandidate Lat , Ġcandidate Lon )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" SON ode ", Ġcandidate SO . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( candidate NO Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate NO Ġ= ĠNe ighbours Node Data ( it . first , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Lon , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Lat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdist From ( input Lat , Ġinput Lon , Ġcandidate Lat , Ġcandidate Lon )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" N Node ", Ġcandidate NO . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// can Ġinterpolate Ġon Ġ 3 Ġlimit State Points ĊĠĠĠĠĠĠĠ Ġvar Ġnull Counter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( candidate NE Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate NE Ġ= ĠNe ighbours Node Data . Invalid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Counter ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( candidate SE Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate SE Ġ= ĠNe ighbours Node Data . Invalid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Counter ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( candidate SO Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate SO Ġ= ĠNe ighbours Node Data . Invalid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Counter ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( candidate NO Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate NO Ġ= ĠNe ighbours Node Data . Invalid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Counter ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠNe ighbours Node Square ( candidate NE !! , Ġcandidate NO !! , Ġcandidate SO !! , Ġcandidate SE !! , Ġnull Counter Ġ== Ġ 0 Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetData For Node ( nodeId Ġ: ĠString , Ġparam Ġ: ĠCoordinate Database Parameters ) Ġ: ĠDouble ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Map [ nodeId ] ! ![ param . ordinal ]. toDouble () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinner Get Closest Point ( x : ĠDouble , Ġy : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft : ĠBoolean , ĠĠĠ Ġ// direction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Distance : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp List : ĠMutable List < Triple < String , ĠDouble , ĠInt >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel : ĠInt ) Ġ: ĠList < Triple < String , ĠDouble , ĠInt >> ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġinner Index Ġ= Ġindex ĊĠĠĠĠĠĠĠ Ġif Ġ( inner Index Ġ< Ġ 0 Ġ|| Ġinner Index Ġ>= Ġm Coordinate Array . size ) Ġreturn Ġtmp List ĊĊĠĠĠĠĠĠĠ Ġif Ġ( level Ġ> Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Level ", Ġ" Max Ġdepth Ġreached Ġ" Ġ+ Ġlevel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtmp List ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . d (" Distance ", Ġ" Limit Ġdistance Ġis : Ġ" Ġ+ Ġlimit Distance ) ĊĊĠĠĠĠĠĠĠ Ġ// Stopping Ġcondition , Ġthe Ġdistance Ġof Ġthe Ġnext Ġpoint Ġfrom Ġinput Ġpoint Ġis Ġgreater Ġthan Ġsum Ġof Ġdistances Ġof Ġ 4 Ġclosest Ġlimit State Points ĊĠĠĠĠĠĠĠ Ġval Ġdist _ quadr ant _ pair Ġ= Ġcal ulate Distance ( x Ġto Ġy , Ġm Coordinate Array [ inner Index ]. second Ġto Ġm Coordinate Array [ inner Index ]. third ) ĊĠĠĠĠĠĠĠ ĠLog . d (" Distance ", Ġ" Distance Ġis Ġ" Ġ+ Ġdist _ quadr ant _ pair . first Ġ+ Ġ" Ġand Ġquadr ant Ġis Ġ" Ġ+ Ġdist _ quadr ant _ pair . second ) ĊĠĠĠĠĠĠĠ Ġif Ġ( dist _ quadr ant _ pair . first Ġ>= Ġlimit Distance ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtmp List ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Consider Ġall Ġvery Ġclose Ġ( on Ġx ) Ġlimit State Points ĊĠĠĠĠĠĠĠ Ġwhile Ġ( Math . abs ( x Ġ- Ġm Coordinate Array [ inner Index ]. second ) Ġ<= ĠS EN SI B ILITY ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// add Ġpoint Ġid Ġwith Ġclose Ġdistance Ġfrom Ġinput Ġpoint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtriple For Point Ġ= Ġcal ulate Distance ( x Ġto Ġy , Ġm Coordinate Array [ inner Index ]. second Ġto Ġm Coordinate Array [ inner Index ]. third ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= ĠTrip le ( m Coordinate Array [ inner Index ]. first , Ġtriple For Point . first , Ġtriple For Point . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp List . add ( point ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Inner List ", Ġ" Adding Ġ" Ġ+ Ġpoint . toString () Ġ+ Ġ" Ġleft Ġis : Ġ" Ġ+ Ġleft ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left ) Ġinner Index -- Ġelse Ġinner Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inner Index Ġ< Ġ 0 Ġ|| Ġinner Index Ġ>= Ġm Coordinate Array . size ) Ġreturn Ġtmp List ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// I Ġjust Ġwant Ġ 4 Ġlimit State Points , Ġthe Ġone Ġwith Ġthe Ġminimum Ġdistance ĊĠĠĠĠĠĠĠ Ġtmp List . sortBy Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsmaller List Ġ= Ġif Ġ( tmp List . size Ġ> Ġ 3 ) Ġtmp List . sub List ( 0 , Ġ 4 ) Ġelse Ġtmp List Ġ// inclusive Ġfrom Ġexclusive Ġto ĊĠĠĠĠĠĠĠ ĠLog . d (" Small er List ", Ġ" Reduc ed Ġlist Ġis : Ġ" Ġ+ Ġsmaller List . toString ()) ĊĊĠĠĠĠĠĠĠ Ġ// pass Ġto Ġrecursion : Ġinput Ġpoint , Ġnew Ġindex , Ġnew Ġsum , Ġnew Ġlimit State Points ĊĠĠĠĠĠĠĠ Ġreturn Ġinner Get Closest Point ( x , Ġy , Ġleft , Ġinner Index , Ġsmaller List . sum By Double Ġ{ Ġit . second Ġ}, Ġsmaller List , Ġlevel + 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcal ulate Distance ( pair 1 Ġ: ĠPair < Double , ĠDouble >, Ġpair 2 Ġ: ĠPair < Double , ĠDouble >) Ġ: ĠPair < Double , ĠInt > ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// db Ġprecision Ġis Ġ 3 Ġdecimal , Ġwe Ġcheck Ġ 4 ĊĠĠĠĠĠĠĠ ĠLog . d (" Distance ", Ġ" Distance Ġof Ġ" Ġ+ Ġpair 1 . first Ġ+ Ġ" Ġfrom Ġ" Ġ+ Ġpair 2 . first Ġ+ Ġ" Ġand Ġ" Ġ+ Ġpair 1 . second Ġ+ Ġ" Ġfrom Ġ" Ġ+ Ġpair 2 . second ) ĊĠĠĠĠĠĠĠ Ġ// val Ġx Diff Ġ= ĠBigDecimal ( pair 1 . first Ġ- Ġpair 2 . first ). set Scale ( 4 , ĠBigDecimal . ROUND _ DOWN ); ĊĠĠĠĠĠĠĠ Ġ// val Ġy Diff Ġ= ĠBigDecimal ( pair 1 . second Ġ- Ġpair 2 . second ). set Scale ( 4 , ĠBigDecimal . ROUND _ DOWN ); ĊĠĠĠĠĠĠĠ Ġ// val Ġzero Ġ= ĠBigDecimal ( 0 ). set Scale ( 4 , ĠBigDecimal . ROUND _ DOWN ); ĊĠĠĠĠĠĠĠ Ġ// val Ġdist X Ġ= ĠMath . abs ( x Diff . toDouble ()) ĊĠĠĠĠĠĠĠ Ġ// val Ġdist Y Ġ= ĠMath . abs ( y Diff . toDouble ()) ĊĠĠĠĠĠĠĠ Ġval Ġx Diff Ġ= Ġpair 1 . first Ġ- Ġpair 2 . first ĊĠĠĠĠĠĠĠ Ġval Ġy Diff Ġ= Ġpair 1 . second Ġ- Ġpair 2 . second ĊĠĠĠĠĠĠĠ Ġval Ġzero Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġdist X Ġ= ĠMath . abs ( x Diff ) ĊĠĠĠĠĠĠĠ Ġval Ġdist Y Ġ= ĠMath . abs ( y Diff ) ĊĠĠĠĠĠĠĠ Ġ// distance Ġand Ġquadr ant ĊĠĠĠĠĠĠĠ Ġvar Ġquad Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( x Diff Ġ>= Ġzero Ġ&& Ġy Diff Ġ>= Ġzero ) Ġquad Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( x Diff Ġ<= Ġzero Ġ&& Ġy Diff Ġ>= Ġzero ) Ġquad Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( x Diff Ġ<= Ġzero Ġ&& Ġy Diff Ġ<= Ġzero ) Ġquad Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( x Diff Ġ>= Ġzero Ġ&& Ġy Diff Ġ<= Ġzero ) Ġquad Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġ// ( x Diff ) Ġshr Ġ 3 1 Ġor Ġ((( y Diff ) Ġshr Ġ 3 0 ) Ġand Ġ 0 x 2 ) ĊĠĠĠĠĠĠĠ Ġ// works Ġfor Ġint .. ĊĠĠĠĠĠĠĠ Ġ// y Ġ= Ġy >> 3 1 ; ĊĠĠĠĠĠĠĠ Ġ// return Ġ(( x >> 3 1 ) Ġ^ Ġy ) Ġ+ Ġy Ġ+ Ġy Ġ+ Ġ 1 ; ĊĠĠĠĠĠĠĠ Ġreturn ĠMath . sqrt ( dist X * dist X Ġ+ Ġdist Y * dist Y ) Ġto Ġquad ĊĠĠĠ Ġ} Ċ }