package Ġdev . peng ie . kot aro . math Ċ Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . sin Ċ import Ġkotlin . math . tan Ċ Ċ class ĠMatrix 3 f Ġ: ĠMatrix 3 < Float >( 0 f , ĠArithmetic Float ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcopy (): ĠMatrix 3 < Float > Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġcolumn - major Ġarray Ġrepresentation Ġof Ġthis Ġmatrix ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġto Array (): ĠArray < Float > Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ Ġm 0 0 , Ġm 1 0 , Ġm 2 0 , ĊĠĠĠĠĠĠĠ Ġm 0 1 , Ġm 1 1 , Ġm 2 1 , ĊĠĠĠĠĠĠĠ Ġm 0 2 , Ġm 1 2 , Ġm 2 2 , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġtimes ( other : ĠMatrix 3 < Float >): ĠMatrix 3 < Float > Ġ= ĊĠĠĠĠĠĠĠ ĠMatrix 3 f (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst ĠRow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 0 0 Ġ= Ġm 0 0 Ġ* Ġother . m 0 0 Ġ+ Ġm 0 1 Ġ* Ġother . m 1 0 Ġ+ Ġm 0 2 Ġ* Ġother . m 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 0 1 Ġ= Ġm 0 0 Ġ* Ġother . m 0 1 Ġ+ Ġm 0 1 Ġ* Ġother . m 1 1 Ġ+ Ġm 0 2 Ġ* Ġother . m 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 0 2 Ġ= Ġm 0 0 Ġ* Ġother . m 0 2 Ġ+ Ġm 0 1 Ġ* Ġother . m 1 2 Ġ+ Ġm 0 2 Ġ* Ġother . m 2 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSecond ĠRow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 1 0 Ġ= Ġm 1 0 Ġ* Ġother . m 0 0 Ġ+ Ġm 1 1 Ġ* Ġother . m 1 0 Ġ+ Ġm 1 2 Ġ* Ġother . m 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 1 1 Ġ= Ġm 1 0 Ġ* Ġother . m 0 1 Ġ+ Ġm 1 1 Ġ* Ġother . m 1 1 Ġ+ Ġm 1 2 Ġ* Ġother . m 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 1 2 Ġ= Ġm 1 0 Ġ* Ġother . m 0 2 Ġ+ Ġm 1 1 Ġ* Ġother . m 1 2 Ġ+ Ġm 1 2 Ġ* Ġother . m 2 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThird ĠRow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 2 0 Ġ= Ġm 2 0 Ġ* Ġother . m 0 0 Ġ+ Ġm 2 1 Ġ* Ġother . m 1 0 Ġ+ Ġm 2 2 Ġ* Ġother . m 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 2 1 Ġ= Ġm 2 0 Ġ* Ġother . m 0 1 Ġ+ Ġm 2 1 Ġ* Ġother . m 1 1 Ġ+ Ġm 2 2 Ġ* Ġother . m 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 2 2 Ġ= Ġm 2 0 Ġ* Ġother . m 0 2 Ġ+ Ġm 2 1 Ġ* Ġother . m 1 2 Ġ+ Ġm 2 2 Ġ* Ġother . m 2 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtimes ( other : ĠVector 3 < Float >): ĠVector 3 < Float > Ġ= ĊĠĠĠĠĠĠĠ ĠVector 3 f (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . x Ġ= Ġm 0 0 Ġ* Ġother . x Ġ+ Ġm 0 1 Ġ* Ġother . y Ġ+ Ġm 0 2 Ġ* Ġother . z ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . y Ġ= Ġm 1 0 Ġ* Ġother . x Ġ+ Ġm 1 1 Ġ* Ġother . y Ġ+ Ġm 1 2 Ġ* Ġother . z ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . z Ġ= Ġm 2 0 Ġ* Ġother . x Ġ+ Ġm 2 1 Ġ* Ġother . y Ġ+ Ġm 2 2 Ġ* Ġother . z ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Matrix 4 f (): ĠMatrix 4 f Ġ= ĊĠĠĠĠĠĠĠ ĠMatrix 4 f . identity (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 0 0 Ġ= Ġm 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 0 1 Ġ= Ġm 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 0 2 Ġ= Ġm 0 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 1 0 Ġ= Ġm 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 1 1 Ġ= Ġm 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 1 2 Ġ= Ġm 1 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 2 0 Ġ= Ġm 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 2 1 Ġ= Ġm 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . m 2 2 Ġ= Ġm 2 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ[$ m 0 0 , Ġ$ m 0 1 , Ġ$ m 0 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ[$ m 1 0 , Ġ$ m 1 1 , Ġ$ m 1 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ[$ m 2 0 , Ġ$ m 2 1 , Ġ$ m 2 2 ] ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġidentity (): ĠMatrix 3 f Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMatrix 3 f (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 0 0 Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 1 1 Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 2 2 Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġrotation Matrix ( q : ĠQuaternion ): ĠMatrix 3 f Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentity (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 0 0 Ġ= Ġ 2 Ġ* Ġ( q . w * q . w Ġ+ Ġq . x * q . x ) Ġ- Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 0 1 Ġ= Ġ 2 Ġ* Ġ( q . x Ġ* Ġq . y Ġ- Ġq . w Ġ* Ġq . z ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 0 2 Ġ= Ġ 2 Ġ* Ġ( q . x Ġ* Ġq . z Ġ+ Ġq . w Ġ* Ġq . y ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 1 0 Ġ= Ġ 2 Ġ* Ġ( q . x Ġ* Ġq . y Ġ+ Ġq . w Ġ* Ġq . z ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 1 1 Ġ= Ġ 2 Ġ* Ġ( q . w Ġ* Ġq . w Ġ+ Ġq . y Ġ* Ġq . y ) Ġ- Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 1 2 Ġ= Ġ 2 Ġ* Ġ( q . y Ġ* Ġq . z Ġ- Ġq . w Ġ* Ġq . x ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 2 0 Ġ= Ġ 2 Ġ* Ġ( q . x Ġ* Ġq . z Ġ- Ġq . w Ġ* Ġq . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 2 1 Ġ= Ġ 2 Ġ* Ġ( q . y Ġ* Ġq . z Ġ+ Ġq . w Ġ* Ġq . x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 2 2 Ġ= Ġ 2 Ġ* Ġ( q . w Ġ* Ġq . w Ġ+ Ġq . z Ġ* Ġq . z ) Ġ- Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġrotation Matrix ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ): ĠMatrix 3 f Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( rotation Matrix Z ( x ) Ġ* Ġrotation Matrix Y ( y ) Ġ* Ġrotation Matrix X ( z )). to Matrix 3 f () ĊĠĠĠĠĠĠĠ Ġfun Ġrotation Matrix X ( angle : ĠFloat ): ĠMatrix 3 f Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentity (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs ine Ġ= Ġsin ( angle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcos ine Ġ= Ġcos ( angle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 1 1 Ġ= Ġcos ine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 1 2 Ġ= Ġ- s ine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 2 1 Ġ= Ġs ine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 2 2 Ġ= Ġcos ine ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrotation Matrix Y ( angle : ĠFloat ): ĠMatrix 3 f Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentity (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs ine Ġ= Ġsin ( angle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcos ine Ġ= Ġcos ( angle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 0 0 Ġ= Ġcos ine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 0 2 Ġ= Ġs ine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 2 0 Ġ= Ġ- s ine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 2 2 Ġ= Ġcos ine ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrotation Matrix Z ( angle : ĠFloat ): ĠMatrix 3 f Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidentity (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs ine Ġ= Ġsin ( angle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcos ine Ġ= Ġcos ( angle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 0 0 Ġ= Ġcos ine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 0 1 Ġ= Ġ- s ine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 1 0 Ġ= Ġs ine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m 1 1 Ġ= Ġcos ine ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠMatrix 3 < Float >. to Matrix 3 f (): ĠMatrix 3 f Ġ= Ġthis Ġas ĠMatrix 3 f