/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 2 1 ĠE no ve a Ġ( fab ien . me ur isse @ en ove a . net ) Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġdil iv ia . s 2 . coords Ċ Ċ import Ġdil iv ia . math . M _ 1 _ PI Ċ import Ġdil iv ia . math . M _ PI Ċ import Ġdil iv ia . math . M _ PI _ 2 Ċ import Ġdil iv ia . math . M _ PI _ 4 Ċ import Ġorg . apache . commons . math 3 . util . Fast Math . atan Ċ import Ġorg . apache . commons . math 3 . util . Fast Math . sqrt Ċ import Ġorg . apache . commons . math 3 . util . Fast Math . tan Ċ Ċ /** Ċ Ġ* ĠS 2 Ġtang ente Ġprojection Ċ Ġ* Ċ Ġ* ĠTransform ing Ġthe Ġcoordinates Ġvia Ġatan () Ġmakes Ġthe Ġcell Ġsizes Ġmore Ġuniform . ĠThe Ġareas Ġvary Ġby Ġa Ġmaximum Ġratio Ġof Ġ 1 . 4 Ċ Ġ* Ġas Ġopposed Ġto Ġa Ġmaximum Ġratio Ġof Ġ 5 . 2 . ĠHowever , Ġeach Ġcall Ġto Ġatan () Ġis Ġabout Ġas Ġexpensive Ġas Ġall Ġof Ġthe Ġother Ċ Ġ* Ġcalculations Ġcombined Ġwhen Ġconverting Ġfrom Ġpoints Ġto Ġcell Ġids , Ġi . e . Ġit Ġreduces Ġperformance Ġby Ġa Ġfactor Ġof Ġ 3 . Ċ Ġ* Ċ Ġ* ĠThis Ġclass Ġis Ġa Ġport Ġof Ġs 2 coords Ġand Ġs 2 metrics Ġof Ġthe ĠGoogle ĠS 2 ĠGeometry Ġproject Ċ Ġ* Ġ( https :// github . com / google / s 2 geometry ). Ċ Ġ* Ċ Ġ* Ġ@ author ĠF ab ien ĠMe ur isse Ġ< fab ien . me ur isse @ en ove a . net > Ċ Ġ* Ġ@ since Ġ 1 . 0 Ċ Ġ*/ Ċ object ĠS 2 Tan Projection Ġ: ĠS 2 Projection Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġst To Uv ( s : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUnfortunately , Ġtan ( M _ PI _ 4 ) Ġis Ġslightly Ġless Ġthan Ġ 1 . 0 . Ġ ĠThis Ġisn 't Ġdue Ġto Ġa Ġfl aw Ġin Ġthe Ġimplementation Ġof ĊĠĠĠĠĠĠĠ Ġ// Ġtan (), Ġit 's Ġbecause Ġthe Ġderivative Ġof Ġtan ( x ) Ġat Ġx = pi / 4 Ġis Ġ 2 , Ġand Ġit Ġhappens Ġthat Ġthe Ġtwo Ġadjacent Ġfloating ĊĠĠĠĠĠĠĠ Ġ// Ġpoint Ġnumbers Ġon Ġeither Ġside Ġof Ġthe Ġinfinite - precision Ġvalue Ġof Ġpi / 4 Ġhave Ġtang ents Ġthat Ġare Ġslightly Ġbelow ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġslightly Ġabove Ġ 1 . 0 Ġwhen Ġrounded Ġto Ġthe Ġnearest Ġdouble - precision Ġresult . ĊĊĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġtan ( M _ PI _ 2 Ġ* Ġs Ġ- ĠM _ PI _ 4 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġt Ġ+ Ġ( 1 . 0 Ġ/ Ġ( 1 L Ġshl Ġ 5 3 )) Ġ* Ġt ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġuv To St ( u : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġatan ( u ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ( 2 Ġ* ĠM _ 1 _ PI ) Ġ* Ġ( a Ġ+ ĠM _ PI _ 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġk Min Angle Span : ĠLength Metric Ġ= ĠLength Metric ( M _ PI Ġ/ Ġ 2 ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . 5 7 1 ĊĠĠĠ Ġoverride Ġval Ġk Max Angle Span : ĠLength Metric Ġ= ĠLength Metric ( M _ PI Ġ/ Ġ 2 ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . 5 7 1 ĊĠĠĠ Ġoverride Ġval Ġk Avg Angle Span : ĠLength Metric Ġ= ĠLength Metric ( M _ PI Ġ/ Ġ 2 ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . 5 7 1 ĊĊĠĠĠ Ġoverride Ġval Ġk Min Width : ĠLength Metric Ġ= ĠLength Metric ( M _ PI Ġ/ Ġ( 2 Ġ* Ġsqrt ( 2 . 0 ))) ĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . 1 1 1 ĊĠĠĠ Ġoverride Ġval Ġk Max Width : ĠLength Metric Ġ= ĠLength Metric ( k Max Angle Span . deriv ) ĊĠĠĠ Ġoverride Ġval Ġk Avg Width : ĠLength Metric Ġ= ĠLength Metric ( 1 . 4 3 7 3 1 8 6 3 8 9 2 5 1 6 0 8 8 5 ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . 4 3 7 ĊĊĠĠĠ Ġoverride Ġval Ġk Min Edge : ĠLength Metric Ġ= ĠLength Metric ( M _ PI Ġ/ Ġ( 2 Ġ* Ġsqrt ( 2 . 0 ))) ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . 1 1 1 ĊĠĠĠ Ġoverride Ġval Ġk Max Edge : ĠLength Metric Ġ= ĠLength Metric ( k Max Angle Span . deriv ) ĊĠĠĠ Ġoverride Ġval Ġk Avg Edge : ĠLength Metric Ġ= ĠLength Metric ( 1 . 4 6 1 6 6 7 0 3 2 5 4 6 7 3 9 2 6 6 ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . 4 6 2 ĊĊĠĠĠ Ġoverride Ġval Ġk Min Diag : ĠLength Metric Ġ= ĠLength Metric ( M _ PI Ġ* Ġsqrt ( 2 . 0 ) Ġ/ Ġ 3 ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . 4 8 1 ĊĠĠĠ Ġoverride Ġval Ġk Max Diag : ĠLength Metric Ġ= ĠLength Metric ( M _ PI Ġ* Ġsqrt ( 2 . 0 Ġ/ Ġ 3 . 0 )) ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 . 5 6 5 ĊĠĠĠ Ġoverride Ġval Ġk Avg Diag : ĠLength Metric Ġ= ĠLength Metric ( 2 . 0 6 3 6 2 3 1 9 7 1 9 5 6 3 5 7 5 3 ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 . 0 6 4 ĊĊĠĠĠ Ġoverride Ġval Ġk Min Area : ĠArea Metric Ġ= ĠArea Metric (( M _ PI Ġ* ĠM _ PI ) Ġ/ Ġ( 4 . 0 Ġ* Ġsqrt ( 2 . 0 ))) ĠĠĠĠĠ Ġ// Ġ 1 . 7 4 5 ĊĠĠĠ Ġoverride Ġval Ġk Max Area : ĠArea Metric Ġ= ĠArea Metric ( M _ PI Ġ* ĠM _ PI Ġ/ Ġ 4 . 0 ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 . 4 6 7 ĊĠĠĠ Ġoverride Ġval Ġk Avg Area : ĠArea Metric Ġ= ĠArea Metric ( 4 Ġ* ĠM _ PI Ġ/ Ġ 6 ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 . 0 9 4 ĊĊĠĠĠ Ġoverride Ġval Ġk Max Edge Aspect : ĠDouble Ġ= Ġsqrt ( 2 . 0 ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . 4 1 4 ĊĠĠĠ Ġoverride Ġval Ġk Max Diag Aspect : ĠDouble Ġ= Ġsqrt ( 3 . 0 ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . 7 3 2 Ċ Ċ } Ċ