package Ġcom . web add ict ed . kotlin project . global . car anim Ċ Ċ import Ġcom . google . android . gms . maps . Google Map Ċ import Ġcom . google . android . gms . maps . model . LatLng Ċ import Ġkotlin . math . atan 2 Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . sin Ċ Ċ object ĠCar Animation Utils Ġ{ ĊĠĠĠ Ġfun Ġis Marker Visible ( google Map : ĠGoogle Map , Ġnew Location : ĠLat Lng ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgoogle Map . projection . visible Region . lat Lng Bounds . contains ( new Location ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbe aring Between Locations ( lat Lng 1 : ĠLat Lng , Ġlat Lng 2 : ĠLat Lng ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠPI Ġ= Ġ 3 . 1 4 1 5 9 ĊĠĠĠĠĠĠĠ Ġval Ġlat 1 Ġ= Ġlat Lng 1 . latitude Ġ* ĠPI Ġ/ Ġ 1 8 0 ĊĠĠĠĠĠĠĠ Ġval Ġlong 1 Ġ= Ġlat Lng 1 . longitude Ġ* ĠPI Ġ/ Ġ 1 8 0 ĊĠĠĠĠĠĠĠ Ġval Ġlat 2 Ġ= Ġlat Lng 2 . latitude Ġ* ĠPI Ġ/ Ġ 1 8 0 ĊĠĠĠĠĠĠĠ Ġval Ġlong 2 Ġ= Ġlat Lng 2 . longitude Ġ* ĠPI Ġ/ Ġ 1 8 0 ĊĠĠĠĠĠĠĠ Ġval Ġd Lon Ġ= Ġlong 2 Ġ- Ġlong 1 ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġsin ( d Lon ) Ġ* Ġcos ( lat 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcos ( lat 1 ) Ġ* Ġsin ( lat 2 ) Ġ- Ġ( sin ( lat 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġcos ( lat 2 ) Ġ* Ġcos ( d Lon )) ĊĠĠĠĠĠĠĠ Ġvar Ġbr ng Ġ= Ġatan 2 ( y , Ġx ) ĊĠĠĠĠĠĠĠ Ġbr ng Ġ= ĠMath . to Degrees ( br ng ) ĊĠĠĠĠĠĠĠ Ġbr ng Ġ= Ġ( br ng Ġ+ Ġ 3 6 0 ) Ġ% Ġ 3 6 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġbr ng ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcompute Rotation ( ĊĠĠĠĠĠĠĠ Ġfraction : ĠFloat , ĊĠĠĠĠĠĠĠ Ġstart : ĠFloat , ĊĠĠĠĠĠĠĠ Ġend : ĠFloat ĊĠĠĠ Ġ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnormalize End Ġ= Ġend Ġ- Ġstart Ġ// Ġrotate Ġstart Ġto Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġnormalized End Abs Ġ= Ġ( normalize End Ġ+ Ġ 3 6 0 ) Ġ% Ġ 3 6 0 ĊĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( normalized End Abs Ġ> Ġ 1 8 0 ) Ġ(- 1 ). toFloat () Ġelse Ġ 1 . toFloat () Ġ// Ġ- 1 Ġ= Ġant ic lock wise , Ġ 1 Ġ= Ġclock wise ĊĠĠĠĠĠĠĠ Ġval Ġrotation : ĠFloat ĊĠĠĠĠĠĠĠ Ġrotation Ġ= Ġif Ġ( direction Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormalized End Abs ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormalized End Abs Ġ- Ġ 3 6 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġfraction Ġ* Ġrotation Ġ+ Ġstart ĊĠĠĠĠĠĠĠ Ġreturn Ġ( result Ġ+ Ġ 3 6 0 ) Ġ% Ġ 3 6 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠLat Lng Interpolator Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġinterpolate ( fraction : ĠFloat , Ġa : ĠLat Lng ?, Ġb : ĠLat Lng ?): ĠLat Lng ? ĊĠĠĠĠĠĠĠ Ġclass ĠLinear Fixed Ġ: ĠLat Lng Interpolator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinterpolate ( fraction : ĠFloat , Ġa : ĠLat Lng ?, Ġb : ĠLat Lng ?): ĠLat Lng Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlat Ġ= Ġ( b ?. latitude !! Ġ- Ġa ?. latitude !! ) Ġ* Ġfraction Ġ+ Ġa . latitude ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlng Delta Ġ= Ġb . longitude Ġ- Ġa . longitude ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTake Ġthe Ġshortest Ġpath Ġacross Ġthe Ġ 1 8 0 th Ġmer id ian . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Math . abs ( lng Delta ) Ġ> Ġ 1 8 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlng Delta Ġ-= ĠMath . sign um ( lng Delta ) Ġ* Ġ 3 6 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlng Ġ= Ġlng Delta Ġ* Ġfraction Ġ+ Ġa . longitude ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLat Lng ( lat , Ġlng ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ