package Ġcom . so y wiz . k med ial ayer . scene . geom Ċ Ċ import Ġkotlin . math .* Ċ Ċ data Ġclass ĠPoint ( var Ġx : ĠDouble Ġ= Ġ 0 . 0 , Ġvar Ġy : ĠDouble Ġ= Ġx ) Ġ{ ĊĠĠĠ Ġconstructor ( x : ĠFloat , Ġy : ĠFloat ) Ġ: Ġthis ( x . toDouble (), Ġy . toDouble ()) ĊĠĠĠ Ġconstructor ( x : ĠInt , Ġy : ĠInt ) Ġ: Ġthis ( x . toDouble (), Ġy . toDouble ()) ĊĠĠĠ Ġconstructor ( x : ĠLong , Ġy : ĠLong ) Ġ: Ġthis ( x . toDouble (), Ġy . toDouble ()) ĊĠĠĠ Ġconstructor ( v : ĠPoint ) Ġ: Ġthis ( v . x , Ġv . y ) ĊĠĠĠ Ġ// inline Ġconstructor ( x : ĠNumber , Ġy : ĠNumber ) Ġ: Ġthis ( x . toDouble (), Ġy . toDouble ()) Ġ// Ġ@ TODO : ĠSuggest Ġto Ġavoid Ġbox ing ? ĊĊĠĠĠ Ġinline Ġfun Ġset To ( x : ĠNumber , Ġy : ĠNumber ): ĠPoint Ġ= Ġset To ( x . toDouble (), Ġy . toDouble ()) ĊĊĠĠĠ Ġfun Ġset To ( x : ĠDouble , Ġy : ĠDouble ): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . x Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġthis . y Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset To Zero () Ġ= Ġset To ( 0 . 0 , Ġ 0 . 0 ) ĊĊĠĠĠ Ġ/// ĠNeg ate Ġthis Ġpoint . ĊĠĠĠ Ġfun Ġneg () Ġ= Ġset To (- x , Ġ- y ) ĊĊĠĠĠ Ġfun Ġmul ( s : ĠDouble ) Ġ= Ġset To ( x Ġ* Ġs , Ġy Ġ* Ġs ) ĊĠĠĠ Ġfun Ġadd ( p : ĠPoint ) Ġ= Ġthis . set ToAdd ( this , Ġp ) ĊĠĠĠ Ġfun Ġsub ( p : ĠPoint ) Ġ= Ġthis . set To Sub ( this , Ġp ) ĊĊĠĠĠ Ġfun Ġcopy From ( that : ĠPoint ) Ġ= Ġset To ( that . x , Ġthat . y ) ĊĊĠĠĠ Ġfun Ġset To Transform ( mat : ĠMatrix 2 d , Ġp : ĠPoint ): ĠPoint Ġ= Ġset To Transform ( mat , Ġp . x , Ġp . y ) ĊĊĠĠĠ Ġfun Ġset To Transform ( mat : ĠMatrix 2 d , Ġx : ĠDouble , Ġy : ĠDouble ): ĠPoint Ġ= Ġset To ( ĊĠĠĠĠĠĠĠ Ġmat . transform X ( x , Ġy ), ĊĠĠĠĠĠĠĠ Ġmat . transform Y ( x , Ġy ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġset ToAdd ( a : ĠPoint , Ġb : ĠPoint ): ĠPoint Ġ= Ġset To ( a . x Ġ+ Ġb . x , Ġa . y Ġ+ Ġb . y ) ĊĠĠĠ Ġfun Ġset To Sub ( a : ĠPoint , Ġb : ĠPoint ): ĠPoint Ġ= Ġset To ( a . x Ġ- Ġb . x , Ġa . y Ġ- Ġb . y ) ĊĠĠĠ Ġfun Ġset To Mul ( a : ĠPoint , Ġb : ĠPoint ): ĠPoint Ġ= Ġset To ( a . x Ġ* Ġb . x , Ġa . y Ġ* Ġb . y ) ĊĠĠĠ Ġfun Ġset To Mul ( a : ĠPoint , Ġs : ĠDouble ): ĠPoint Ġ= Ġset To ( a . x Ġ* Ġs , Ġa . y Ġ* Ġs ) ĊĊĠĠĠ Ġoperator Ġfun Ġplus Assign ( that : ĠPoint ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset To ( this . x Ġ+ Ġthat . x , Ġthis . y Ġ+ Ġthat . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnormalize () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġthis . length ĊĠĠĠĠĠĠĠ Ġthis . set To ( this . x Ġ/ Ġlen , Ġthis . y Ġ/ Ġlen ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġunit : ĠPoint Ġget () Ġ= Ġthis Ġ/ Ġlength ĊĠĠĠ Ġval Ġlength : ĠDouble Ġget () Ġ= Ġh ypot ( x , Ġy ) ĊĠĠĠ Ġoperator Ġfun Ġplus ( that : ĠPoint ) Ġ= ĠPoint ( this . x Ġ+ Ġthat . x , Ġthis . y Ġ+ Ġthat . y ) ĊĠĠĠ Ġoperator Ġfun Ġminus ( that : ĠPoint ) Ġ= ĠPoint ( this . x Ġ- Ġthat . x , Ġthis . y Ġ- Ġthat . y ) ĊĠĠĠ Ġoperator Ġfun Ġtimes ( that : ĠPoint ) Ġ= Ġthis . x Ġ* Ġthat . x Ġ+ Ġthis . y Ġ* Ġthat . y ĊĠĠĠ Ġoperator Ġfun Ġtimes ( v : ĠDouble ) Ġ= ĠPoint ( x Ġ* Ġv , Ġy Ġ* Ġv ) ĊĠĠĠ Ġoperator Ġfun Ġdiv ( v : ĠDouble ) Ġ= ĠPoint ( x Ġ/ Ġv , Ġy Ġ/ Ġv ) ĊĊĠĠĠ Ġfun Ġdistance To ( x : ĠDouble , Ġy : ĠDouble ) Ġ= Ġh ypot ( x Ġ- Ġthis . x , Ġy Ġ- Ġthis . y ) ĊĠĠĠ Ġfun Ġdistance To ( that : ĠPoint ) Ġ= Ġdistance To ( that . x , Ġthat . y ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Point ($ x , Ġ$ y )" ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġmiddle ( a : ĠPoint , Ġb : ĠPoint ): ĠPoint Ġ= ĠPoint (( a . x Ġ+ Ġb . x ) Ġ* Ġ 0 . 5 , Ġ( a . y Ġ+ Ġb . y ) Ġ* Ġ 0 . 5 ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġangle ( a : ĠPoint , Ġb : ĠPoint ): ĠDouble Ġ= Ġa cos (( a Ġ* Ġb ) Ġ/ Ġ( a . length Ġ* Ġb . length )) ĊĊĠĠĠĠĠĠĠ Ġfun Ġangle ( ax : ĠDouble , Ġay : ĠDouble , Ġbx : ĠDouble , Ġby : ĠDouble ): ĠDouble Ġ= Ġa cos ((( ax Ġ* Ġbx ) Ġ+ Ġ( ay Ġ* Ġby )) Ġ/ Ġ( h ypot ( ax , Ġay ) Ġ* Ġh ypot ( bx , Ġby ))) ĊĊĠĠĠĠĠĠĠ Ġfun Ġsort Points ( points : ĠArrayList < Point >): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . sort With ( Comparator ({ Ġl , Ġr Ġ-> Ġcmp Points ( l , Ġr ) Ġ})) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġcmp Points ( l : ĠPoint , Ġr : ĠPoint ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġret : ĠDouble Ġ= Ġl . y Ġ- Ġr . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret Ġ== Ġ 0 . 0 ) Ġret Ġ= Ġl . x Ġ- Ġr . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret Ġ< Ġ 0 ) Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret Ġ> Ġ 0 ) Ġreturn Ġ+ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġangle ( x 1 : ĠDouble , Ġy 1 : ĠDouble , Ġx 2 : ĠDouble , Ġy 2 : ĠDouble , Ġx 3 : ĠDouble , Ġy 3 : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġax Ġ= Ġx 1 Ġ- Ġx 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġay Ġ= Ġy 1 Ġ- Ġy 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġal Ġ= Ġh ypot ( ax , Ġay ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbx Ġ= Ġx 1 Ġ- Ġx 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġby Ġ= Ġy 1 Ġ- Ġy 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbl Ġ= Ġh ypot ( bx , Ġby ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġa cos (( ax Ġ* Ġbx Ġ+ Ġay Ġ* Ġby ) Ġ/ Ġ( al Ġ* Ġbl )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġ@ TODO : ĠCheck Ġif Ġthis Ġavoid Ġbox ing ! Ċ inline Ġfun ĠPoint ( x : ĠNumber , Ġy : ĠNumber ) Ġ= ĠPoint ( x . toDouble (), Ġy . toDouble ()) Ċ Ċ operator Ġfun ĠPoint . times ( that : ĠPoint ) Ġ= Ġthis . x Ġ* Ġthat . x Ġ+ Ġthis . y Ġ* Ġthat . y Ċ fun ĠPoint . distance To ( x : ĠDouble , Ġy : ĠDouble ) Ġ= Ġh ypot ( x Ġ- Ġthis . x , Ġy Ġ- Ġthis . y ) Ċ fun ĠPoint . distance To ( that : ĠPoint ) Ġ= Ġdistance To ( that . x , Ġthat . y )