package Ġcom . ark iv an ov . compose 3 d Ċ Ċ import Ġkotlin . math . PI Ċ import Ġkotlin . math . acos Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . sin Ċ import Ġkotlin . math . sqrt Ċ Ċ val ĠUNIT _ O _ X Ġ= ĠVector ( x Ġ= Ġ 1 . 0 ) Ċ val ĠUNIT _ O _ Y Ġ= ĠVector ( y Ġ= Ġ 1 . 0 ) Ċ val ĠUNIT _ O _ Z Ġ= ĠVector ( z Ġ= Ġ 1 . 0 ) Ċ Ċ fun ĠVector . length (): ĠDouble Ġ= Ġsqrt ( x Ġ* Ġx Ġ+ Ġy Ġ* Ġy Ġ+ Ġz Ġ* Ġz ) Ċ Ċ fun ĠVector . normalize (): ĠVector Ġ{ ĊĠĠĠ Ġval Ġlen Ġ= Ġlength (). take Unless Ġ{ Ġit Ġ== Ġ 0 . 0 Ġ} Ġ?: Ġreturn Ġthis ĊĊĠĠĠ Ġreturn Ġcopy ( x Ġ= Ġx Ġ/ Ġlen , Ġy Ġ= Ġy Ġ/ Ġlen , Ġz Ġ= Ġz Ġ/ Ġlen ) Ċ } Ċ Ċ fun ĠVector . offset ( x : ĠDouble Ġ= Ġ 0 . 0 , Ġy : ĠDouble Ġ= Ġ 0 . 0 , Ġz : ĠDouble Ġ= Ġ 0 . 0 ): ĠVector Ġ= ĊĠĠĠ Ġcopy ( x Ġ= Ġthis . x Ġ+ Ġx , Ġy Ġ= Ġthis . y Ġ+ Ġy , Ġz Ġ= Ġthis . z Ġ+ Ġz ) Ċ Ċ operator Ġfun ĠVector . plus ( other : ĠVector ): ĠVector Ġ= ĊĠĠĠ Ġoffset ( x Ġ= Ġother . x , Ġy Ġ= Ġother . y , Ġz Ġ= Ġother . z ) Ċ Ċ operator Ġfun ĠVector . minus ( other : ĠVector ): ĠVector Ġ= ĊĠĠĠ Ġoffset ( x Ġ= Ġ- other . x , Ġy Ġ= Ġ- other . y , Ġz Ġ= Ġ- other . z ) Ċ Ċ operator Ġfun ĠVector . unary Minus (): ĠVector Ġ= ĊĠĠĠ ĠVector ( x Ġ= Ġ- x , Ġy Ġ= Ġ- y , Ġz Ġ= Ġ- z ) Ċ Ċ operator Ġfun ĠVector . times ( other : ĠDouble ): ĠVector Ġ= ĊĠĠĠ ĠVector ( x Ġ= Ġx Ġ* Ġother , Ġy Ġ= Ġy Ġ* Ġother , Ġz Ġ= Ġz Ġ* Ġother ) Ċ Ċ infix Ġfun ĠVector . dot Product ( other : ĠVector ): ĠDouble Ġ= ĊĠĠĠ Ġx Ġ* Ġother . x Ġ+ Ġy Ġ* Ġother . y Ġ+ Ġz Ġ* Ġother . z Ċ Ċ fun ĠVector . rotate ( origin : ĠVector , Ġangle : ĠDouble ): ĠVector Ġ{ ĊĠĠĠ Ġval Ġc Ġ= Ġcos ( angle ) ĊĠĠĠ Ġval Ġs Ġ= Ġsin ( angle ) ĊĊĠĠĠ Ġreturn Ġmultiply By Matrix ( ĊĠĠĠĠĠĠĠ Ġv 1 1 Ġ= Ġc Ġ+ Ġ( 1 Ġ- Ġc ) Ġ* Ġorigin . x Ġ* Ġorigin . x , ĊĠĠĠĠĠĠĠ Ġv 1 2 Ġ= Ġ( 1 Ġ- Ġc ) Ġ* Ġorigin . x Ġ* Ġorigin . y Ġ- Ġs Ġ* Ġorigin . z , ĊĠĠĠĠĠĠĠ Ġv 1 3 Ġ= Ġ( 1 Ġ- Ġc ) Ġ* Ġorigin . x Ġ* Ġorigin . z Ġ+ Ġs Ġ* Ġorigin . y , ĊĠĠĠĠĠĠĠ Ġv 2 1 Ġ= Ġ( 1 Ġ- Ġc ) Ġ* Ġorigin . y Ġ* Ġorigin . x Ġ+ Ġs Ġ* Ġorigin . z , ĊĠĠĠĠĠĠĠ Ġv 2 2 Ġ= Ġc Ġ+ Ġ( 1 Ġ- Ġc ) Ġ* Ġorigin . y Ġ* Ġorigin . y , ĊĠĠĠĠĠĠĠ Ġv 2 3 Ġ= Ġ( 1 Ġ- Ġc ) Ġ* Ġorigin . y Ġ* Ġorigin . z Ġ- Ġs Ġ* Ġorigin . x , ĊĠĠĠĠĠĠĠ Ġv 3 1 Ġ= Ġ( 1 Ġ- Ġc ) Ġ* Ġorigin . z Ġ* Ġorigin . x Ġ- Ġs Ġ* Ġorigin . y , ĊĠĠĠĠĠĠĠ Ġv 3 2 Ġ= Ġ( 1 Ġ- Ġc ) Ġ* Ġorigin . z Ġ* Ġorigin . y Ġ+ Ġs Ġ* Ġorigin . x , ĊĠĠĠĠĠĠĠ Ġv 3 3 Ġ= Ġc Ġ+ Ġ( 1 Ġ- Ġc ) Ġ* Ġorigin . z Ġ* Ġorigin . z ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun ĠVector . rotate ( orientation : ĠOrientation ): ĠVector Ġ= ĊĠĠĠ Ġrotate ( UNIT _ O _ X , Ġorientation . x ) ĊĠĠĠĠĠĠĠ Ġ. rotate ( UNIT _ O _ Y , Ġorientation . y ) ĊĠĠĠĠĠĠĠ Ġ. rotate ( UNIT _ O _ Z , Ġorientation . z ) Ċ Ċ fun Ġangle Between ( a : ĠVector , Ġb : ĠVector ): ĠDouble Ġ= ĊĠĠĠ Ġa cos (( a Ġdot Product Ġb ) Ġ/ Ġ( a . length () Ġ* Ġb . length ())) Ċ Ċ fun Ġdistance Between ( a : ĠVector , Ġb : ĠVector ): ĠDouble Ġ= ĊĠĠĠ Ġsqrt ( sqr ( a . x Ġ- Ġb . x ) Ġ+ Ġsq r ( a . y Ġ- Ġb . y ) Ġ+ Ġsq r ( a . z Ġ- Ġb . z )) Ċ Ċ fun ĠVector . multiply By Matrix ( ĊĠĠĠ Ġv 1 1 : ĠDouble , ĊĠĠĠ Ġv 1 2 : ĠDouble , ĊĠĠĠ Ġv 1 3 : ĠDouble , ĊĠĠĠ Ġv 2 1 : ĠDouble , ĊĠĠĠ Ġv 2 2 : ĠDouble , ĊĠĠĠ Ġv 2 3 : ĠDouble , ĊĠĠĠ Ġv 3 1 : ĠDouble , ĊĠĠĠ Ġv 3 2 : ĠDouble , ĊĠĠĠ Ġv 3 3 : ĠDouble , Ċ ): ĠVector Ġ= ĊĠĠĠ ĠVector ( ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġv 1 1 Ġ* Ġx Ġ+ Ġv 1 2 Ġ* Ġy Ġ+ Ġv 1 3 Ġ* Ġz , ĊĠĠĠĠĠĠĠ Ġy Ġ= Ġv 2 1 Ġ* Ġx Ġ+ Ġv 2 2 Ġ* Ġy Ġ+ Ġv 2 3 Ġ* Ġz , ĊĠĠĠĠĠĠĠ Ġz Ġ= Ġv 3 1 Ġ* Ġx Ġ+ Ġv 3 2 Ġ* Ġy Ġ+ Ġv 3 3 Ġ* Ġz ĊĠĠĠ Ġ) Ċ Ċ operator Ġfun ĠTriangle . plus ( vector : ĠVector ): ĠTriangle Ġ= ĊĠĠĠ Ġcopy ( a Ġ= Ġa Ġ+ Ġvector , Ġb Ġ= Ġb Ġ+ Ġvector , Ġc Ġ= Ġc Ġ+ Ġvector ) Ċ Ċ fun Ġdeg To Rad ( deg : ĠDouble ): ĠDouble Ġ= Ġdeg Ġ* ĠPI Ġ/ Ġ 1 8 0 . 0 Ċ Ċ fun ĠDouble . fix Zero (): ĠDouble Ġ= Ġif Ġ( this Ġ== Ġ 0 . 0 ) Ġ 0 . 0 0 1 Ġelse Ġthis Ċ Ċ fun Ġsq r ( value : ĠDouble ): ĠDouble Ġ= Ġvalue Ġ* Ġvalue Ċ