/* Ċ Ġ* Ġ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 . index Ċ Ċ import Ġdil iv ia . s 2 . S 1 Angle Ċ import Ġdil iv ia . s 2 . S 1 Ch ord Angle Ċ import Ġdil iv ia . s 2 . S 2 Point Ċ import Ġdil iv ia . s 2 . edge . S 2 Edge Dist ances Ċ import Ġdil iv ia . s 2 . index . shape . S 2 Shape Index Ċ import Ġdil iv ia . s 2 . region . S 2 Cap Ċ import Ġdil iv ia . s 2 . region . S 2 Cell Ċ import Ġorg . apache . commons . math 3 . util . Fast Math . sqrt ĊĊ Ċ class ĠS 2 F ur the st Edge Query ( val Ġindex : ĠS 2 Shape Index ) Ċ Ċ // ĠS 2 Max Distance Ġis Ġa Ġclass Ġthat Ġallows Ġmaximum Ġdistances Ġto Ġbe Ġcomputed Ġusing Ċ // Ġa Ġminimum Ġdistance Ġalgorithm . Ġ ĠSpecific ally , ĠS 2 Max Distance ( x ) Ġrepresents Ġthe Ċ // Ġsupp lement ary Ġdistance Ġ( Pi Ġ- Ġx ). Ġ ĠThis Ġhas Ġthe Ġeffect Ġof Ġin verting Ġthe Ġsort Ċ // Ġorder , Ġi . e . Ċ // Ċ // Ġ Ġ( S 2 Max Distance ( x ) Ġ< ĠS 2 Max Distance ( y )) Ġ Ġ< => Ġ Ġ( Pi Ġ- Ġx Ġ< ĠPi Ġ- Ġy ) Ġ Ġ< => Ġ Ġ( x Ġ> Ġy ) Ċ // Ċ // ĠAll Ġother Ġoperations Ġare Ġimplemented Ġsimilar ly Ġ( using Ġthe Ġsupp lement ary Ċ // Ġdistance ĠPi Ġ- Ġx ). Ġ ĠFor Ġexample , ĠS 2 Max Distance ( x ) Ġ- ĠS 2 Max Distance ( y ) Ġ== Ċ // ĠS 2 Max Distance ( x Ġ+ Ġy ). Ċ class ĠS 2 Max Distance Ġconstructor ( distance : ĠS 1 Ch ord Angle ) Ġ: ĠDistance < S 2 Max Distance > Ġ{ ĊĊĠĠĠ Ġval Ġvalue : ĠS 1 Ch ord Angle Ġ= Ġdistance . clone () ĊĊĠĠĠ Ġconstructor () Ġ: Ġthis ( S 1 Ch ord Angle . zero ()) ĊĠĠĠ Ġconstructor ( x : ĠS 1 Angle ) Ġ: Ġthis ( S 1 Ch ord Angle ( S 1 Ch ord Angle ( x ). length 2 )) ĊĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠS 2 Max Distance ): ĠInt Ġ= Ġ- value . compareTo ( other . value ) ĊĠĠĠ Ġoverride Ġoperator Ġfun Ġminus ( delta : ĠDelta ): ĠS 2 Max Distance Ġ= ĠS 2 Max Distance ( value Ġ+ Ġdelta ) ĊĠĠĠ Ġoverride Ġfun Ġget Ch ord Angle Bound (): ĠS 1 Ch ord Angle Ġ= ĠS 1 Ch ord Angle . stra ight () Ġ- Ġvalue ĊĊĠĠĠ Ġ// ĠIf Ġ( dist Ġ< Ġ* this ), Ġupdates Ġ* this Ġand Ġreturns Ġtrue Ġ( used Ġinternally ). ĊĠĠĠ Ġfun Ġupdate Min ( dist : ĠS 2 Max Distance ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( dist Ġ< Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value . length 2 Ġ= Ġdist . value . length 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclone (): ĠS 2 Max Distance Ġ= ĠS 2 Max Distance ( value ) Ċ Ċ } Ċ Ċ object ĠS 2 Max Distance Factory Ġ: ĠDistance Factory < S 2 Max Distance > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġdistance ( length 2 : ĠDouble ): ĠS 2 Max Distance Ġ= ĠS 2 Max Distance ( S 1 Ch ord Angle . from Length 2 ( length 2 )) ĊĊĠĠĠ Ġoverride Ġfun Ġdistance ( other : ĠS 2 Max Distance ): ĠS 2 Max Distance Ġ= ĠS 2 Max Distance ( other . value ) ĊĊĠĠĠ Ġoverride Ġfun Ġzero (): ĠS 2 Max Distance Ġ= ĠS 2 Max Distance ( S 1 Ch ord Angle . stra ight ()) ĊĊĠĠĠ Ġoverride Ġfun Ġinfinity (): ĠS 2 Max Distance Ġ= ĠS 2 Max Distance ( S 1 Ch ord Angle . negative ()) ĊĊĠĠĠ Ġoverride Ġfun Ġnegative (): ĠS 2 Max Distance Ġ= ĠS 2 Max Distance ( S 1 Ch ord Angle . infinity ()) Ċ Ċ } Ċ Ċ // ĠS 2 Max Distance Target Ġrepresents Ġa Ġge ometric Ġobject Ġto Ġwhich Ġmaximum Ġdistances Ċ // Ġon Ġthe Ġsphere Ġare Ġmeasured . Ċ // Ċ // ĠSub types Ġare Ġdefined Ġbelow Ġfor Ġmeas uring Ġthe Ġdistance Ġto Ġa Ġpoint , Ġan Ġedge , Ċ // Ġan ĠS 2 Cell , Ġor Ġan ĠS 2 Shape Index Ġ( an Ġarbitrary Ġcollection Ġof Ġgeometry ). Ċ type alias ĠS 2 Max Distance Target Ġ= ĠS 2 Distance Target < S 2 Max Distance > Ċ Ċ // ĠAn ĠS 2 Distance Target Ġsubtype Ġfor Ġcomputing Ġthe Ġmaximum Ġdistance Ġto Ġa Ġpoint . Ċ open Ġclass ĠS 2 Max Distance Point Target ( val Ġpoint : ĠS 2 Point ) Ġ: ĠS 2 Max Distance Target Ġ{ ĊĊĠĠĠ Ġ// ĠThis Ġmethod Ġreturns Ġan ĠS 2 Cap Ġthat Ġbounds Ġthe Ġan tip ode Ġof Ġthe Ġtarget . Ġ Ġ( This ĊĠĠĠ Ġ// Ġis Ġthe Ġset Ġof Ġpoints Ġwhose ĠS 2 Max Distance Ġto Ġthe Ġtarget Ġis ĊĠĠĠ Ġ// ĠS 2 Max Distance :: Zero (). ) ĊĠĠĠ Ġoverride Ġfun Ġget Cap Bound (): ĠS 2 Cap Ġ= ĠS 2 Cap (- point , ĠS 1 Ch ord Angle . zero ()) ĊĊĠĠĠ Ġoverride Ġfun Ġdistance ( p : ĠS 2 Point ): ĠS 2 Max Distance Ġ= ĠS 2 Max Distance ( S 1 Ch ord Angle . between ( p , Ġpoint )) ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Min Distance ( p : ĠS 2 Point , Ġmin Dist : ĠS 2 Max Distance ): ĠBoolean Ġ= Ġmin Dist . update Min ( distance ( p )) ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Min Distance ( v 0 : ĠS 2 Point , Ġv 1 : ĠS 2 Point , Ġmin Dist : ĠS 2 Max Distance ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdist Ġ= ĠS 1 Ch ord Angle ( min Dist . value ) ĊĠĠĠĠĠĠĠ Ġif Ġ( S 2 Edge Dist ances . update Max Distance ( point , Ġv 0 , Ġv 1 , Ġdist )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Dist . update Min ( S 2 Max Distance ( dist )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Min Distance ( cell : ĠS 2 Cell , Ġmin Dist : ĠS 2 Max Distance ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmin Dist . update Min ( S 2 Max Distance ( cell . getMax Distance ( point ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Containing Shapes ( query Index : ĠS 2 Shape Index , Ġvisitor : ĠS 2 Distance Target . Shape Visitor ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġf ur the st Ġpoints , Ġwe Ġvisit Ġthe Ġpoly gons Ġwhose Ġinterior Ġcontains Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġan tip ode Ġof Ġthe Ġtarget Ġpoint . Ġ Ġ( These Ġare Ġthe Ġpoly gons Ġwhose ĊĠĠĠĠĠĠĠ Ġ// ĠS 2 Max Distance Ġto Ġthe Ġtarget Ġis ĠS 2 Max Distance :: Zero (). ) ĊĠĠĠĠĠĠĠ ĠTODO () Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġmake S 2 Contains Point Query ( query _ index ). visit Containing Shapes (- point , Ġ[ this , Ġ& visitor ]( S 2 Shape * Ġshape ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvisitor ( shape , Ġpoint _); Ċ // ĠĠĠĠĠĠĠ Ġ}); ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ // ĠAn ĠS 2 Distance Target Ġsubtype Ġfor Ġcomputing Ġthe Ġmaximum Ġdistance Ġto Ġan Ġedge . Ċ class ĠS 2 Max Distance Edge Target ( a : ĠS 2 Point , Ġb : ĠS 2 Point ) Ġ: ĠS 2 Max Distance Target Ġ{ ĊĊĠĠĠ Ġval Ġa : ĠS 2 Point Ġ= Ġa . normalized () ĊĠĠĠ Ġval Ġb : ĠS 2 Point Ġ= Ġb . normalized () ĊĊĠĠĠ Ġoverride Ġfun Ġget Cap Bound (): ĠS 2 Cap Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġfollowing Ġcomputes Ġa Ġradius Ġequal Ġto Ġhalf Ġthe Ġedge Ġlength Ġin Ġan ĊĠĠĠĠĠĠĠ Ġ// Ġefficient Ġand Ġnumeric ally Ġstable Ġway . ĊĠĠĠĠĠĠĠ Ġval Ġd 2 Ġ= ĠS 1 Ch ord Angle . between ( a , Ġb ). length 2 ĊĠĠĠĠĠĠĠ Ġval Ġr 2 Ġ= Ġ( 0 . 5 Ġ* Ġd 2 ) Ġ/ Ġ( 1 Ġ+ Ġsqrt ( 1 Ġ- Ġ 0 . 2 5 Ġ* Ġd 2 )) ĊĠĠĠĠĠĠĠ Ġreturn ĠS 2 Cap (- ( a Ġ+ Ġb ). normalize (), ĠS 1 Ch ord Angle . from Length 2 ( r 2 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdistance ( p : ĠS 2 Point ): ĠS 2 Max Distance Ġ= ĠS 2 Max Distance ( S 2 Edge Dist ances . get Distance ( p , Ġa , Ġb )) ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Min Distance ( p : ĠS 2 Point , Ġmin Dist : ĠS 2 Max Distance ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdist Ġ= ĠS 1 Ch ord Angle ( min Dist . value ) ĊĠĠĠĠĠĠĠ Ġif Ġ( S 2 Edge Dist ances . update Max Distance ( p , Ġa , Ġb , Ġdist )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Dist . update Min ( S 2 Max Distance ( dist )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Min Distance ( v 0 : ĠS 2 Point , Ġv 1 : ĠS 2 Point , Ġmin Dist : ĠS 2 Max Distance ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdist Ġ= ĠS 1 Ch ord Angle ( min Dist . value ) ĊĠĠĠĠĠĠĠ Ġif Ġ( S 2 Edge Dist ances . update Edge Pair Max Distance ( a , Ġb , Ġv 0 , Ġv 1 , Ġdist )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Dist . update Min ( S 2 Max Distance ( dist )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Min Distance ( cell : ĠS 2 Cell , Ġmin Dist : ĠS 2 Max Distance ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmin Dist . update Min ( S 2 Max Distance ( cell . getMax Distance ( a , Ġb ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Containing Shapes ( query Index : ĠS 2 Shape Index , Ġvisitor : ĠS 2 Distance Target . Shape Visitor ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġonly Ġneed Ġto Ġtest Ġone Ġedge Ġpoint . Ġ ĠThat Ġis Ġbecause Ġthe Ġmethod Ġ* must * ĊĠĠĠĠĠĠĠ Ġ// Ġvisit Ġa Ġpolygon Ġif Ġit Ġfully Ġcontains Ġthe Ġtarget , Ġand Ġ* is Ġallowed * Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġvisit Ġa Ġpolygon Ġif Ġit Ġintersect s Ġthe Ġtarget . Ġ ĠIf Ġthe Ġtested Ġvertex Ġis Ġnot ĊĠĠĠĠĠĠĠ Ġ// Ġcontained , Ġwe Ġknow Ġthe Ġfull Ġedge Ġis Ġnot Ġcontained ; Ġif Ġthe Ġtested Ġvertex Ġis ĊĠĠĠĠĠĠĠ Ġ// Ġcontained , Ġthen Ġthe Ġedge Ġeither Ġis Ġfully Ġcontained Ġ( must Ġbe Ġvisited ) Ġor Ġit ĊĠĠĠĠĠĠĠ Ġ// Ġintersect s Ġ( is Ġallowed Ġto Ġbe Ġvisited ). Ġ ĠWe Ġvisit Ġthe Ġcenter Ġof Ġthe Ġedge Ġso ĊĠĠĠĠĠĠĠ Ġ// Ġthat Ġedge ĠAB Ġgives Ġidentical Ġresults Ġto ĠB A . ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠS 2 Max Distance Point Target (( a Ġ+ Ġb ). normalize ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġtarget . visit Containing Shapes ( query Index , Ġvisitor ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ // ĠAn ĠS 2 Distance Target Ġsubtype Ġfor Ġcomputing Ġthe Ġmaximum Ġdistance Ġto Ġan ĠS 2 Cell Ċ // Ġ( including Ġthe Ġinterior Ġof Ġthe Ġcell ). Ċ class ĠS 2 Max Distance Cell Target ( val Ġcell : ĠS 2 Cell ) Ġ: ĠS 2 Max Distance Target Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Cap Bound (): ĠS 2 Cap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcap Ġ= Ġcell . cap Bound ĊĠĠĠĠĠĠĠ Ġreturn ĠS 2 Cap (- cap . center , Ġcap . radius ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdistance ( p : ĠS 2 Point ): ĠS 2 Max Distance Ġ= ĠS 2 Max Distance ( cell . getMax Distance ( p )) ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Min Distance ( p : ĠS 2 Point , Ġmin Dist : ĠS 2 Max Distance ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmin Dist . update Min ( S 2 Max Distance ( cell . getMax Distance ( p ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Min Distance ( v 0 : ĠS 2 Point , Ġv 1 : ĠS 2 Point , Ġmin Dist : ĠS 2 Max Distance ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmin Dist . update Min ( S 2 Max Distance ( cell . getMax Distance ( v 0 , Ġv 1 ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Min Distance ( cell : ĠS 2 Cell , Ġmin Dist : ĠS 2 Max Distance ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmin Dist . update Min ( S 2 Max Distance ( cell . getMax Distance ( cell ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Containing Shapes ( query Index : ĠS 2 Shape Index , Ġvisitor : ĠS 2 Distance Target . Shape Visitor ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġonly Ġneed Ġto Ġcheck Ġone Ġpoint Ġhere Ġ- Ġcell Ġcenter Ġis Ġsimplest . ĊĠĠĠĠĠĠĠ Ġ// ĠSee Ġcomment Ġat ĠS 2 Max Distance Edge Target :: Visit Containing Shapes . ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠS 2 Max Distance Point Target ( cell . get Center ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġtarget . visit Containing Shapes ( query Index , Ġvisitor ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ // ĠAn ĠS 2 Distance Target Ġsubtype Ġfor Ġcomputing Ġthe Ġmaximum Ġdistance Ġto Ġan Ċ // ĠS 2 Shape Index Ġ( a Ġcollection Ġof Ġpoints , Ġpoly lines , Ġand / or Ġpoly gons ). Ċ // Ċ // ĠNote Ġthat ĠShape Index Target Ġhas Ġits Ġown Ġoptions : Ċ // Ċ // ĠĠ Ġinclude _ inter i ors () Ċ // ĠĠĠĠ Ġ- Ġspecifies Ġthat Ġdistances Ġare Ġmeasured Ġto Ġthe Ġboundary Ġand Ġinterior Ċ // ĠĠĠĠĠĠ Ġof Ġpoly gons Ġin Ġthe ĠS 2 Shape Index . Ġ Ġ( If Ġset Ġto Ġfalse , Ġdistance Ġis Ċ // ĠĠĠĠĠĠ Ġmeasured Ġto Ġthe Ġpolygon Ġboundary Ġonly .) Ċ // ĠĠĠĠĠĠ ĠDEFAULT : Ġtrue . Ċ // Ċ // ĠĠ Ġbr ute _ force () Ċ // ĠĠĠĠ Ġ- Ġspecifies Ġthat Ġthe Ġdistances Ġshould Ġbe Ġcomputed Ġby Ġex amin ing Ġevery Ċ // ĠĠĠĠĠĠ Ġedge Ġin Ġthe ĠS 2 Shape Index Ġ( for Ġtesting Ġand Ġdebugging Ġpurposes ). Ċ // ĠĠĠĠĠĠ ĠDEFAULT : Ġfalse . Ċ // Ċ // ĠThese Ġoptions Ġare Ġspecified Ġindependently Ġof Ġthe Ġcorresponding Ċ // ĠS 2 F ur the st Edge Query Ġoptions . Ġ ĠFor Ġexample , Ġif Ġinclude _ inter i ors Ġis Ġtrue Ġfor Ċ // Ġa ĠShape Index Target Ġbut Ġfalse Ġfor Ġthe ĠS 2 F ur the st Edge Query Ġwhere Ġthe Ġtarget Ċ // Ġis Ġused , Ġthen Ġdistances Ġwill Ġbe Ġmeasured Ġfrom Ġthe Ġboundary Ġof Ġone Ċ // ĠS 2 Shape Index Ġto Ġthe Ġboundary Ġand Ġinterior Ġof Ġthe Ġother . Ċ // Ċ class ĠS 2 Max Distance Shape Index Target ( val Ġindex : ĠS 2 Shape Index ) Ġ: ĠS 2 Max Distance Target Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġquery : ĠS 2 F ur the st Edge Query Ġ= ĠS 2 F ur the st Edge Query ( index ) ĊĊĊĠĠĠ Ġ// ĠSpecifies Ġthat Ġdistance Ġwill Ġbe Ġmeasured Ġto Ġthe Ġboundary Ġand Ġinterior ĊĠĠĠ Ġ// Ġof Ġpoly gons Ġin Ġthe ĠS 2 Shape Index Ġrather Ġthan Ġto Ġpolygon Ġboundaries Ġonly . ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠDEFAULT : Ġtrue ĊĠĠĠ Ġfun Ġinclude Inter i ors (): ĠBoolean Ġ= ĠTODO () ĊĠĠĠ Ġfun Ġset Include Inter i ors ( include Inter i ors : ĠBoolean ): ĠUnit Ġ= ĠTODO () ĊĊĠĠĠ Ġ// ĠSpecifies Ġthat Ġthe Ġdistances Ġshould Ġbe Ġcomputed Ġby Ġex amin ing Ġevery Ġedge ĊĠĠĠ Ġ// Ġin Ġthe ĠS 2 Shape Index Ġ( for Ġtesting Ġand Ġdebugging Ġpurposes ). ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠDEFAULT : Ġfalse ĊĠĠĠ Ġfun Ġuse Br ute Force (): ĠBoolean Ġ= ĠTODO () ĊĠĠĠ Ġfun Ġset Use Br ute Force ( use Br ute Force : ĠBoolean ): ĠUnit Ġ= ĠTODO () ĊĊĠĠĠ Ġoverride Ġfun Ġset Max Error ( max _ error : ĠDelta ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġmethod Ġreturns Ġan ĠS 2 Cap Ġthat Ġbounds Ġthe Ġan tip ode Ġof Ġthe Ġtarget . Ġ Ġ( This ĊĠĠĠ Ġ// Ġis Ġthe Ġset Ġof Ġpoints Ġwhose ĠS 2 Max Distance Ġto Ġthe Ġtarget Ġis ĊĠĠĠ Ġ// ĠS 2 Max Distance :: Zero (). ) ĊĠĠĠ Ġoverride Ġfun Ġget Cap Bound (): ĠS 2 Cap Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO () Ċ // ĠĠĠĠĠĠĠ Ġval Ġcap Ġ= Ġmake S 2 Shape Index Region ( index ). cap Bound Ċ // ĠĠĠĠĠĠĠ Ġreturn ĠS 2 Cap (- cap . center , Ġcap . radius ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdistance ( p : ĠS 2 Point ): ĠS 2 Max Distance Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Min Distance ( p : ĠS 2 Point , Ġmin Dist : ĠS 2 Max Distance ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Min Distance ( v 0 : ĠS 2 Point , Ġv 1 : ĠS 2 Point , Ġmin Dist : ĠS 2 Max Distance ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Min Distance ( cell : ĠS 2 Cell , Ġmin Dist : ĠS 2 Max Distance ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Containing Shapes ( query Index : ĠS 2 Shape Index , Ġvisitor : ĠS 2 Distance Target . Shape Visitor ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠ Ġ} Ċ Ċ } Ċ