package Ġde . k od ier er . kr ay tracer . base Ċ Ċ import Ġplatform . posix . pow Ċ import Ġkotlin . math . sqrt Ċ import Ġkotlin . random . Random Ċ Ċ data Ġclass ĠVector ( var Ġx : ĠFloat Ġ= Ġ 0 f , Ġvar Ġy : ĠFloat Ġ= Ġ 0 f , Ġvar Ġz : ĠFloat Ġ= Ġ 0 f ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġrandom Unit In Disc (): ĠVector Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġp : ĠVector ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Ġ= Ġ 2 . 0 f Ġ* ĠVector ( Random . next Float (), ĠRandom . next Float (), Ġ 0 f ) Ġ- ĠVector ( 1 f , Ġ 1 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( dot ( p , Ġp ) Ġ>= Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġp ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrandom In Unit Sphere (): ĠVector Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġp : ĠVector ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Ġ= Ġ 2 . 0 f Ġ* ĠVector ( Random . next Float (), ĠRandom . next Float (), ĠRandom . next Float ()) Ġ- ĠVector ( 1 f , Ġ 1 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( p . squared Length () Ġ>= Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġp ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠVector ) Ġ= ĠVector ( x Ġ+ Ġother . x , Ġy Ġ+ Ġother . y , Ġz Ġ+ Ġother . z ) ĊĠĠĠ Ġoperator Ġfun Ġminus ( other : ĠVector ) Ġ= ĠVector ( x Ġ- Ġother . x , Ġy Ġ- Ġother . y , Ġz Ġ- Ġother . z ) ĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠVector ) Ġ= ĠVector ( x Ġ* Ġother . x , Ġy Ġ* Ġother . y , Ġz Ġ* Ġother . z ) ĊĠĠĠ Ġoperator Ġfun Ġdiv ( other : ĠVector ) Ġ= ĠVector ( x Ġ/ Ġother . x , Ġy Ġ/ Ġother . y , Ġz Ġ/ Ġother . z ) ĊĠĠĠ Ġoperator Ġfun Ġunary Minus () Ġ= ĠVector (- x , Ġ- y , Ġ- z ) ĊĊĠĠĠ Ġoperator Ġfun Ġplus Assign ( other : ĠVector ) Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ+= Ġother . x ĊĠĠĠĠĠĠĠ Ġy Ġ+= Ġother . y ĊĠĠĠĠĠĠĠ Ġz Ġ+= Ġother . z ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġminus Assign ( other : ĠVector ) Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ-= Ġother . x ĊĠĠĠĠĠĠĠ Ġy Ġ-= Ġother . y ĊĠĠĠĠĠĠĠ Ġz Ġ-= Ġother . z ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes Assign ( other : ĠVector ) Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ*= Ġother . x ĊĠĠĠĠĠĠĠ Ġy Ġ*= Ġother . y ĊĠĠĠĠĠĠĠ Ġz Ġ*= Ġother . z ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġdiv Assign ( other : ĠVector ) Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ/= Ġother . x ĊĠĠĠĠĠĠĠ Ġy Ġ/= Ġother . y ĊĠĠĠĠĠĠĠ Ġz Ġ/= Ġother . z ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( factor : ĠFloat ) Ġ= ĠVector ( x Ġ* Ġfactor , Ġy Ġ* Ġfactor , Ġz Ġ* Ġfactor ) ĊĠĠĠ Ġoperator Ġfun Ġdiv ( factor : ĠFloat ) Ġ= ĠVector ( x Ġ/ Ġfactor , Ġy Ġ/ Ġfactor , Ġz Ġ/ Ġfactor ) ĊĊĠĠĠ Ġoperator Ġfun Ġtimes Assign ( factor : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ*= Ġfactor ĊĠĠĠĠĠĠĠ Ġy Ġ*= Ġfactor ĊĠĠĠĠĠĠĠ Ġz Ġ*= Ġfactor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġdiv Assign ( factor : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ/= Ġfactor ĊĠĠĠĠĠĠĠ Ġy Ġ/= Ġfactor ĊĠĠĠĠĠĠĠ Ġz Ġ/= Ġfactor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġinc (): ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ+= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġy Ġ+= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġz Ġ+= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġdec (): ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ-= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġy Ġ-= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġz Ġ-= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlength () Ġ= Ġsqrt ( x Ġ* Ġx Ġ+ Ġy Ġ* Ġy Ġ+ Ġz Ġ* Ġz ) ĊĠĠĠ Ġfun Ġsquared Length () Ġ= Ġx Ġ* Ġx Ġ+ Ġy Ġ* Ġy Ġ+ Ġz Ġ* Ġz ĊĊĠĠĠ Ġfun Ġunit Vector (): ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġ/ Ġthis . length () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Unit Vector (): ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ġ/= Ġthis . length () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Int String () Ġ= Ġ"${ x . toInt ()} Ġ${ y . toInt ()} Ġ${ z . toInt () }" ĊĊĠĠĠ Ġfun Ġapply To All ( lambda : Ġ( Float ) Ġ-> ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġlambda ( x ) ĊĠĠĠĠĠĠĠ Ġy Ġ= Ġlambda ( y ) ĊĠĠĠĠĠĠĠ Ġz Ġ= Ġlambda ( z ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ /** Ċ Ġ* Ġdot Ġproduct Ġa ka Ġscalar Ġproduct Ġa ka Ġinner Ġproduct Ċ Ġ* Ċ Ġ* ĠIf Ġthe Ġdot Ġproduct Ġof Ġtwo Ġnon Ġzero Ġvectors Ġis Ġzero , Ġthen Ġthese Ġvectors Ġare Ġor thogonal Ċ Ġ*/ Ċ fun Ġdot ( a : ĠVector , Ġb : ĠVector ) Ġ= Ġa . x Ġ* Ġb . x Ġ+ Ġa . y Ġ* Ġb . y Ġ+ Ġa . z Ġ* Ġb . z Ċ Ċ /** Ċ Ġ* ĠCross Ġproduct Ġa ka Ġvector Ġproduct Ċ Ġ* Ċ Ġ* ĠGiven Ġtwo Ġlinear ly Ġindependent Ġvectors Ġthe Ġcross Ġproduct Ġis Ġa Ġvector Ġthat Ġis Ċ Ġ* Ġper pend icular Ġto Ġboth Ġvectors Ġand Ġthus Ġnormal Ġto Ġthe Ġplane Ġcontaining Ġthem . Ċ Ġ* Ċ Ġ* ĠIf Ġtwo Ġvectors Ġhave Ġthe Ġsame Ġdirection , Ġare Ġexact Ġopposite , Ġor Ġone Ġof Ġthem Ġhas Ġzero Ġlength Ċ Ġ* Ġthen Ġtheir Ġcross Ġproduct Ġis Ġzero . Ċ Ġ*/ Ċ fun Ġcross ( a : ĠVector , Ġb : ĠVector ) Ġ= ĠVector (( a . y Ġ* Ġb . z Ġ- Ġa . z Ġ* Ġb . y ), Ġ-( a . x Ġ* Ġb . z Ġ- Ġa . z Ġ* Ġb . x ), Ġ( a . x Ġ* Ġb . y Ġ- Ġa . y Ġ* Ġb . x )) Ċ Ċ fun Ġl erp ( x 1 : ĠVector , Ġx 2 : ĠVector , Ġt : ĠFloat ): ĠVector Ġ= Ġ( 1 f Ġ- Ġt ) Ġ* Ġx 1 Ġ+ Ġt Ġ* Ġx 2 Ċ Ċ operator Ġfun ĠFloat . plus ( v : ĠVector ) Ġ= ĠVector ( this Ġ+ Ġv . x , Ġthis Ġ+ Ġv . y , Ġthis Ġ+ Ġv . z ) Ċ operator Ġfun ĠFloat . minus ( v : ĠVector ) Ġ= ĠVector ( this Ġ- Ġv . x , Ġthis Ġ- Ġv . y , Ġthis Ġ- Ġv . z ) Ċ operator Ġfun ĠFloat . times ( v : ĠVector ) Ġ= ĠVector ( this Ġ* Ġv . x , Ġthis Ġ* Ġv . y , Ġthis Ġ* Ġv . z ) Ċ operator Ġfun ĠFloat . div ( v : ĠVector ) Ġ= ĠVector ( this Ġ/ Ġv . x , Ġthis Ġ/ Ġv . y , Ġthis Ġ/ Ġv . z ) Ċ Ċ /** Ċ Ġ* Ġ\ ĠĠĠĠ Ġ/ | Ċ Ġ* Ġ Ġ\ v Ġr / Ġ| ĠB Ċ Ġ* ĠĠ Ġ\ Ġ/ Ġ Ġ| Ċ Ġ* Ġ Ġ-- * ----- Ċ Ġ* ĠĠĠĠ Ġ\ Ġ Ġ| Ċ Ġ* ĠĠĠĠĠ Ġ\ v | ĠB Ċ Ġ* ĠĠĠĠĠĠ Ġ\| Ċ Ġ* Ċ Ġ* Ġlength Ġof ĠB Ġ= Ġv Ġdot Ġn Ċ Ġ* Ġdirection Ġof ĠB Ġis Ġn Ċ Ġ*/ Ċ fun Ġreflect ( v : ĠVector , Ġn : ĠVector ) Ġ= Ġv Ġ- Ġ 2 . 0 f Ġ* Ġdot ( v , Ġn ) Ġ* Ġn ĊĊ Ċ fun Ġre fract ( v : ĠVector , Ġn : ĠVector , Ġni Over Nt : ĠFloat ): ĠVector ? Ġ{ ĊĠĠĠ Ġval Ġuv Ġ= Ġv . unit Vector () ĊĠĠĠ Ġval Ġdt Ġ= Ġdot ( uv , Ġn ) ĊĠĠĠ Ġval Ġdis crimin ant Ġ= Ġ 1 . 0 f Ġ- Ġni Over Nt Ġ* Ġni Over Nt Ġ* Ġ( 1 Ġ- Ġdt Ġ* Ġdt ) ĊĠĠĠ Ġif Ġ( dis crimin ant Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġni Over Nt Ġ* Ġ( uv Ġ- Ġn Ġ* Ġdt ) Ġ- Ġn Ġ* Ġsqrt ( dis crimin ant ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ fun Ġsch lick ( cos ine : ĠFloat , Ġref _ idx : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠ Ġvar Ġr 0 Ġ= Ġ( 1 Ġ- Ġref _ idx ) Ġ/ Ġ( 1 Ġ+ Ġref _ idx ) ĊĠĠĠ Ġr 0 Ġ*= Ġr 0 ĊĠĠĠ Ġreturn Ġr 0 Ġ+ Ġ( 1 f Ġ- Ġr 0 ) Ġ* Ġpow (( 1 . 0 Ġ- Ġcos ine ), Ġ 5 . 0 ). toFloat () Ċ }