package Ġcom . team 2 5 4 . lib . geometry Ċ Ċ import Ġcom . team 2 5 4 . lib . sp lines util . Util Ċ import Ġkotlin . js . Experimental Js Export Ċ import Ġkotlin . js . Js Export Ċ import Ġkotlin . js . Js Name Ċ import Ġkotlin . jvm . Jvm Static Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġ 2 d Ġpose Ġ( rigid Ġtransform ) Ġcontaining Ġtranslation al Ġand Ġrot ational Ġelements . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠIn sp ired Ġby ĠS oph us Ġ( https :// github . com / str as dat / S oph us / tree / master / sop hus ) Ċ Ġ*/ Ċ @ Experimental Js Export Ċ @ Js Export Ċ class ĠP ose 2 d ( ĊĠĠĠ Ġprivate Ġval Ġtranslation _ Ġ: ĠTranslation 2 d Ġ= ĠTranslation 2 d (), ĊĠĠĠ Ġprivate Ġval Ġrotation _ Ġ: ĠRotation 2 d Ġ= ĠRotation 2 d () Ċ ) Ġ: ĠIP ose 2 d < Pose 2 d > Ġ{ ĊĊĠĠĠ Ġ@ Js Name (" from XY Rotation ") ĊĠĠĠ Ġconstructor ( x : ĠDouble , Ġy : ĠDouble , Ġrotation : ĠRotation 2 d ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ ĠTranslation 2 d ( x , Ġy ), ĊĠĠĠĠĠĠĠ Ġrotation ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Js Name (" from Triple ") ĊĠĠĠ Ġconstructor ( x : ĠDouble , Ġy : ĠDouble , Ġrotation : ĠDouble ): Ġthis ( ĊĠĠĠĠĠĠĠ Ġx , Ġy , ĠRotation 2 d . from Degrees ( rotation ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Js Name (" copyOf ") ĊĠĠĠ Ġconstructor ( other : ĠP ose 2 d ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ ĠTranslation 2 d ( other . translation _), ĊĠĠĠĠĠĠĠ ĠRotation 2 d ( other . rotation _) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġval Ġtranslation : ĠTranslation 2 d ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtranslation _ ĊĠĠĠ Ġoverride Ġval Ġrotation : ĠRotation 2 d ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrotation _ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTransform ing Ġthis ĠRigid Transform 2 d Ġmeans Ġfirst Ġtrans lating Ġby Ġother . translation Ġand Ġthen Ġrot ating Ġby ĊĠĠĠĠ Ġ* Ġother . rotation ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġother ĠThe Ġother Ġtransform . ĊĠĠĠĠ Ġ* Ġ@ return ĠThis Ġtransform Ġ* Ġother ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġtransform By ( other : ĠP ose 2 d ): ĠP ose 2 d Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠP ose 2 d ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslation _. translate By ( other . translation _. rotate By ( rotation _ )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrotation _. rotate By ( other . rotation _) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġinverse Ġof Ġthis Ġtransform Ġ" undo es " Ġthe Ġeffect Ġof Ġtrans lating Ġby Ġthis Ġtransform . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġopposite Ġof Ġthis Ġtransform . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinverse (): ĠP ose 2 d Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrotation _ inverted : ĠRotation 2 d Ġ= Ġrotation _. inverse () ĊĠĠĠĠĠĠĠ Ġreturn ĠP ose 2 d ( translation _. inverse (). rotate By ( rotation _ inverted ), Ġrotation _ inverted ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnormal (): ĠP ose 2 d Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠP ose 2 d ( translation _, Ġrotation _. normal ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe Ġpoint Ġwhere Ġthe Ġheading Ġof Ġthis Ġpose Ġintersect s Ġthe Ġheading Ġof Ġanother . ĠReturns Ġ(+ INF , Ġ+ INF ) Ġif ĊĠĠĠĠ Ġ* Ġparallel . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġintersection ( other : ĠP ose 2 d ): ĠTranslation 2 d Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġother _ rotation : ĠRotation 2 d Ġ= Ġother . rotation ĊĠĠĠĠĠĠĠ Ġif Ġ( rotation _. is Parallel ( other _ rotation )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLines Ġare Ġparallel . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTranslation 2 d ( Double . POSITIVE _ INFINITY , ĠDouble . POSITIVE _ INFINITY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( kotlin . math . abs ( rotation _. cos ()) Ġ< Ġkotlin . math . abs ( other _ rotation . cos ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintersection Internal ( this , Ġother ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintersection Internal ( other , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġtrue Ġif Ġthis Ġpose Ġis Ġ( near ly ) Ġcol ine ar Ġwith Ġthe Ġanother . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Col ine ar ( other : ĠP ose 2 d ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! rotation . is Parallel ( other . rotation )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġtw ist : ĠTw ist 2 d Ġ= Ġlog ( inverse (). transform By ( other )) ĊĠĠĠĠĠĠĠ Ġreturn ĠUtil . epsilon Equals ( tw ist . dy , Ġ 0 . 0 ) Ġ&& ĠUtil . epsilon Equals ( tw ist . d theta , Ġ 0 . 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġepsilon Equals ( other : ĠP ose 2 d , Ġepsilon : ĠDouble ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( translation . epsilon Equals ( other . translation , Ġepsilon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġrotation . is Parallel ( other . rotation )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDo Ġtw ist Ġinterpolation Ġof Ġthis Ġpose Ġassuming Ġconstant Ġcur v ature . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġinterpolate ( other : ĠP ose 2 d , Ġx : ĠDouble ): ĠP ose 2 d Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( x Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠP ose 2 d ( this ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( x Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠP ose 2 d ( other ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtw ist : ĠTw ist 2 d Ġ= Ġlog ( inverse (). transform By ( other )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtransform By ( exp ( tw ist . scaled ( x ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" T :$ translation _, ĠR :$ rotation _" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto CSV (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtranslation _. to CSV () Ġ+ Ġ"," Ġ+ Ġrotation _. to CSV () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdistance ( other : ĠP ose 2 d ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlog ( inverse (). transform By ( other )). norm () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( other Ġ== Ġnull Ġ|| Ġother Ġ! is ĠP ose 2 d ) Ġfalse Ġelse Ġepsilon Equals ( other , ĠUtil . k Epsilon ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġpose : ĠP ose 2 d ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġmirror (): ĠP ose 2 d Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠP ose 2 d ( Translation 2 d ( translation . x (), Ġ- translation . y ()), Ġrotation . inverse ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġtranslation _. hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġrotation _. hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġk Identity Ġ= ĠP ose 2 d () ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġidentity (): ĠP ose 2 d Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġk Identity ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġk E ps Ġ= Ġ 1 E - 9 ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Translation ( translation : ĠTranslation 2 d ): ĠP ose 2 d Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠP ose 2 d ( translation , ĠRotation 2 d ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Rotation ( rotation : ĠRotation 2 d ): ĠP ose 2 d Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠP ose 2 d ( Translation 2 d (), Ġrotation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠObtain Ġa Ġnew ĠP ose 2 d Ġfrom Ġa Ġ( constant Ġcur v ature ) Ġvelocity . ĠSee : ĊĠĠĠĠĠĠĠĠ Ġ* Ġhttps :// github . com / str as dat / S oph us / blob / master / sop hus / se 2 . hpp ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġexp ( delta : ĠTw ist 2 d ): ĠP ose 2 d Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsin _ theta : ĠDouble Ġ= Ġkotlin . math . sin ( delta . d theta ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcos _ theta : ĠDouble Ġ= Ġkotlin . math . cos ( delta . d theta ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs : ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc : ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( kotlin . math . abs ( delta . d theta ) Ġ< Ġk E ps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= Ġ 1 . 0 Ġ- Ġ 1 . 0 Ġ/ Ġ 6 . 0 Ġ* Ġdelta . d theta Ġ* Ġdelta . d theta ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġ. 5 Ġ* Ġdelta . d theta ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= Ġsin _ theta Ġ/ Ġdelta . d theta ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġ( 1 . 0 Ġ- Ġcos _ theta ) Ġ/ Ġdelta . d theta ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠP ose 2 d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTranslation 2 d ( delta . dx Ġ* Ġs Ġ- Ġdelta . dy Ġ* Ġc , Ġdelta . dx Ġ* Ġc Ġ+ Ġdelta . dy Ġ* Ġs ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRotation 2 d ( cos _ theta , Ġsin _ theta , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLogical Ġinverse Ġof Ġthe Ġabove . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġlog ( transform : ĠP ose 2 d ): ĠTw ist 2 d Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd theta : ĠDouble Ġ= Ġtransform . rotation . radians ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhalf _ d theta Ġ= Ġ 0 . 5 Ġ* Ġd theta ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcos _ minus _ one : ĠDouble Ġ= Ġtransform . rotation . cos () Ġ- Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhal ft he ta _ by _ tan _ of _ hal fd theta : ĠDouble Ġ= Ġif Ġ( kotlin . math . abs ( cos _ minus _ one ) Ġ< Ġk E ps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 Ġ- Ġ 1 . 0 Ġ/ Ġ 1 2 . 0 Ġ* Ġd theta Ġ* Ġd theta ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-( half _ d theta Ġ* Ġtransform . rotation . sin ()) Ġ/ Ġcos _ minus _ one ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtranslation _ part : ĠTranslation 2 d Ġ= Ġtransform . translation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. rotate By ( Rotation 2 d ( hal ft he ta _ by _ tan _ of _ hal fd theta , Ġ- half _ d theta , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTw ist 2 d ( translation _ part . x (), Ġtranslation _ part . y (), Ġd theta ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġintersection Internal ( a : ĠP ose 2 d , Ġb : ĠP ose 2 d ): ĠTranslation 2 d Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa _ r : ĠRotation 2 d Ġ= Ġa . rotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb _ r : ĠRotation 2 d Ġ= Ġb . rotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa _ t : ĠTranslation 2 d Ġ= Ġa . translation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb _ t : ĠTranslation 2 d Ġ= Ġb . translation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtan _ b : ĠDouble Ġ= Ġb _ r . tan () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt : ĠDouble Ġ= Ġ((( a _ t . x () Ġ- Ġb _ t . x ()) Ġ* Ġtan _ b Ġ+ Ġb _ t . y () Ġ- Ġa _ t . y ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/ Ġ( a _ r . sin () Ġ- Ġa _ r . cos () Ġ* Ġtan _ b )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( t . isNaN ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTranslation 2 d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble . POSITIVE _ INFINITY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble . POSITIVE _ INFINITY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġa _ t . translate By ( a _ r . to Translation (). scale ( t )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }