package Ġcom . le ha ine . little kt . math Ċ Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . sin Ċ import Ġkotlin . math . sqrt Ċ Ċ /** Ċ Ġ* Ġ@ author ĠCol ton ĠDaily Ċ Ġ* Ġ@ date Ġ 1 1 / 2 3 / 2 0 2 1 Ċ Ġ*/ Ċ open Ġclass ĠVec 3 f ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ) Ġ{ ĊĊĠĠĠ Ġprotected Ġval Ġfields Ġ= ĠFloat Array ( 3 ) ĊĊĠĠĠ Ġopen Ġval Ġx Ġget () Ġ= Ġthis [ 0 ] ĊĠĠĠ Ġopen Ġval Ġy Ġget () Ġ= Ġthis [ 1 ] ĊĠĠĠ Ġopen Ġval Ġz Ġget () Ġ= Ġthis [ 2 ] ĊĊĠĠĠ Ġconstructor ( f : ĠFloat ) Ġ: Ġthis ( f , Ġf , Ġf ) ĊĠĠĠ Ġconstructor ( v : ĠVec 3 f ) Ġ: Ġthis ( v . x , Ġv . y , Ġv . z ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfields [ 0 ] Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġfields [ 1 ] Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġfields [ 2 ] Ġ= Ġz ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ( other : ĠVec 3 f , Ġresult : ĠMutable Vec 3 f ): ĠMutable Vec 3 f Ġ= Ġresult . set ( this ). add ( other ) ĊĊĠĠĠ Ġfun Ġcross ( other : ĠVec 3 f , Ġresult : ĠMutable Vec 3 f ): ĠMutable Vec 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . x Ġ= Ġy Ġ* Ġother . z Ġ- Ġz Ġ* Ġother . y ĊĠĠĠĠĠĠĠ Ġresult . y Ġ= Ġz Ġ* Ġother . x Ġ- Ġx Ġ* Ġother . z ĊĠĠĠĠĠĠĠ Ġresult . z Ġ= Ġx Ġ* Ġother . y Ġ- Ġy Ġ* Ġother . x ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdistance ( other : ĠVec 3 f ): ĠFloat Ġ= Ġsqrt ( sqr Distance ( other )) ĊĊĠĠĠ Ġfun Ġdot ( other : ĠVec 3 f ): ĠFloat Ġ= Ġx Ġ* Ġother . x Ġ+ Ġy Ġ* Ġother . y Ġ+ Ġz Ġ* Ġother . z ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġvector Ġcomponents Ġfor Ġequality Ġusing Ġ[ com . le ha ine . little kt . math . is F uzzy Equal ], Ġthat Ġis Ġall Ġcomponents Ġmust ĊĠĠĠĠ Ġ* Ġhave Ġa Ġdifference Ġless Ġor Ġequal Ġ[ eps ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis F uzzy Equal ( other : ĠVec 3 f , Ġeps : ĠFloat Ġ= ĠF U ZZ Y _ EQ _ F ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġis F uzzy Equal ( x , Ġother . x , Ġeps ) Ġ&& Ġis F uzzy Equal ( y , Ġother . y , Ġeps ) Ġ&& Ġis F uzzy Equal ( z , Ġother . z , Ġeps ) ĊĊĠĠĠ Ġfun Ġlength (): ĠFloat Ġ= Ġsqrt ( sqr Length ()) ĊĊĠĠĠ Ġfun Ġmix ( other : ĠVec 3 f , Ġweight : ĠFloat , Ġresult : ĠMutable Vec 3 f ): ĠMutable Vec 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . x Ġ= Ġother . x Ġ* Ġweight Ġ+ Ġx Ġ* Ġ( 1 f Ġ- Ġweight ) ĊĠĠĠĠĠĠĠ Ġresult . y Ġ= Ġother . y Ġ* Ġweight Ġ+ Ġy Ġ* Ġ( 1 f Ġ- Ġweight ) ĊĠĠĠĠĠĠĠ Ġresult . z Ġ= Ġother . z Ġ* Ġweight Ġ+ Ġz Ġ* Ġ( 1 f Ġ- Ġweight ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmul ( other : ĠVec 3 f , Ġresult : ĠMutable Vec 3 f ): ĠMutable Vec 3 f Ġ= Ġresult . set ( this ). mul ( other ) ĊĊĠĠĠ Ġfun Ġnorm ( result : ĠMutable Vec 3 f ): ĠMutable Vec 3 f Ġ= Ġresult . set ( this ). norm () ĊĊĠĠĠ Ġfun Ġplane Space ( p : ĠMutable Vec 3 f , Ġq : ĠMutable Vec 3 f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( abs ( z ) Ġ> ĠS Q RT _ 1 _ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġchoose Ġp Ġin Ġy - z Ġplane ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġy Ġ* Ġy Ġ+ Ġz Ġ* Ġz ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk Ġ= Ġ 1 f Ġ/ Ġsqrt ( a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . x Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . y Ġ= Ġ- z Ġ* Ġk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . z Ġ= Ġy Ġ* Ġk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġq Ġ= Ġthis Ġx Ġp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq . x Ġ= Ġa Ġ* Ġk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq . y Ġ= Ġ- x Ġ* Ġp . z ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq . z Ġ= Ġx Ġ* Ġp . y ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġchoose Ġp Ġin Ġx - y Ġplane ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġx Ġ* Ġx Ġ+ Ġy Ġ* Ġy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk Ġ= Ġ 1 f Ġ/ Ġsqrt ( a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . x Ġ= Ġ- y Ġ* Ġk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . y Ġ= Ġx Ġ* Ġk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . z Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġq Ġ= Ġthis Ġx Ġp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq . x Ġ= Ġ- z Ġ* Ġp . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq . y Ġ= Ġz Ġ* Ġp . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq . z Ġ= Ġa Ġ* Ġk ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrotate ( angle Deg : ĠFloat , Ġaxis X : ĠFloat , Ġaxis Y : ĠFloat , Ġaxis Z : ĠFloat , Ġresult : ĠMutable Vec 3 f ): ĠMutable Vec 3 f Ġ= ĊĠĠĠĠĠĠĠ Ġresult . set ( this ). rotate ( angle Deg , Ġaxis X , Ġaxis Y , Ġaxis Z ) ĊĊĠĠĠ Ġfun Ġrotate ( angle Deg : ĠFloat , Ġaxis : ĠVec 3 f , Ġresult : ĠMutable Vec 3 f ): ĠMutable Vec 3 f Ġ= ĊĠĠĠĠĠĠĠ Ġresult . set ( this ). rotate ( angle Deg , Ġaxis . x , Ġaxis . y , Ġaxis . z ) ĊĊĠĠĠ Ġfun Ġscale ( factor : ĠFloat , Ġresult : ĠMutable Vec 3 f ): ĠMutable Vec 3 f Ġ= Ġresult . set ( this ). scale ( factor ) ĊĊĠĠĠ Ġfun Ġsq r Distance ( other : ĠVec 3 f ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġx Ġ- Ġother . x ĊĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġy Ġ- Ġother . y ĊĠĠĠĠĠĠĠ Ġval Ġdz Ġ= Ġz Ġ- Ġother . z ĊĠĠĠĠĠĠĠ Ġreturn Ġdx Ġ* Ġdx Ġ+ Ġdy Ġ* Ġdy Ġ+ Ġdz Ġ* Ġdz ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsq r Length (): ĠFloat Ġ= Ġx Ġ* Ġx Ġ+ Ġy Ġ* Ġy Ġ+ Ġz Ġ* Ġz ĊĊĠĠĠ Ġfun Ġsubtract ( other : ĠVec 3 f , Ġresult : ĠMutable Vec 3 f ): ĠMutable Vec 3 f Ġ= Ġresult . set ( this ). subtract ( other ) ĊĊĠĠĠ Ġopen Ġoperator Ġfun Ġget ( i : ĠInt ) Ġ= Ġfields [ i ] ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠVec 3 f ): ĠFloat Ġ= Ġdot ( other ) ĊĊĠĠĠ Ġfun Ġto Vec (): ĠVec 3 f Ġ= ĠVec 3 f ( x , Ġy , Ġz ) ĊĊĠĠĠ Ġfun Ġto Mutable Vec (): ĠMutable Vec 3 f Ġ= Ġto Mutable Vec ( Mutable Vec 3 f ()) ĊĊĠĠĠ Ġfun Ġto Mutable Vec ( result : ĠMutable Vec 3 f ): ĠMutable Vec 3 f Ġ= Ġresult . set ( x , Ġy , Ġz ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" ($ x , Ġ$ y , Ġ$ z )" ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġvector Ġcomponents Ġfor Ġequality Ġ( using Ġ' ==' Ġoperator ). ĠFor Ġbetter Ġnumeric Ġstability Ġconsider Ġusing ĊĠĠĠĠ Ġ* Ġ[ is F uzzy Equal ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠVec 3 f ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( x Ġ!= Ġother . x ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( y Ġ!= Ġother . y ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( z Ġ!= Ġother . z ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġx . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġy . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġz . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠZERO Ġ= ĠVec 3 f ( 0 f ) ĊĠĠĠĠĠĠĠ Ġval ĠON ES Ġ= ĠVec 3 f ( 1 f ) ĊĠĠĠĠĠĠĠ Ġval ĠX _ AXIS Ġ= ĠVec 3 f ( 1 f , Ġ 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġval ĠY _ AXIS Ġ= ĠVec 3 f ( 0 f , Ġ 1 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġval ĠZ _ AXIS Ġ= ĠVec 3 f ( 0 f , Ġ 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġval ĠNE G _ X _ AXIS Ġ= ĠVec 3 f (- 1 f , Ġ 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġval ĠNE G _ Y _ AXIS Ġ= ĠVec 3 f ( 0 f , Ġ- 1 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġval ĠNE G _ Z _ AXIS Ġ= ĠVec 3 f ( 0 f , Ġ 0 f , Ġ- 1 f ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠMutable Vec 3 f ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ) Ġ: ĠVec 3 f ( x , Ġy , Ġz ) Ġ{ ĊĊĠĠĠ Ġoverride Ġvar Ġx ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis [ 0 ] ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 0 ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġvar Ġy ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis [ 1 ] ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 1 ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġvar Ġz ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis [ 2 ] ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 2 ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġarray : ĠFloat Array ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfields ĊĊĠĠĠ Ġconstructor () Ġ: Ġthis ( 0 f , Ġ 0 f , Ġ 0 f ) ĊĠĠĠ Ġconstructor ( f : ĠFloat ) Ġ: Ġthis ( f , Ġf , Ġf ) ĊĠĠĠ Ġconstructor ( v : ĠVec 3 f ) Ġ: Ġthis ( v . x , Ġv . y , Ġv . z ) ĊĊĠĠĠ Ġfun Ġadd ( other : ĠVec 3 f ): ĠMutable Vec 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ+= Ġother . x ĊĠĠĠĠĠĠĠ Ġy Ġ+= Ġother . y ĊĠĠĠĠĠĠĠ Ġz Ġ+= Ġother . z ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ): ĠMutable Vec 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . x Ġ+= Ġx ĊĠĠĠĠĠĠĠ Ġthis . y Ġ+= Ġy ĊĠĠĠĠĠĠĠ Ġthis . z Ġ+= Ġz ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmul ( other : ĠVec 3 f ): ĠMutable Vec 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ*= Ġother . x ĊĠĠĠĠĠĠĠ Ġy Ġ*= Ġother . y ĊĠĠĠĠĠĠĠ Ġz Ġ*= Ġother . z ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmul ( matrix : ĠMat 4 ): ĠMutable Vec 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew X Ġ= Ġx Ġ* Ġmatrix [ 0 ] Ġ+ Ġy Ġ* Ġmatrix [ 4 ] Ġ+ Ġz Ġ* Ġmatrix [ 8 ] Ġ+ Ġmatrix [ 1 2 ] ĊĠĠĠĠĠĠĠ Ġval Ġnew Y Ġ= Ġx Ġ* Ġmatrix [ 1 ] Ġ+ Ġy Ġ* Ġmatrix [ 5 ] Ġ+ Ġz Ġ* Ġmatrix [ 9 ] Ġ+ Ġmatrix [ 1 3 ] ĊĠĠĠĠĠĠĠ Ġval Ġnew Z Ġ= Ġx Ġ* Ġmatrix [ 2 ] Ġ+ Ġy Ġ* Ġmatrix [ 6 ] Ġ+ Ġz Ġ* Ġmatrix [ 1 0 ] Ġ+ Ġmatrix [ 1 4 ] ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġnew X ĊĠĠĠĠĠĠĠ Ġy Ġ= Ġnew Y ĊĠĠĠĠĠĠĠ Ġz Ġ= Ġnew Z ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnorm (): ĠMutable Vec 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġlength () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( l Ġ!= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale ( 1 f Ġ/ Ġl ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( ZERO ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcross ( other : ĠVec 3 f ): ĠMutable Vec 3 f Ġ= Ġcross ( other , Ġthis ) ĊĊĠĠĠ Ġfun Ġrotate ( angle Deg : ĠFloat , Ġaxis X : ĠFloat , Ġaxis Y : ĠFloat , Ġaxis Z : ĠFloat ): ĠMutable Vec 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrad Ġ= Ġangle Deg . to Rad () ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġcos ( rad ) ĊĠĠĠĠĠĠĠ Ġval Ġc 1 Ġ= Ġ 1 f Ġ- Ġc ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġsin ( rad ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrx Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ* Ġ( axis X Ġ* Ġaxis X Ġ* Ġc 1 Ġ+ Ġc ) Ġ+ Ġy Ġ* Ġ( axis X Ġ* Ġaxis Y Ġ* Ġc 1 Ġ- Ġaxis Z Ġ* Ġs ) Ġ+ Ġz Ġ* Ġ( axis X Ġ* Ġaxis Z Ġ* Ġc 1 Ġ+ Ġaxis Y Ġ* Ġs ) ĊĠĠĠĠĠĠĠ Ġval Ġry Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ* Ġ( axis Y Ġ* Ġaxis X Ġ* Ġc 1 Ġ+ Ġaxis Z Ġ* Ġs ) Ġ+ Ġy Ġ* Ġ( axis Y Ġ* Ġaxis Y Ġ* Ġc 1 Ġ+ Ġc ) Ġ+ Ġz Ġ* Ġ( axis Y Ġ* Ġaxis Z Ġ* Ġc 1 Ġ- Ġaxis X Ġ* Ġs ) ĊĠĠĠĠĠĠĠ Ġval Ġr z Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ* Ġ( axis X Ġ* Ġaxis Z Ġ* Ġc 1 Ġ- Ġaxis Y Ġ* Ġs ) Ġ+ Ġy Ġ* Ġ( axis Y Ġ* Ġaxis Z Ġ* Ġc 1 Ġ+ Ġaxis X Ġ* Ġs ) Ġ+ Ġz Ġ* Ġ( axis Z Ġ* Ġaxis Z Ġ* Ġc 1 Ġ+ Ġc ) ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġrx ĊĠĠĠĠĠĠĠ Ġy Ġ= Ġry ĊĠĠĠĠĠĠĠ Ġz Ġ= Ġr z ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrotate ( angle Deg : ĠFloat , Ġaxis : ĠVec 3 f ): ĠMutable Vec 3 f Ġ= Ġrotate ( angle Deg , Ġaxis . x , Ġaxis . y , Ġaxis . z ) ĊĊĠĠĠ Ġfun Ġscale ( factor : ĠFloat ): ĠMutable Vec 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ*= Ġfactor ĊĠĠĠĠĠĠĠ Ġy Ġ*= Ġfactor ĊĠĠĠĠĠĠĠ Ġz Ġ*= Ġfactor ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ): ĠMutable Vec 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . x Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġthis . y Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġthis . z Ġ= Ġz ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset ( other : ĠVec 3 f ): ĠMutable Vec 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġother . x ĊĠĠĠĠĠĠĠ Ġy Ġ= Ġother . y ĊĠĠĠĠĠĠĠ Ġz Ġ= Ġother . z ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsubtract ( other : ĠVec 3 f ): ĠMutable Vec 3 f Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ-= Ġother . x ĊĠĠĠĠĠĠĠ Ġy Ġ-= Ġother . y ĊĠĠĠĠĠĠĠ Ġz Ġ-= Ġother . z ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġdiv Assign ( div : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscale ( 1 f Ġ/ Ġdiv ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġminus Assign ( other : ĠVec 3 f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsubtract ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus Assign ( other : ĠVec 3 f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġoperator Ġfun Ġset ( i : ĠInt , Ġv : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfields [ i ] Ġ= Ġv ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes Assign ( factor : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscale ( factor ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠVec 3 i ( x : ĠInt , Ġy : ĠInt , Ġz : ĠInt ) Ġ{ ĊĊĠĠĠ Ġprotected Ġval Ġfields Ġ= ĠInt Array ( 3 ) ĊĊĠĠĠ Ġopen Ġval Ġx Ġget () Ġ= Ġthis [ 0 ] ĊĠĠĠ Ġopen Ġval Ġy Ġget () Ġ= Ġthis [ 1 ] ĊĠĠĠ Ġopen Ġval Ġz Ġget () Ġ= Ġthis [ 2 ] ĊĊĠĠĠ Ġconstructor ( f : ĠInt ) Ġ: Ġthis ( f , Ġf , Ġf ) ĊĠĠĠ Ġconstructor ( v : ĠVec 3 i ) Ġ: Ġthis ( v . x , Ġv . y , Ġv . z ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfields [ 0 ] Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġfields [ 1 ] Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġfields [ 2 ] Ġ= Ġz ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġoperator Ġfun Ġget ( i : ĠInt ): ĠInt Ġ= Ġfields [ i ] ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" ($ x , Ġ$ y , Ġ$ z )" ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠVec 3 i ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( x Ġ!= Ġother . x ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( y Ġ!= Ġother . y ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( z Ġ!= Ġother . z ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġx . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġy . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġz . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠZERO Ġ= ĠVec 3 i ( 0 ) ĊĠĠĠĠĠĠĠ Ġval ĠX _ AXIS Ġ= ĠVec 3 i ( 1 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval ĠY _ AXIS Ġ= ĠVec 3 i ( 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval ĠZ _ AXIS Ġ= ĠVec 3 i ( 0 , Ġ 0 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval ĠNE G _ X _ AXIS Ġ= ĠVec 3 i (- 1 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval ĠNE G _ Y _ AXIS Ġ= ĠVec 3 i ( 0 , Ġ- 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval ĠNE G _ Z _ AXIS Ġ= ĠVec 3 i ( 0 , Ġ 0 , Ġ- 1 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠMutable Vec 3 i ( x : ĠInt , Ġy : ĠInt , Ġz : ĠInt ) Ġ: ĠVec 3 i ( x , Ġy , Ġz ) Ġ{ ĊĊĠĠĠ Ġoverride Ġvar Ġx ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis [ 0 ] ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 0 ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġvar Ġy ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis [ 1 ] ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 1 ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġvar Ġz ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis [ 2 ] ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 2 ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġarray : ĠInt Array ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfields ĊĊĠĠĠ Ġconstructor () Ġ: Ġthis ( 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġconstructor ( f : ĠInt ) Ġ: Ġthis ( f , Ġf , Ġf ) ĊĠĠĠ Ġconstructor ( other : ĠVec 3 i ) Ġ: Ġthis ( other . x , Ġother . y , Ġother . z ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfields [ 0 ] Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġfields [ 1 ] Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġfields [ 2 ] Ġ= Ġz ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset ( x : ĠInt , Ġy : ĠInt , Ġz : ĠInt ): ĠMutable Vec 3 i Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . x Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġthis . y Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġthis . z Ġ= Ġz ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset ( other : ĠVec 3 i ): ĠMutable Vec 3 i Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġother . x ĊĠĠĠĠĠĠĠ Ġy Ġ= Ġother . y ĊĠĠĠĠĠĠĠ Ġz Ġ= Ġother . z ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġoperator Ġfun Ġset ( i : ĠInt , Ġv : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfields [ i ] Ġ= Ġv ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ( other : ĠVec 3 i ): ĠMutable Vec 3 i Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ+= Ġother . x ĊĠĠĠĠĠĠĠ Ġy Ġ+= Ġother . y ĊĠĠĠĠĠĠĠ Ġz Ġ+= Ġother . z ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ( x : ĠInt , Ġy : ĠInt , Ġz : ĠInt ): ĠMutable Vec 3 i Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . x Ġ+= Ġx ĊĠĠĠĠĠĠĠ Ġthis . y Ġ+= Ġy ĊĠĠĠĠĠĠĠ Ġthis . z Ġ+= Ġz ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsubtract ( other : ĠVec 3 i ): ĠMutable Vec 3 i Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ-= Ġother . x ĊĠĠĠĠĠĠĠ Ġy Ġ-= Ġother . y ĊĠĠĠĠĠĠĠ Ġz Ġ-= Ġother . z ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} Ċ } Ċ