/* Ċ Ġ* ĠGAME Lib , ĠGe ometric ĠAnd ĠMathematic al ĠExtension ĠLibrary Ċ Ġ* ĠCopyright Ġ( C ) ĠMat th ias ĠK ov ac ic Ġ< mat th ias . kov ac ic @ student . k ule u ven . be > Ċ Ġ* Ċ Ġ* ĠThis Ġprogram Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ċ Ġ* Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ċ Ġ* Ġthe ĠFree ĠSoftware ĠFoundation , Ġeither Ġversion Ġ 3 Ġof Ġthe ĠLicense , Ġor Ċ Ġ* Ġ( at Ġyour Ġoption ) Ġany Ġlater Ġversion . Ċ Ġ* Ċ Ġ* ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ċ Ġ* Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof Ċ Ġ* ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe Ċ Ġ* ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . Ċ Ġ* Ċ Ġ* ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ Ġ* Ġalong Ġwith Ġthis Ġprogram . Ġ ĠIf Ġnot , Ġsee Ġ< https :// www . gnu . org / licenses />. Ċ Ġ*/ Ċ Ċ package Ġcom . github . poly rocket mat t . game . math . geometry . shape Ċ Ċ import Ġcom . github . poly rocket mat t . game . Vec 2 Ċ import Ġcom . github . poly rocket mat t . game . Vec 2 f Ċ import Ġcom . github . poly rocket mat t . game . Vec 2 i Ċ import Ġcom . github . poly rocket mat t . game . math . geometry . D CEL Ċ import Ġcom . github . poly rocket mat t . game . math . geometry . Scal able Ċ import Ġcom . github . poly rocket mat t . game . math . geometry . hull . BoundingBox Ċ import Ġcom . github . poly rocket mat t . game . math . geometry . hull . Coll id able Ċ import Ġcom . github . poly rocket mat t . game . math . geometry . hull . construct AABB Ċ import Ġcom . github . poly rocket mat t . game . math . geometry . primitive . Edge Ċ import Ġcom . github . poly rocket mat t . game . math . geometry . primitive . Segment Ċ import Ġcom . github . poly rocket mat t . game . tuple . Pair Ċ import Ġjava . lang . IllegalArgumentException Ċ Ċ /** Ċ Ġ* ĠDefines Ġa Ġconc ave Ġpolygon Ġprimitive Ġbased Ġon Ġa Ġlist Ġof Ċ Ġ* Ġthree - dimensional Ġvectors . Ċ Ġ*/ Ċ class ĠCon c ave Polygon ( val Ġvertices : ĠList < Vec 2 f >) Ġ: ĠShape , ĠScal able , ĠColl id able Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpoints Ġ= Ġvertices . size ĊĠĠĠ Ġprivate Ġval Ġx Points : ĠList < Float > Ġ= Ġvertices . map Ġ{ Ġvec 2 f Ġ-> Ġvec 2 f . x Ġ} ĊĠĠĠ Ġprivate Ġval Ġy Points : ĠList < Float > Ġ= Ġvertices . map Ġ{ Ġvec 2 f Ġ-> Ġvec 2 f . y Ġ} ĊĠĠĠ Ġprivate Ġval Ġtriangles : ĠList < Triangle > Ġ= Ġarray ListOf () ĊĠĠĠ Ġval Ġedges : ĠList < Edge > ĊĠĠĠ Ġval Ġangles : ĠList < Float > ĊĠĠĠ Ġval Ġcenter : ĠVec 2 f Ġ= ĠVec 2 f ( x Points . sum () Ġ/ Ġvertices . size , Ġy Points . sum () Ġ/ Ġvertices . size ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( vertices . size Ġ< Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" A Ġpolygon Ġmust Ġhave Ġat Ġleast Ġ 3 Ġpoints !") ĊĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġvertices . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġpolygon Edges Ġ= Ġarray ListOf < Edge >() ĊĠĠĠĠĠĠĠ Ġval Ġpolygon Angles Ġ= Ġarray ListOf < Float >() ĊĊĠĠĠĠĠĠĠ Ġpolygon Edges . add ( Edge ( vertices [ 0 ], Ġvertices [ 1 ])) ĊĠĠĠĠĠĠĠ Ġpolygon Angles . add (( vertices [ size ] Ġ- Ġvertices [ 0 ]). angle ( vertices [ 1 ] Ġ- Ġvertices [ 0 ])) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolygon Edges . add ( Edge ( vertices [ i ], Ġvertices [ i Ġ+ Ġ 1 ])) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolygon Angles . add (( vertices [ i Ġ- Ġ 1 ] Ġ- Ġvertices [ i ]). angle ( vertices [ i Ġ+ Ġ 1 ] Ġ- Ġvertices [ i ])) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpolygon Edges . add ( Edge ( vertices [ size ], Ġvertices [ 0 ])) ĊĠĠĠĠĠĠĠ Ġpolygon Angles . add (( vertices [ 0 ] Ġ- Ġvertices [ size ]). angle ( vertices [ size Ġ- Ġ 1 ] Ġ- Ġvertices [ size ])) ĊĊĠĠĠĠĠĠĠ Ġedges Ġ= Ġpolygon Edges ĊĠĠĠĠĠĠĠ Ġangles Ġ= Ġpolygon Angles ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġa Ġgiven Ġfloating Ġpoint Ġvector Ġis Ġcontained Ġwithin Ġthe Ġpolygon . ĊĠĠĠĠ Ġ* ĠThis Ġimplementation Ġis Ġtaken Ġfrom Ġthe ĠPolygon Ġmethod Ġin Ġjava . awt . Polygon . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvec Ġthe Ġvector Ġto Ġcheck ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġof Ġthe Ġcoordinates Ġof Ġthe Ġvector Ġare Ġcontained Ġwithin Ġthe Ġpolygon ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcontains ( vec : ĠVec 2 i ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( Vec 2 f ( vec . x , Ġvec . y ), ĠVec 2 f ( Float . MAX _ VALUE , Ġvec . y )), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( Vec 2 f ( vec . x , Ġvec . y ), ĠVec 2 f ( Float . MAX _ VALUE , Ġvec . y Ġ+ Ġ 1 )), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdge ( Vec 2 f ( vec . x , Ġvec . y ), ĠVec 2 f ( Float . MAX _ VALUE , Ġvec . y Ġ- Ġ 1 )), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdistinct Intersection List Ġ= Ġlines . map Ġ{ Ġline Ġ-> Ġinter sections ( line ) Ġ}. distinct () ĊĠĠĠĠĠĠĠ Ġreturn Ġdistinct Intersection List . all Ġ{ Ġi Ġ-> Ġi Ġ% Ġ 2 Ġ== Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinter sections ( edge : ĠEdge ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġinter sections Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġedges ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . i Points . any Ġ{ Ġp Ġ-> Ġedge . i Points . any Ġ{ Ġop Ġ-> Ġp . i X Ġ== Ġop . i X Ġ&& Ġp . i Y Ġ== Ġop . i Y Ġ} Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinter sections ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinter sections ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġa Ġgiven Ġfloating Ġpoint Ġvector Ġis Ġcontained Ġwithin Ġthe Ġpolygon . ĊĠĠĠĠ Ġ* ĠThis Ġimplementation Ġis Ġtaken Ġfrom Ġthe ĠPolygon Ġmethod Ġin Ġjava . awt . Polygon . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvec Ġthe Ġvector Ġto Ġcheck ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġof Ġthe Ġcoordinates Ġof Ġthe Ġvector Ġare Ġcontained Ġwithin Ġthe Ġpolygon ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// fun Ġcontains ( vec : ĠVec 2 i ): ĠBoolean Ġ= Ġjava Polygon . contains ( vec . i X , Ġvec . i Y ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠScale Ġthe Ġpolygon Ġby Ġthe Ġgiven Ġamount Ġby Ġscaling Ġthe Ġvertices ĊĠĠĠĠ Ġ* Ġof Ġthe Ġpolygon . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġscalar Ġthe Ġscalar Ġto Ġscale Ġthe Ġvertices Ġwith ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġpolygon Ġbased Ġon Ġthe Ġscaled Ġvertices ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġscale ( scalar : ĠFloat ): ĠScal able Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscale Vector Ġ= ĠVec 2 f ( scalar , Ġscalar ) ĊĠĠĠĠĠĠĠ Ġval Ġscaled Vertices Ġ= Ġvertices . map Ġ{ Ġvec 2 f Ġ-> Ġ( vec 2 f Ġ* Ġscale Vector ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠConv ex Polygon ( ArrayList ( scaled Vertices )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġbounding Ġbox Ġfor Ġthe Ġpolygon . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġaxis - aligned Ġbounding Ġbox Ġcontaining Ġall Ġthe Ġvertices ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget BoundingBox (): ĠBounding Box Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmin Ġ= ĠVec 2 f ( vertices . min Of Ġ{ Ġvec 2 f Ġ-> Ġvec 2 f . x Ġ}, Ġvertices . min Of Ġ{ Ġvec 2 f Ġ-> Ġvec 2 f . y Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġmax Ġ= ĠVec 2 f ( vertices . max Of Ġ{ Ġvec 2 f Ġ-> Ġvec 2 f . x Ġ}, Ġvertices . max Of Ġ{ Ġvec 2 f Ġ-> Ġvec 2 f . y Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( min Ġas ĠVec 2 , Ġmax Ġas ĠVec 2 ). construct AABB () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġpolygon Ġis Ġa Ġtriangle . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġpolygon Ġis Ġa Ġtriangle Ġ( th us Ġhas Ġ 3 Ġvertices ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Triangle (): ĠBoolean Ġ= Ġvertices . size Ġ== Ġ 3 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvert Ġthe Ġpolygon Ġto Ġa Ġtriangle . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġtriangle Ġconstructed Ġfrom Ġthis Ġpolygon ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġto Triangle (): ĠTriangle Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Triangle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Polygon Ġwith Ġ${ vertices . size } Ġis Ġnot Ġa Ġtriangle !") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTriangle ( vertices [ 0 ], Ġvertices [ 1 ], Ġvertices [ 2 ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġpolygon Ġis Ġa Ġquad . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġpolygon Ġis Ġa Ġquad Ġ( th us Ġhas Ġ 4 Ġvertices ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Quad (): ĠBoolean Ġ= Ġvertices . size Ġ== Ġ 4 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvert Ġthe Ġpolygon Ġto Ġa Ġquad . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġquad Ġconstructed Ġfrom Ġthis Ġpolygon ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġto Quad (): ĠQuad Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Triangle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Polygon Ġwith Ġ${ vertices . size } Ġis Ġnot Ġa Ġquad !") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠQuad ( vertices [ 0 ], Ġvertices [ 1 ], Ġvertices [ 2 ], Ġvertices [ 3 ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcenter (): ĠVec 2 f Ġ= Ġcenter ĊĊĠĠĠ Ġoverride Ġfun Ġvertices (): ĠList < Vec 2 f > Ġ= Ġvertices ĊĊĠĠĠ Ġoverride Ġfun Ġedges (): ĠList < Edge > Ġ= Ġedges ĊĊĠĠĠ Ġoverride Ġfun Ġsegments (): ĠList < Segment > Ġ= Ġedges . map Ġ{ Ġedge Ġ-> Ġedge . segment () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCompute Ġa Ġtri ang ulation Ġwith Ġthe Ġcenter Ġof Ġthis Ġpolygon Ġincluded . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġtriangles Ġthat Ġare Ġpart Ġof Ġthe Ġtri ang ulation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcentroid Tri ang ulation (): ĠList < Triangle > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtriangles Ġ= Ġarray ListOf < Triangle >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġvertices . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġvertices [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġvertices [( i Ġ+ Ġ 1 ) Ġ% Ġvertices . size ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtriangles . add ( Triangle ( center , Ġleft , Ġright )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtriangles ĊĠĠĠ Ġ} Ċ Ċ }