// ĠCopyright Ġ 2 0 0 8 ĠGoogle ĠInc . Ċ // Ċ // ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ // Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ // ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ // Ċ // ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ // Ċ // ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ // Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ // ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ // ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ // Ġlimitations Ġunder Ġthe ĠLicense . Ċ package Ġcom . google . android . st ard roid . math Ċ Ċ import Ġcom . google . android . st ard roid . math . Math Utils . abs Ċ import Ġkotlin . jvm . Jvm Over loads Ċ Ċ /** Ċ Ġ* ĠClass Ġfor Ġrepresenting Ġa Ġ 3 x 3 Ġmatrix Ġexplicitly , Ġavoid ing Ġheap Ċ Ġ* Ġallocation Ġas Ġfar Ġas Ġpossible . Ċ Ġ* Ċ Ġ* Ġ@ author ĠDom in ic ĠW idd ows Ċ Ġ* Ċ Ġ* ĠConstruct Ġa Ġnew Ġmatrix . Ċ Ġ* Ġ@ param Ġxx Ġrow Ġ 1 , Ġcol Ġ 1 Ċ Ġ* Ġ@ param Ġxy Ġrow Ġ 1 , Ġcol Ġ 2 Ċ Ġ* Ġ@ param Ġx z Ġrow Ġ 1 , Ġcol Ġ 3 Ċ Ġ* Ġ@ param Ġy x Ġrow Ġ 2 , Ġcol Ġ 1 Ċ Ġ* Ġ@ param Ġyy Ġrow Ġ 2 , Ġcol Ġ 2 Ċ Ġ* Ġ@ param Ġy z Ġrow Ġ 2 , Ġcol Ġ 3 Ċ Ġ* Ġ@ param Ġzx Ġrow Ġ 3 , Ġcol Ġ 1 Ċ Ġ* Ġ@ param Ġz y Ġrow Ġ 3 , Ġcol Ġ 2 Ċ Ġ* Ġ@ param Ġzz Ġrow Ġ 3 , Ġcol Ġ 3 Ċ Ġ*/ Ċ data Ġclass ĠMatrix 3 x 3 ( ĊĠĠĠ Ġvar Ġxx : ĠFloat , Ġvar Ġxy : ĠFloat , Ġvar Ġx z : ĠFloat , ĊĠĠĠ Ġvar Ġy x : ĠFloat , Ġvar Ġyy : ĠFloat , Ġvar Ġy z : ĠFloat , ĊĠĠĠ Ġvar Ġzx : ĠFloat , Ġvar Ġz y : ĠFloat , Ġvar Ġzz : ĠFloat Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstruct Ġa Ġmatrix Ġfrom Ġthree Ġvectors . ĊĠĠĠĠ Ġ* Ġ@ param Ġcolumn Vectors Ġtrue Ġif Ġthe Ġvectors Ġare Ġcolumn Ġvectors , Ġotherwise ĊĠĠĠĠ Ġ* Ġthey 're Ġrow Ġvectors . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġconstructor ( v 1 : ĠVector 3 , Ġv 2 : ĠVector 3 , Ġv 3 : ĠVector 3 , Ġcolumn Vectors : ĠBoolean Ġ= Ġtrue ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠ 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( column Vectors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġxx Ġ= Ġv 1 . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy x Ġ= Ġv 1 . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzx Ġ= Ġv 1 . z ĊĠĠĠĠĠĠĠĠĠĠĠ Ġxy Ġ= Ġv 2 . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyy Ġ= Ġv 2 . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġz y Ġ= Ġv 2 . z ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx z Ġ= Ġv 3 . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy z Ġ= Ġv 3 . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzz Ġ= Ġv 3 . z ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġxx Ġ= Ġv 1 . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġxy Ġ= Ġv 1 . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx z Ġ= Ġv 1 . z ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy x Ġ= Ġv 2 . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyy Ġ= Ġv 2 . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy z Ġ= Ġv 2 . z ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzx Ġ= Ġv 3 . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġz y Ġ= Ġv 3 . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzz Ġ= Ġv 3 . z ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdetermin ant : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġxx Ġ* Ġyy Ġ* Ġzz Ġ+ Ġxy Ġ* Ġy z Ġ* Ġzx Ġ+ Ġx z Ġ* Ġy x Ġ* Ġz y Ġ- Ġxx Ġ* Ġy z Ġ* Ġz y Ġ- Ġyy Ġ* Ġzx Ġ* Ġx z Ġ- Ġzz Ġ* Ġxy Ġ* Ġy x ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġinverse Ġmatrix Ġor Ġnull Ġif Ġthe Ġdetermin ant Ġis Ġclose Ġto Ġzero . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġinverse : ĠMatrix 3 x 3 ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( abs ( determin ant ) Ġ< Ġ 0 . 0 0 0 0 1 f ) Ġnull Ġelse ĠMatrix 3 x 3 ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( yy Ġ* Ġzz Ġ- Ġy z Ġ* Ġz y ) Ġ/ Ġdetermin ant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( xz Ġ* Ġz y Ġ- Ġxy Ġ* Ġzz ) Ġ/ Ġdetermin ant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( xy Ġ* Ġy z Ġ- Ġx z Ġ* Ġyy ) Ġ/ Ġdetermin ant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( yz Ġ* Ġzx Ġ- Ġy x Ġ* Ġzz ) Ġ/ Ġdetermin ant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( xx Ġ* Ġzz Ġ- Ġx z Ġ* Ġzx ) Ġ/ Ġdetermin ant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( xz Ġ* Ġy x Ġ- Ġxx Ġ* Ġy z ) Ġ/ Ġdetermin ant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( yx Ġ* Ġz y Ġ- Ġyy Ġ* Ġzx ) Ġ/ Ġdetermin ant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( xy Ġ* Ġzx Ġ- Ġxx Ġ* Ġz y ) Ġ/ Ġdetermin ant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( xx Ġ* Ġyy Ġ- Ġxy Ġ* Ġy x ) Ġ/ Ġdetermin ant ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTr ansp o ses Ġthe Ġmatrix , Ġin Ġplace . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtranspose () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtmp : ĠFloat ĊĠĠĠĠĠĠĠ Ġtmp Ġ= Ġxy ĊĠĠĠĠĠĠĠ Ġxy Ġ= Ġy x ĊĠĠĠĠĠĠĠ Ġy x Ġ= Ġtmp ĊĠĠĠĠĠĠĠ Ġtmp Ġ= Ġx z ĊĠĠĠĠĠĠĠ Ġx z Ġ= Ġzx ĊĠĠĠĠĠĠĠ Ġzx Ġ= Ġtmp ĊĠĠĠĠĠĠĠ Ġtmp Ġ= Ġy z ĊĠĠĠĠĠĠĠ Ġy z Ġ= Ġz y ĊĠĠĠĠĠĠĠ Ġz y Ġ= Ġtmp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( m Ġ: ĠMatrix 3 x 3 ) Ġ= ĠMatrix 3 x 3 ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . xx Ġ* Ġm . xx Ġ+ Ġthis . xy Ġ* Ġm . yx Ġ+ Ġthis . xz Ġ* Ġm . zx , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . xx Ġ* Ġm . xy Ġ+ Ġthis . xy Ġ* Ġm . yy Ġ+ Ġthis . xz Ġ* Ġm . zy , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . xx Ġ* Ġm . xz Ġ+ Ġthis . xy Ġ* Ġm . yz Ġ+ Ġthis . xz Ġ* Ġm . zz , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . yx Ġ* Ġm . xx Ġ+ Ġthis . yy Ġ* Ġm . yx Ġ+ Ġthis . yz Ġ* Ġm . zx , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . yx Ġ* Ġm . xy Ġ+ Ġthis . yy Ġ* Ġm . yy Ġ+ Ġthis . yz Ġ* Ġm . zy , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . yx Ġ* Ġm . xz Ġ+ Ġthis . yy Ġ* Ġm . yz Ġ+ Ġthis . yz Ġ* Ġm . zz , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . zx Ġ* Ġm . xx Ġ+ Ġthis . zy Ġ* Ġm . yx Ġ+ Ġthis . zz Ġ* Ġm . zx , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . zx Ġ* Ġm . xy Ġ+ Ġthis . zy Ġ* Ġm . yy Ġ+ Ġthis . zz Ġ* Ġm . zy , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . zx Ġ* Ġm . xz Ġ+ Ġthis . zy Ġ* Ġm . yz Ġ+ Ġthis . zz Ġ* Ġm . zz ) ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( v Ġ: ĠVector 3 ) Ġ= ĠVector 3 ( ĊĠĠĠĠĠĠĠ Ġthis . xx Ġ* Ġv . x Ġ+ Ġthis . xy Ġ* Ġv . y Ġ+ Ġthis . xz Ġ* Ġv . z , ĊĠĠĠĠĠĠĠ Ġthis . yx Ġ* Ġv . x Ġ+ Ġthis . yy Ġ* Ġv . y Ġ+ Ġthis . yz Ġ* Ġv . z , ĊĠĠĠĠĠĠĠ Ġthis . zx Ġ* Ġv . x Ġ+ Ġthis . zy Ġ* Ġv . y Ġ+ Ġthis . zz Ġ* Ġv . z ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval Ġidentity : ĠMatrix 3 x 3 Ġ= ĠMatrix 3 x 3 ( 1 f , Ġ 0 f , Ġ 0 f , Ġ 0 f , Ġ 1 f , Ġ 0 f , Ġ 0 f , Ġ 0 f , Ġ 1 f ) ĊĠĠĠ Ġ} Ċ }