/* Ċ Ġ* Ġ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 . shape Ċ Ċ import Ġdil iv ia . Pre Conditions . require Argument Ċ import Ġdil iv ia . Pre Conditions . require EQ Ċ import Ġdil iv ia . Pre Conditions . require LT Ċ import Ġdil iv ia . s 2 . S 2 Point Ċ import Ġdil iv ia . s 2 . region . S 2 Loop Ċ import Ġorg . apache . commons . math 3 . util . Fast Math . min Ċ Ċ // Ċ // ĠThis Ġfile Ġdefines Ġvarious ĠS 2 Shape Ġtypes Ġrepresenting Ġloops : Ċ // Ċ // ĠS 2 L ax Loop Shape Ċ // ĠĠ Ġ- Ġlike ĠS 2 Loop :: Shape Ġbut Ġallows Ġduplicate Ġvertices Ġ& Ġedges , Ġmore Ġcompact Ċ // ĠĠĠĠ Ġrepresentation , Ġand Ġfaster Ġto Ġinitialize . Ċ // Ċ // ĠS 2 L ax Closed Polyline Shape Ċ // ĠĠ Ġ- Ġlike ĠS 2 L ax Loop Shape , Ġbut Ġdefines Ġa Ġloop Ġthat Ġdoes Ġnot Ġhave Ġan Ġinterior Ċ // ĠĠĠĠ Ġ( a Ġclosed Ġpoly line ). Ċ // Ċ // ĠS 2 Vertex Id L ax Loop Shape Ċ // ĠĠ Ġ- Ġlike ĠS 2 L ax Loop Shape , Ġbut Ġvertices Ġare Ġspecified Ġas Ġindices Ġinto Ġan Ċ // ĠĠĠĠ Ġexisting Ġvertex Ġarray . ĊĊ Ċ // ĠS 2 L ax Loop Shape Ġrepresents Ġa Ġclosed Ġloop Ġof Ġedges Ġsurrounding Ġan Ġinterior Ċ // Ġregion . Ġ ĠIt Ġis Ġsimilar Ġto ĠS 2 Loop :: Shape Ġexcept Ġthat Ġthis Ġclass Ġallows Ċ // Ġduplicate Ġvertices Ġand Ġedges . Ġ ĠLo ops Ġmay Ġhave Ġany Ġnumber Ġof Ġvertices , Ċ // Ġincluding Ġ 0 , Ġ 1 , Ġor Ġ 2 . Ġ Ġ( A Ġone - vertex Ġloop Ġdefines Ġa Ġde generate Ġedge Ċ // Ġconsisting Ġof Ġa Ġsingle Ġpoint .) Ċ // Ċ // ĠNote Ġthat ĠS 2 L ax Loop Shape Ġis Ġfaster Ġto Ġinitialize Ġand Ġmore Ġcompact Ġthan Ċ // ĠS 2 Loop :: Shape , Ġbut Ġdoes Ġnot Ġsupport Ġthe Ġsame Ġoperations Ġas ĠS 2 Loop . Ċ open Ġclass ĠS 2 L ax Loop Shape Ġ: ĠS 2 Shape Ġ{ ĊĊĠĠĠ Ġ// ĠFor Ġclients Ġthat Ġhave Ġmany Ġsmall Ġloops , Ġwe Ġsave Ġsome Ġmemory Ġby ĊĠĠĠ Ġ// Ġrepresenting Ġthe Ġvertices Ġas Ġan Ġarray Ġrather Ġthan Ġusing Ġstd :: vector . ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġvertices : ĠArray < S 2 Point > ĊĊĠĠĠ Ġ// ĠConstructs Ġan Ġempty Ġloop . ĊĠĠĠ Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġvertices Ġ= Ġempty Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠConstructs Ġan ĠS 2 L ax Loop Shape Ġwith Ġthe Ġgiven Ġvertices . ĊĠĠĠ Ġconstructor ( vertices : ĠList < S 2 Point >) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( vertices ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠConstructs Ġan ĠS 2 L ax Loop Shape Ġfrom Ġthe Ġgiven ĠS 2 Loop , Ġby Ġcopying Ġits Ġdata . ĊĠĠĠ Ġconstructor ( loop : ĠS 2 Loop ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( loop ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠInitializes Ġan ĠS 2 L ax Loop Shape Ġwith Ġthe Ġgiven Ġvertices . ĊĠĠĠ Ġfun Ġinit ( vertices : ĠList < S 2 Point >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . vertices Ġ= Ġvertices . to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠInitializes Ġan ĠS 2 L ax Loop Shape Ġfrom Ġthe Ġgiven ĠS 2 Loop , Ġby Ġcopying Ġits Ġdata . ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠREQ UIRES : Ġ! loop -> is _ full () ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠ Ġ[ Use ĠS 2 L ax Polygon Shape Ġif Ġyou Ġneed Ġto Ġrepresent Ġa Ġfull Ġloop .] ĊĠĠĠ Ġfun Ġinit ( loop : ĠS 2 Loop ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Argument ({ Ġ! loop . is Full () Ġ}, Ġ{ Ġ" Full Ġloops Ġnot Ġsupported ; Ġuse ĠS 2 L ax Polygon Shape " Ġ}) ĊĠĠĠĠĠĠĠ Ġif Ġ( loop . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertices Ġ= Ġempty Array () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertices Ġ= Ġloop . vertices Span (). points . to Typed Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnum Vertices (): ĠInt Ġ= Ġvertices . size ĊĠĠĠ Ġfun Ġvertex ( i : ĠInt ): ĠS 2 Point Ġ= Ġvertices [ i ] ĊĊĠĠĠ Ġoverride Ġval Ġnum Edges : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġnum Vertices () ĊĊĠĠĠ Ġoverride Ġfun Ġedge ( edge Id : ĠInt ): ĠEdge Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire LT ( edge Id , Ġnum Edges ) ĊĠĠĠĠĠĠĠ Ġvar Ġe Ġ= Ġedge Id Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( e Ġ== Ġnum Vertices ()) Ġe Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn ĠEdge ( vertices [ edge Id ], Ġvertices [ e ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġdimension : ĠInt Ġ= Ġ 2 ĊĊĠĠĠ Ġoverride Ġfun Ġget Reference Point (): ĠReference Point Ġ= ĠS 2 Shape . getReference Point ( this ) ĊĊĠĠĠ Ġoverride Ġval Ġnum Ch ains : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmin ( 1 , Ġnum Vertices ()) ĊĊĠĠĠ Ġoverride Ġfun Ġchain ( chain _ id : ĠInt ): ĠChain Ġ= ĠChain ( 0 , Ġnum Vertices ()) ĊĊĠĠĠ Ġoverride Ġfun Ġchain Edge ( chain Id : ĠInt , Ġoffset : ĠInt ): ĠEdge Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire EQ ( chain Id , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġrequire LT ( offset , Ġnum Edges ) ĊĠĠĠĠĠĠĠ Ġval Ġk Ġ= Ġif ( offset Ġ+ Ġ 1 Ġ== Ġnum Vertices ()) Ġ 0 Ġelse Ġoffset Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġreturn ĠEdge ( vertices [ offset ], Ġvertices [ k ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġchain Position ( edge Id : ĠInt ): ĠChain Position Ġ= ĠChain Position ( 0 , Ġedge Id ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ this . java Class . simple Name }( id =$ id , Ġvertices =${ vertices . content ToString () })" ĊĠĠĠ Ġ} ĊĊ Ċ } ĊĊĊ