package Ġcom . dim a 6 1 2 0 . og l Helper . data Ċ Ċ import Ġkotlin . math . atan 2 Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . sqrt Ċ Ċ class ĠPoint 2 f Ġ{ ĊĠĠĠ Ġvar Ġx Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġy Ġ= Ġ 0 f ĊĊĠĠĠ Ġconstructor () ĊĊĠĠĠ Ġconstructor ( x : ĠFloat , Ġy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . x Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġthis . y Ġ= Ġy ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( p : ĠPoint 2 f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġp . x ĊĠĠĠĠĠĠĠ Ġy Ġ= Ġp . y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset ( p : ĠPoint 2 f ): ĠPoint 2 f Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġp . x ĊĠĠĠĠĠĠĠ Ġy Ġ= Ġp . y ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset ( x : ĠFloat , Ġy : ĠFloat ): ĠPoint 2 f Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . x Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġthis . y Ġ= Ġy ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġin Radius ( r : ĠFloat , Ġp : ĠPoint 2 f ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( r Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġsqrt (( x Ġ- Ġp . x . toDouble ()). pow ( 2 . 0 ) Ġ+ Ġ( y Ġ- Ġp . y . toDouble ()). pow ( 2 . 0 )). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd Ġ<= Ġr ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġangle (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġangle Ġ= ĠMath . to Degrees ( atan 2 ( y . toDouble (), Ġx . toDouble ())). toFloat () Ġ% Ġ 3 6 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( angle Ġ< Ġ- 1 8 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġangle Ġ+= Ġ 3 6 0 . 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( angle Ġ> Ġ 1 8 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġangle Ġ-= Ġ 3 6 0 . 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġangle ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġangle ( p : ĠPoint 2 f ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġangle 1 Ġ= Ġatan 2 ( y . toDouble (), Ġx . toDouble ()). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġangle 2 Ġ= Ġatan 2 ( p . y . toDouble (), Ġp . x . toDouble ()). toFloat () ĊĠĠĠĠĠĠĠ Ġvar Ġangle Ġ= ĠMath . to Degrees ( angle 1 Ġ- Ġangle 2 . toDouble ()). toFloat () Ġ% Ġ 3 6 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( angle Ġ< Ġ- 1 8 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġangle Ġ+= Ġ 3 6 0 . 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( angle Ġ> Ġ 1 8 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġangle Ġ-= Ġ 3 6 0 . 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġangle ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlength (): ĠFloat Ġ= Ġsqrt ( x . toDouble (). pow ( 2 . 0 ) Ġ+ Ġy . toDouble (). pow ( 2 . 0 )). toFloat () ĊĊĠĠĠ Ġfun Ġdistance ( p : ĠPoint 2 f ): ĠFloat Ġ= Ġsqrt (( p . x Ġ- Ġx . toDouble ()). pow ( 2 . 0 ) Ġ+ Ġ( p . y Ġ- Ġy . toDouble ()). pow ( 2 . 0 )). toFloat () ĊĊĠĠĠ Ġfun Ġdistance ( px : ĠFloat , Ġpy : ĠFloat ): ĠFloat Ġ= Ġsqrt (( px Ġ- Ġx . toDouble ()). pow ( 2 . 0 ) Ġ+ Ġ( py Ġ- Ġy . toDouble ()). pow ( 2 . 0 )). toFloat () ĊĊĠĠĠ Ġfun Ġdot ( p : ĠPoint 2 f ): ĠFloat Ġ= Ġx Ġ* Ġp . x Ġ+ Ġy Ġ* Ġp . y ĊĊĠĠĠ Ġfun Ġadd ( v : ĠFloat ): ĠPoint 2 f Ġ= Ġset ( x Ġ+ Ġv , Ġy Ġ+ Ġv ) ĊĊĠĠĠ Ġfun Ġadd ( vx : ĠFloat , Ġvy : ĠFloat ): ĠPoint 2 f Ġ= Ġset ( x Ġ+ Ġvx , Ġy Ġ+ Ġvy ) ĊĊĠĠĠ Ġfun Ġadd ( p : ĠPoint 2 f ): ĠPoint 2 f Ġ= Ġset ( x Ġ+ Ġp . x , Ġy Ġ+ Ġp . y ) ĊĊĠĠĠ Ġfun Ġadded ( p : ĠPoint 2 f ): ĠPoint 2 f Ġ= ĠPoint 2 f ( x Ġ+ Ġp . x , Ġy Ġ+ Ġp . y ) ĊĊĠĠĠ Ġfun Ġadded ( vx : ĠFloat , Ġvy : ĠFloat ): ĠPoint 2 f Ġ= ĠPoint 2 f ( x Ġ+ Ġvx , Ġy Ġ+ Ġvy ) ĊĊĠĠĠ Ġfun Ġsub ( p : ĠPoint 2 f ): ĠPoint 2 f Ġ= Ġset ( x Ġ- Ġp . x , Ġy Ġ- Ġp . y ) ĊĊĠĠĠ Ġfun Ġsub ( vx : ĠFloat , Ġvy : ĠFloat ): ĠPoint 2 f Ġ= Ġset ( x Ġ- Ġvx , Ġy Ġ- Ġvy ) ĊĊĠĠĠ Ġfun Ġsub ed ( p : ĠPoint 2 f ): ĠPoint 2 f Ġ= ĠPoint 2 f ( x Ġ- Ġp . x , Ġy Ġ- Ġp . y ) ĊĊĠĠĠ Ġfun Ġsub ed ( vx : ĠFloat , Ġvy : ĠFloat ): ĠPoint 2 f Ġ= ĠPoint 2 f ( x Ġ- Ġvx , Ġy Ġ- Ġvy ) ĊĊĠĠĠ Ġfun Ġmult ( v : ĠFloat ): ĠPoint 2 f Ġ= Ġset ( x Ġ* Ġv , Ġy Ġ* Ġv ) ĊĊĠĠĠ Ġfun Ġmult ( p : ĠPoint 2 f ): ĠPoint 2 f Ġ= Ġset ( x Ġ* Ġp . x , Ġy Ġ* Ġp . y ) ĊĊĠĠĠ Ġfun Ġmult ( vx : ĠFloat , Ġvy : ĠFloat ): ĠPoint 2 f Ġ= Ġset ( x Ġ* Ġvx , Ġy Ġ* Ġvy ) ĊĊĠĠĠ Ġfun Ġdiv ( v : ĠFloat ): ĠPoint 2 f Ġ= Ġset ( x Ġ/ Ġv , Ġy Ġ/ Ġv ) ĊĊĠĠĠ Ġfun Ġdiv ( p : ĠPoint 2 f ): ĠPoint 2 f Ġ= Ġset ( x Ġ/ Ġp . x , Ġy Ġ/ Ġp . y ) ĊĊĠĠĠ Ġfun Ġdiv ( vx : ĠFloat , Ġvy : ĠFloat ): ĠPoint 2 f Ġ= Ġset ( x Ġ/ Ġvx , Ġy Ġ/ Ġvy ) ĊĊĠĠĠ Ġfun Ġmult ed ( v : ĠFloat ): ĠPoint 2 f Ġ= ĠPoint 2 f ( x Ġ* Ġv , Ġy Ġ* Ġv ) ĊĊĠĠĠ Ġfun Ġmult ed ( p : ĠPoint 2 f ): ĠPoint 2 f Ġ= ĠPoint 2 f ( x Ġ* Ġp . x , Ġy Ġ* Ġp . y ) ĊĊĠĠĠ Ġfun Ġdiv ed ( v : ĠFloat ): ĠPoint 2 f Ġ= ĠPoint 2 f ( x Ġ/ Ġv , Ġy Ġ/ Ġv ) ĊĊĠĠĠ Ġfun Ġdiv ed ( p : ĠPoint 2 f ): ĠPoint 2 f Ġ= ĠPoint 2 f ( x Ġ/ Ġp . x , Ġy Ġ/ Ġp . y ) ĊĊĠĠĠ Ġfun Ġnormalize (): ĠPoint 2 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġsqrt ( x Ġ* Ġx Ġ+ Ġy Ġ* Ġy . toDouble ()). toFloat () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( len Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ/= Ġlen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ/= Ġlen ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnormalized (): ĠPoint 2 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġsqrt ( x Ġ* Ġx Ġ+ Ġy Ġ* Ġy ) ĊĠĠĠĠĠĠĠ Ġvar Ġnew X Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġvar Ġnew Y Ġ= Ġy ĊĊĠĠĠĠĠĠĠ Ġif Ġ( len Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew X Ġ= Ġx Ġ/ Ġlen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Y Ġ= Ġy Ġ/ Ġlen ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPoint 2 f ( new X , Ġnew Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ"$ x , Ġ$ y " Ċ }