package Ġcom . code vik ing . kx g . modules . glo be Ċ Ċ import Ġcom . code vik ing . kx g . math . clamp Ċ import Ġcom . code vik ing . kx g . math . to Deg Ċ import Ġcom . code vik ing . kx g . math . to Rad Ċ import Ġkotlin . math .* Ċ Ċ /** Ċ Ġ* ĠS li ppy Ġmap Ġt ilename Ġimplementation Ċ Ġ* Ġhttp :// wiki . openstreetmap . org / wiki / S li ppy _ map _ til ename s # Mat hematic s Ċ Ġ*/ Ċ open Ġclass ĠTile Name ( val Ġx : ĠInt , Ġval Ġy : ĠInt , Ġval Ġzoom : ĠInt ) Ġ{ ĊĊĠĠĠ Ġval Ġlat N : ĠDouble ĊĠĠĠ Ġval Ġlat S : ĠDouble ĊĠĠĠ Ġval Ġlon E : ĠDouble ĊĠĠĠ Ġval Ġlon W : ĠDouble ĊĊĠĠĠ Ġval Ġlat Center : ĠDouble ĊĠĠĠ Ġval Ġlon Center : ĠDouble ĊĊĠĠĠ Ġval Ġf used Key : ĠLong Ġ= Ġf ues d Key ( x , Ġy , Ġzoom ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġz p Ġ= Ġ( 1 Ġshl Ġzoom ) ĊĠĠĠĠĠĠĠ Ġlat S Ġ= Ġatan ( sin h ( PI Ġ- Ġ( y + 1 ). toDouble () Ġ/ Ġ( 1 Ġshl Ġzoom ) Ġ* Ġ 2 Ġ* ĠPI )). to Deg () ĊĠĠĠĠĠĠĠ Ġlon W Ġ= Ġ( x + 1 ). toDouble () Ġ/ Ġz p Ġ* Ġ 3 6 0 . 0 Ġ- Ġ 1 8 0 . 0 ĊĠĠĠĠĠĠĠ Ġlat N Ġ= Ġatan ( sin h ( PI Ġ- Ġy . toDouble () Ġ/ Ġ( 1 Ġshl Ġzoom ) Ġ* Ġ 2 Ġ* ĠPI )). to Deg () ĊĠĠĠĠĠĠĠ Ġlon E Ġ= Ġx . toDouble () Ġ/ Ġz p Ġ* Ġ 3 6 0 . 0 Ġ- Ġ 1 8 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġlat Center Ġ= Ġlat S Ġ+ Ġ( lat N Ġ- Ġlat S ) Ġ* Ġ 0 . 5 ĊĠĠĠĠĠĠĠ Ġlon Center Ġ= Ġlon E Ġ+ Ġ( lon W Ġ- Ġlon E ) Ġ* Ġ 0 . 5 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Sub Tile Of ( parent : ĠTile Name ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( parent . zoom Ġ> Ġzoom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproj X Ġ= Ġx Ġshr Ġ( zoom Ġ- Ġparent . zoom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproj Y Ġ= Ġy Ġshr Ġ( zoom Ġ- Ġparent . zoom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproj X Ġ== Ġparent . x Ġ&& Ġproj Y Ġ== Ġparent . y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ zoom /$ x /$ y " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠTile Name ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( f used Key Ġ!= Ġother . f used Key ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġf used Key . hashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfor Lat Lon ( lat : ĠDouble , Ġlon : ĠDouble , Ġzoom : ĠInt ): ĠTile Name Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlat Rad Ġ= Ġlat . to Rad () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz p Ġ= Ġ( 1 Ġshl Ġzoom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġ(( lon Ġ+ Ġ 1 8 0 . 0 ) Ġ/ Ġ 3 6 0 Ġ* Ġz p ). toInt (). clamp ( 0 , Ġz p - 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġ(( 1 Ġ- Ġln ( tan ( lat Rad ) Ġ+ Ġ 1 Ġ/ Ġcos ( lat Rad )) Ġ/ ĠPI )/ Ġ 2 Ġ* Ġz p ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. clamp ( 0 , Ġz p - 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTile Name ( x , Ġy , Ġzoom ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġf ues d Key ( tx : ĠInt , Ġty : ĠInt , Ġtz : ĠInt ): ĠLong Ġ= Ġ( tz . to Long () Ġshl Ġ 5 8 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( tx Ġand Ġ 0 x 1 fffffff ). to Long (). sh l ( 2 9 )) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ty Ġand Ġ 0 x 1 fffffff ). to Long () ĊĊĠĠĠĠĠĠĠ Ġfun Ġfrom F used Key ( f used Key : ĠLong ): ĠTile Name Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzoom Ġ= Ġ( f used Key Ġshr Ġ 5 8 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġ(( f used Key Ġshr Ġ 2 9 ) Ġand Ġ 0 x 1 fffffff ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġ( f used Key Ġand Ġ 0 x 1 fffffff ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTile Name ( x , Ġy , Ġzoom ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ