001 package com.croftsoft.core.math.matrix;
002
003 /***********************************************************************
004 * Matrix test methods.
005 *
006 * @version
007 * $Id: MatrixTest.java,v 1.9 2008/05/03 02:48:38 croft Exp $
008 * @since
009 * 2008-04-19
010 * @author
011 * <a href="https://www.croftsoft.com/">David Wallace Croft</a>
012 ***********************************************************************/
013
014 public final class MatrixTest
015 ////////////////////////////////////////////////////////////////////////
016 ////////////////////////////////////////////////////////////////////////
017 {
018
019 public static void main ( final String [ ] args )
020 ////////////////////////////////////////////////////////////////////////
021 {
022 System.out.println ( test ( ) );
023 }
024
025 public static boolean test ( )
026 ////////////////////////////////////////////////////////////////////////
027 {
028 System.out.println (
029 Matrix3x3Lib.createRotationMatrixX ( 0 ).toString ( ) );
030
031 System.out.println (
032 Matrix3x3Lib.createRotationMatrixY ( 180 ).toString ( ) );
033
034 System.out.println (
035 Matrix3x3Lib.createRotationMatrixZ ( 270 ).toString ( ) );
036
037 System.out.println (
038 Matrix3x3Lib.createRotationMatrix ( 0, 180, 270 ).toString ( ) );
039
040 final MatrixMut matrixB = new MatrixImp ( 2, 2 );
041
042 matrixB.set ( 0, 0, 0 );
043
044 matrixB.set ( 0, 1, 1 );
045
046 matrixB.set ( 1, 0, -2 );
047
048 matrixB.set ( 1, 1, 5 );
049
050 final MatrixMut matrixD = new MatrixImp (
051 new double [ ] [ ] {
052 { -1, 0, 3 },
053 { 5, 7, 2 } } );
054
055 System.out.println ( matrixB );
056
057 System.out.println ( matrixD );
058
059 System.out.println ( matrixB.multiply ( matrixD ) );
060
061 final Matrix3x3 rotationMatrix
062 = Matrix3x3Lib.createRotationMatrix ( 90, 90, 90 );
063
064 final double [ ] eulerAngles
065 = Matrix3x3Lib.toEulerAngles ( rotationMatrix );
066
067 for ( int i = 0; i < 3; i++ )
068 {
069 System.out.print ( eulerAngles [ i ] + ", " );
070 }
071
072 System.out.println ( "" );
073
074 return testTranspose ( )
075 && testRotation ( 90, 90, 90 )
076 && testRotation ( 0, 0, 0 )
077 && testRotation ( 180, 0, 0 )
078 && testRotation ( 360, 180, 270 )
079 && testRotation ( -90, -180, 0 );
080 }
081
082 public static boolean testRotation (
083 final double degreesX,
084 final double degreesY,
085 final double degreesZ )
086 ////////////////////////////////////////////////////////////////////////
087 {
088 final double cy = Math.cos ( Math.toRadians ( degreesY ) );
089
090 final double sy = Math.sin ( Math.toRadians ( degreesY ) );
091
092 final double cz = Math.cos ( Math.toRadians ( degreesZ ) );
093
094 final double sz = Math.sin ( Math.toRadians ( degreesZ ) );
095
096 final Matrix3x3Mut rotationZY0 = new Matrix3x3Imp (
097 new double [ ] [ ] {
098 { cy * cz, -sz, sy * cz },
099 { cy * sz, cz, sy * sz },
100 { -sy, 0, cy } } );
101
102 final Matrix rotationZY1
103 = Matrix3x3Lib.createRotationMatrixZ ( degreesZ ).multiply (
104 Matrix3x3Lib.createRotationMatrixY ( degreesY ) );
105
106 if ( !rotationZY0.matches ( rotationZY1 ) )
107 {
108 System.out.println ( "rotation test 1 failed" );
109
110 return false;
111 }
112
113 final Matrix3x3Mut rotationMatrix
114 = Matrix3x3Lib.createRotationMatrixZ ( degreesZ );
115
116 rotationMatrix.multiplyToSelf (
117 Matrix3x3Lib.createRotationMatrixY ( degreesY ) );
118
119 rotationMatrix.multiplyToSelf (
120 Matrix3x3Lib.createRotationMatrixX ( degreesX ) );
121
122 System.out.print ( "expected ...: " );
123
124 System.out.println ( rotationMatrix );
125
126 System.out.print ( "actual .....: " );
127
128 final Matrix3x3 actualRotationMatrix
129 = Matrix3x3Lib.createRotationMatrix (
130 degreesX,
131 degreesY,
132 degreesZ );
133
134 System.out.println ( actualRotationMatrix );
135
136 if ( !rotationMatrix.matches ( actualRotationMatrix ) )
137 {
138 System.out.println ( "rotation test 2 failed" );
139
140 return false;
141 }
142
143 return true;
144 }
145
146 public static boolean testTranspose ( )
147 ////////////////////////////////////////////////////////////////////////
148 {
149 final Matrix matrix3x4 = new MatrixImp (
150 new double [ ] [ ] {
151 { 1, 2, 3, 4 },
152 { 5, 6, 7, 8 },
153 { 9, 10, 11, 12 } } );
154
155 final Matrix matrix4x3 = new MatrixImp (
156 new double [ ] [ ] {
157 { 1, 5, 9 },
158 { 2, 6, 10 },
159 { 3, 7, 11 },
160 { 4, 8, 12 } } );
161
162 if ( !matrix3x4.matches ( matrix4x3.transpose ( ) ) )
163 {
164 System.out.println ( "transpose test 1 failed" );
165
166 return false;
167 }
168
169 final MatrixMut matrix4x4Mut = new MatrixImp (
170 new double [ ] [ ] {
171 { 1, 2, 3, 4 },
172 { 5, 6, 7, 8 },
173 { 9, 10, 11, 12 },
174 { 13, 14, 15, 16 } } );
175
176 final Matrix matrix4x4 = new MatrixImp (
177 new double [ ] [ ] {
178 { 1, 5, 9, 13 },
179 { 2, 6, 10, 14 },
180 { 3, 7, 11, 15 },
181 { 4, 8, 12, 16 } } );
182
183 if ( !matrix4x4Mut.transpose ( ).matches ( matrix4x4 ) )
184 {
185 System.out.println ( "transpose test 2 failed" );
186
187 return false;
188 }
189
190 matrix4x4Mut.transposeSelf ( );
191
192 if ( !matrix4x4Mut.matches ( matrix4x4 ) )
193 {
194 System.out.println ( "transpose test 3 failed" );
195
196 return false;
197 }
198
199 return true;
200 }
201
202 ////////////////////////////////////////////////////////////////////////
203 // private methods
204 ////////////////////////////////////////////////////////////////////////
205
206 private MatrixTest ( )
207 ////////////////////////////////////////////////////////////////////////
208 {
209 // empty
210 }
211
212 ////////////////////////////////////////////////////////////////////////
213 ////////////////////////////////////////////////////////////////////////
214 }