package Ġgeometry _ 2 d Ċ Ċ import Ġkotlin . math .* Ċ Ċ data Ġclass ĠPoint ( ĊĠĠĠ Ġvar Ġx : ĠFloat , ĊĠĠĠ Ġvar Ġy : ĠFloat Ċ ) Ġ{ ĊĠĠĠ Ġval Ġxi : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġx . round ToInt () ĊĠĠĠ Ġval Ġy i : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġy . round ToInt () ĊĊĠĠĠ Ġconstructor ( x : ĠInt , Ġy : ĠInt ) Ġ: Ġthis ( x . toFloat (), Ġy . toFloat ()) ĊĠĠĠ Ġconstructor ( v : ĠVector ) Ġ: Ġthis ( v [ 0 ], Ġv [ 1 ]) ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( f : ĠFloat ) Ġ= ĠPoint ( this . x Ġ* Ġf , Ġthis . y Ġ* Ġf ) ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( d : ĠDouble ) Ġ= Ġtimes ( d . toFloat ()) ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( p : ĠPoint ) Ġ= ĠPoint ( this . x Ġ+ Ġp . x , Ġthis . y Ġ+ Ġp . y ) ĊĊĠĠĠ Ġoperator Ġfun Ġminus ( p : ĠPoint ) Ġ= ĠPoint ( this . x Ġ- Ġp . x , Ġthis . y Ġ- Ġp . y ) ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( p : ĠPoint ) Ġ= Ġ( this . x Ġ* Ġp . x Ġ+ Ġthis . y Ġ* Ġp . y ) ĊĊĠĠĠ Ġfun Ġround ToInt () Ġ= ĠPoint ( this . x . round ToInt (), Ġthis . y . round ToInt ()) ĊĊĠĠĠ Ġfun Ġto Pair (): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . x . toInt () Ġto Ġthis . y . toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmag () Ġ= Ġmagnitude ( this ) ĊĠĠĠ Ġfun Ġangle () Ġ= Ġatan 2 ( this . y , Ġthis . x ) ĊĠĠĠ Ġfun Ġlength () Ġ= Ġdistance ( Point ( 0 f , Ġ 0 f ), Ġthis ) ĊĊĠĠĠ Ġfun Ġto Length ( length : ĠFloat ): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġthis . mag () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( m Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ* Ġ( length Ġ/ Ġm ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġin Bounds ( top Left : ĠPoint , Ġbottom Right : ĠPoint ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( this . x Ġ> Ġtop Left . x Ġ&& Ġthis . x Ġ< Ġbottom Right . x Ġ&& Ġthis . y Ġ> Ġtop Left . y Ġ&& Ġthis . y Ġ< Ġbottom Right . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġpoint To ( angle : ĠFloat , Ġlength : ĠFloat ) Ġ= ĠPoint ( length Ġ* Ġcos ( angle ), Ġlength Ġ* Ġsin ( angle )) ĊĠĠĠĠĠĠĠ Ġfun Ġdistance ( p 1 : ĠPoint , Ġp 2 : ĠPoint ) Ġ= Ġsqrt ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( p 1 . x . toDouble () Ġ- Ġp 2 . x . toDouble ()). pow ( 2 ) Ġ+ Ġ( p 1 . y . toDouble () Ġ- Ġp 2 . y . toDouble ()). pow ( 2 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġmagnitude ( p : ĠPoint ) Ġ= Ġsqrt ( p . x . pow ( 2 ) Ġ+ Ġp . y . pow ( 2 )) ĊĊĠĠĠĠĠĠĠ Ġfun Ġangle Between ( p 1 : ĠPoint , Ġp 2 : ĠPoint ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġa cos ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( p 1 Ġ* Ġp 2 ) Ġ/ Ġ( magnitude ( p 1 ) Ġ* Ġmagnitude ( p 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }