// ĠCopyright Ġ 2 0 1 0 Ġ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 . sqrt Ċ import Ġcom . google . android . st ard roid . math . Matrix 4 x 4 . Companion . create Identity Ċ import Ġcom . google . android . st ard roid . math . Matrix 4 x 4 . Companion . create Rotation Ċ import Ġcom . google . android . st ard roid . math . Matrix 4 x 4 . Companion . create Scaling Ċ import Ġcom . google . android . st ard roid . math . Matrix 4 x 4 . Companion . create Translation Ċ import Ġorg . junit . Test Ċ Ċ class ĠMatrix 4 x 4 Test Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Multiply ById entity () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġidentity Ġ= Ġcreate Identity () ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= ĠMatrix 4 x 4 ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 6 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 7 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 8 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 9 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 1 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 3 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 4 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 5 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 6 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠMatrix 4 x 4 Subject . assertThat ( m ). is Within ( TO L ). of ( identity Ġ* Ġm ) ĊĠĠĠĠĠĠĠ ĠMatrix 4 x 4 Subject . assertThat ( m ). is Within ( TO L ). of ( m Ġ* Ġidentity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Multiply By Scaling () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= ĠMatrix 4 x 4 ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 6 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 7 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 9 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 1 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġscaling Ġ= Ġcreate Scaling ( 2 f , Ġ 2 f , Ġ 2 f ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠMatrix 4 x 4 ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 6 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 4 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 8 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠMatrix 4 x 4 Subject . assertThat ( expected ). is Within ( TO L ). of ( scaling Ġ* Ġm ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Multiply By Translation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= ĠVector 3 ( 1 f , Ġ 1 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġval Ġtrans Ġ= Ġcreate Translation ( 1 f , Ġ 2 f , Ġ 3 f ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠVector 3 ( 2 f , Ġ 3 f , Ġ 4 f ) ĊĠĠĠĠĠĠĠ ĠVector 3 Subject . assertThat ( expected ). is Within ( TO L ). of ( trans Ġ* Ġv ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Rotation 3 x 3 Parallel Rotation Has No Effect () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġcreate Rotation ( PI , ĠVector 3 ( 0 f , Ġ 1 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= ĠVector 3 ( 0 f , Ġ 2 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ ĠVector 3 Subject . assertThat ( v ). is Within ( TO L ). of ( m Ġ* Ġv ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Rotation 3 x 3 Per pend icular Rotation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġcreate Rotation ( PI Ġ* Ġ 0 . 2 5 f , ĠVector 3 ( 0 f , Ġ- 1 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= ĠVector 3 ( 1 f , Ġ 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġone Over Sqrt 2 Ġ= Ġ 1 . 0 f Ġ/ Ġsqrt ( 2 . 0 f ) ĊĠĠĠĠĠĠĠ ĠVector 3 Subject . assertThat ( Vector 3 ( one Over Sqrt 2 , Ġ 0 f , Ġone Over Sqrt 2 )). is Within ( TO L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of ( m Ġ* Ġv ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Rotation 3 x 3 Un aligned Axis () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaxis Ġ= ĠVector 3 ( 1 f , Ġ 1 f , Ġ 1 f ). normalized Copy () ĊĠĠĠĠĠĠĠ Ġval Ġnum Rot ations Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġcreate Rotation ( TWO _ PI Ġ/ Ġnum Rot ations , Ġaxis ) ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠVector 3 ( 2 . 3 4 f , Ġ 3 f , Ġ- 1 7 . 6 f ) ĊĠĠĠĠĠĠĠ Ġ// Ġfloat Ġone Over Sqrt 2 Ġ= Ġ 1 . 0 f Ġ/ ĠMath Util . sqrt ( 2 . 0 f ); ĊĠĠĠĠĠĠĠ Ġvar Ġv Ġ= Ġstart ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Ġ= Ġm Ġ* Ġv ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠVector 3 Subject . assertThat ( start ). is Within ( TO L ). of ( v ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠT OL Ġ= Ġ 0 . 0 0 0 0 1 f ĊĠĠĠ Ġ} Ċ }