package Ġde . cha ffic . geometry Ċ Ċ import Ġde . cha ffic . collision . Axis Aligned BoundingBox Ċ import Ġde . cha ffic . dynamics . bodies . Physical Body Interface Ċ import Ġde . cha ffic . geometry . bodies . Trans latable Body Ċ import Ġde . cha ffic . math . Math . line Intersect Ċ import Ġde . cha ffic . math . Math . point Is On Line Ċ import Ġde . cha ffic . math . Vec 2 Ċ Ċ /** Ċ Ġ* ĠClass Ġfor Ġrepresenting Ġpolygon Ġshape . Ċ Ġ*/ Ċ class ĠPolygon Ġ: ĠShape Ġ{ ĊĠĠĠ Ġvar Ġvertices : ĠArray < Vec 2 > ĊĠĠĠ Ġlateinit Ġvar Ġnormals : ĠArray < Vec 2 > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstructor Ġtakes Ġa Ġsupplied Ġlist Ġof Ġvertices Ġand Ġgenerates Ġa Ġconvex Ġh ull Ġaround Ġthem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvert List ĠVert ices Ġof Ġpolygon Ġto Ġcreate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( vert List : ĠArray < Vec 2 >) Ġ{ ĊĠĠĠĠĠĠĠ Ġvertices Ġ= Ġgenerate H ull ( vert List , Ġvert List . size ) ĊĠĠĠĠĠĠĠ Ġcalc Normals () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstructor Ġto Ġgenerate Ġa Ġrectangle . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġwidth Ġ ĠDes ired Ġwidth Ġof Ġrectangle ĊĠĠĠĠ Ġ* Ġ@ param Ġheight ĠDes ired Ġheight Ġof Ġrectangle ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( width : ĠDouble , Ġheight : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvertices Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVec 2 (- width , Ġ- height ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVec 2 ( width , Ġ- height ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVec 2 ( width , Ġheight ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVec 2 (- width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġnormals Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVec 2 ( 0 . 0 , Ġ- 1 . 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVec 2 ( 1 . 0 , Ġ 0 . 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVec 2 ( 0 . 0 , Ġ 1 . 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVec 2 (- 1 . 0 , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġregular Ġpolygon Ġwith Ġa Ġspecified Ġnumber Ġof Ġsides Ġand Ġsize . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġradius ĠĠĠ ĠThe Ġmaximum Ġdistance Ġany Ġvertex Ġis Ġaway Ġfrom Ġthe Ġcenter Ġof Ġmass . ĊĠĠĠĠ Ġ* Ġ@ param Ġno Of Side s ĠThe Ġdesired Ġnumber Ġof Ġface Ġthe Ġpolygon Ġhas . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( radius : ĠInt , Ġno Of Side s : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvertices Ġ= ĠMutable List ( no Of Side s ) Ġ{ ĠVec 2 () Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġno Of Side s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangle Ġ= Ġ 2 Ġ* ĠMath . PI Ġ/ Ġno Of Side s Ġ* Ġ( i Ġ+ Ġ 0 . 7 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint X Ġ= Ġradius Ġ* ĠStrict Math . cos ( angle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Y Ġ= Ġradius Ġ* ĠStrict Math . sin ( angle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertices [ i ] Ġ= ĠVec 2 ( point X , Ġpoint Y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . vertices Ġ= Ġvertices . toList (). to Typed Array () ĊĠĠĠĠĠĠĠ Ġcalc Normals () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġnormals Ġfor Ġeach Ġface Ġof Ġthe Ġpolygon . ĠPositive Ġnormals Ġof Ġpolygon Ġfaces Ġface Ġout ward . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcalc Normals () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnormals Ġ= ĠMutable List ( vertices . size ) Ġ{ ĠVec 2 () Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġvertices . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġface Ġ= Ġvertices [ if Ġ( i Ġ+ Ġ 1 Ġ== Ġvertices . size ) Ġ 0 Ġelse Ġi Ġ+ Ġ 1 ]. minus ( vertices [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormals [ i ] Ġ= Ġface . normal (). normalize (). unary Minus () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . normals Ġ= Ġnormals . toList (). to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠImplementation Ġof Ġcalculating Ġthe Ġmass Ġof Ġa Ġpolygon . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdensity ĠThe Ġdesired Ġdensity Ġto Ġfactor Ġinto Ġthe Ġcalculation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcalc Mass ( density : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġphysical Body Ġ= Ġthis . body ĊĠĠĠĠĠĠĠ Ġif ( physical Body Ġ! is ĠPhysical Body Interface ) Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġcentroid Dist Vec : ĠVec 2 ? Ġ= ĠVec 2 ( 0 . 0 , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġvar Ġarea Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġin ertia Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġk Ġ= Ġ 1 . 0 Ġ/ Ġ 3 . 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġvertices . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint 1 Ġ= Ġvertices [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint 2 Ġ= Ġvertices [( i Ġ+ Ġ 1 ) Ġ% Ġvertices . size ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarea Of Par alle log ram Ġ= Ġpoint 1 . cross ( point 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtriangle Area Ġ= Ġ 0 . 5 Ġ* Ġarea Of Par alle log ram ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarea Ġ+= Ġtriangle Area ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweight Ġ= Ġtriangle Area Ġ* Ġk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcentroid Dist Vec !!. add ( point 1 . scalar ( weight )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcentroid Dist Vec . add ( point 2 . scalar ( weight )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġint x 2 Ġ= Ġpoint 1 . x Ġ* Ġpoint 1 . x Ġ+ Ġpoint 2 . x Ġ* Ġpoint 1 . x Ġ+ Ġpoint 2 . x Ġ* Ġpoint 2 . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin ty 2 Ġ= Ġpoint 1 . y Ġ* Ġpoint 1 . y Ġ+ Ġpoint 2 . y Ġ* Ġpoint 1 . y Ġ+ Ġpoint 2 . y Ġ* Ġpoint 2 . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ertia Ġ+= Ġ 0 . 2 5 Ġ* Ġk Ġ* Ġarea Of Par alle log ram Ġ* Ġ( int x 2 Ġ+ Ġin ty 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcentroid Dist Vec Ġ= Ġcentroid Dist Vec !!. scalar ( 1 . 0 Ġ/ Ġarea ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġvertices . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertices [ i ] Ġ= Ġvertices [ i ]. minus ( centroid Dist Vec ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġphysical Body . mass Ġ= Ġdensity Ġ* Ġarea ĊĠĠĠĠĠĠĠ Ġphysical Body . inv Mass Ġ= Ġif Ġ( physical Body . mass Ġ!= Ġ 0 . 0 ) Ġ 1 . 0 Ġ/ Ġphysical Body . mass Ġelse Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġphysical Body . in ertia Ġ= Ġin ertia Ġ* Ġdensity ĊĠĠĠĠĠĠĠ Ġphysical Body . inv In ertia Ġ= Ġif Ġ( physical Body . in ertia Ġ!= Ġ 0 . 0 ) Ġ 1 . 0 Ġ/ Ġphysical Body . in ertia Ġelse Ġ 0 . 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġan ĠA ABB Ġen compass ing Ġthe Ġpolygon Ġand Ġbind s Ġit Ġto Ġthe Ġbody . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcreate AABB () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Point Ġ= Ġorientation . mul ( vertices [ 0 ], ĠVec 2 ()) ĊĠĠĠĠĠĠĠ Ġvar Ġmin X Ġ= Ġfirst Point . x ĊĠĠĠĠĠĠĠ Ġvar Ġmax X Ġ= Ġfirst Point . x ĊĠĠĠĠĠĠĠ Ġvar Ġmin Y Ġ= Ġfirst Point . y ĊĠĠĠĠĠĠĠ Ġvar Ġmax Y Ġ= Ġfirst Point . y ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġvertices . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġorientation . mul ( vertices [ i ], ĠVec 2 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpx Ġ= Ġpoint . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpy Ġ= Ġpoint . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( px Ġ< Ġmin X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin X Ġ= Ġpx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( px Ġ> Ġmax X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax X Ġ= Ġpx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( py Ġ< Ġmin Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Y Ġ= Ġpy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( py Ġ> Ġmax Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Y Ġ= Ġpy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . body . aabb Ġ= ĠAxis Aligned BoundingBox ( Vec 2 ( min X , Ġmin Y ), ĠVec 2 ( max X , Ġmax Y )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġa Ġconvex Ġh ull Ġaround Ġthe Ġvertices Ġsupplied . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvertices ĠList Ġof Ġvertices . ĊĠĠĠĠ Ġ* Ġ@ param Ġn ĠĠĠĠĠĠĠ ĠNumber Ġof Ġvertices Ġsupplied . ĊĠĠĠĠ Ġ* Ġ@ return ĠReturns Ġa Ġconvex Ġh ull Ġarray . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate H ull ( vertices : ĠArray < Vec 2 >, Ġn : ĠInt ): ĠArray < Vec 2 > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġh ull Ġ= ĠArrayList < Vec 2 >() ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Point Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġmin X Ġ= ĠDouble . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġvertices [ i ]. x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ< Ġmin X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Point Index Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġpoint Ġ= Ġfirst Point Index ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Eval Point : ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġwhile Ġ( point Ġ!= Ġfirst Point Index Ġ|| Ġfirst ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh ull . add ( vertices [ point ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Eval Point Ġ= Ġ( point Ġ+ Ġ 1 ) Ġ% Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( side Of Line ( vertices [ point ], Ġvertices [ i ], Ġvertices [ current Eval Point ]) Ġ== Ġ- 1 ) Ġcurrent Eval Point Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Ġ= Ġcurrent Eval Point ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġh ull s Ġ= ĠMutable List ( hull . size ) Ġ{ ĠVec 2 () Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġh ull . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh ull s [ i ] Ġ= Ġh ull [ i ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġh ull s . toList (). to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhich Ġside Ġof Ġa Ġline Ġa Ġpoint Ġis Ġon . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġp 1 ĠĠĠ ĠVertex Ġof Ġline Ġto Ġevaluate . ĊĠĠĠĠ Ġ* Ġ@ param Ġp 2 ĠĠĠ ĠVertex Ġof Ġline Ġto Ġevaluate . ĊĠĠĠĠ Ġ* Ġ@ param Ġpoint ĠPoint Ġto Ġcheck Ġwhich Ġside Ġit Ġlies Ġon . ĊĠĠĠĠ Ġ* Ġ@ return ĠInt Ġvalue Ġ- Ġpositive Ġ= Ġright Ġside Ġof Ġline . ĠNegative Ġ= Ġleft Ġside Ġof Ġline . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġside Of Line ( p 1 : ĠVec 2 , Ġp 2 : ĠVec 2 , Ġpoint : ĠVec 2 ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ( p 2 . y Ġ- Ġp 1 . y ) Ġ* Ġ( point . x Ġ- Ġp 2 . x ) Ġ- Ġ( p 2 . x Ġ- Ġp 1 . x ) Ġ* Ġ( point . y Ġ- Ġp 2 . y ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġ> Ġ 0 ) Ġ 1 Ġelse Ġif Ġ( value Ġ== Ġ 0 . 0 ) Ġ 0 Ġelse Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Ġto Ġcheck Ġif Ġpoint Ġis Ġinside Ġa Ġbody Ġin Ġworld Ġspace . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstart Point ĠVector Ġpoint Ġto Ġcheck Ġif Ġits Ġinside Ġthe Ġfirst Ġbody . ĊĠĠĠĠ Ġ* Ġ@ return Ġboolean Ġvalue Ġwhether Ġthe Ġpoint Ġis Ġinside Ġthe Ġfirst Ġbody . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġis Point Inside ( start Point : ĠVec 2 ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġvertices . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Point Ġ= Ġstart Point . minus ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . body . position . plus ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . body . shape . orientation . mul ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertices [ i ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVec 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( object Point . dot ( this . body . shape . orientation . mul ( normals [ i ], ĠVec 2 ())) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġray Intersect ( start Point : ĠVec 2 , Ġend Point : ĠVec 2 , Ġmax Distance : ĠDouble , Ġray Length : ĠDouble ): ĠIntersection Return Element Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmin Px Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġmin Py Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġintersection Found Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġclosest Body : ĠTrans latable Body ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġmax D Ġ= Ġmax Distance ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġvertices . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstart Of Poly Edge Ġ= Ġvertices [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġend Of Poly Edge Ġ= Ġvertices [ if Ġ( i Ġ+ Ġ 1 Ġ== Ġvertices . size ) Ġ 0 Ġelse Ġi Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Of Poly Edge Ġ= Ġorientation . mul ( start Of Poly Edge , ĠVec 2 ()). plus ( body . position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Of Poly Edge Ġ= Ġorientation . mul ( end Of Poly Edge , ĠVec 2 ()). plus ( body . position ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// detect Ġif Ġline Ġ( start Point Ġ-> Ġendpoint ) Ġintersect s Ġwith Ġthe Ġcurrent Ġedge Ġ( start Of Poly Edge Ġ-> Ġend Of Poly Edge ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintersection Ġ= Ġline Intersect ( start Point , Ġend Point , Ġstart Of Poly Edge , Ġend Of Poly Edge ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intersection Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġstart Point . distance ( intersection ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( point Is On Line ( start Point , Ġend Point , Ġintersection ) Ġ&& Ġpoint Is On Line ( start Of Poly Edge , Ġend Of Poly Edge , Ġintersection ) Ġ&& Ġdistance Ġ< Ġmax D ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax D Ġ= Ġdistance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Px Ġ= Ġintersection . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Py Ġ= Ġintersection . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintersection Found Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclosest Body Ġ= Ġbody ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠIntersection Return Element ( min Px , Ġmin Py , Ġintersection Found , Ġclosest Body , Ġmax D ) ĊĠĠĠ Ġ} Ċ }