1 package org.web3d.x3d.sai;
4 public float[][] matrix;
5 public static int SIZE = 4;
9 matrix =
new float[SIZE][SIZE];
10 for (i = 0; i < SIZE; i++) {
11 for (j=0; j<SIZE; j++) {
17 public Matrix4(
float[][] init) {
21 matrix =
new float[SIZE][SIZE];
23 for (i = 0; i < SIZE; i++) {
24 for (j = 0; j < SIZE; j++) {
25 matrix[i][j] = init[i][j];
35 if (init.length < SIZE*SIZE) {
36 throw new ArrayIndexOutOfBoundsException(
"Initialization array passed to Matrix3 of insufficient length");
39 matrix =
new float[SIZE][SIZE];
42 for (i = 0; i < SIZE; i++) {
43 for (j = 0; j < SIZE; j++) {
44 matrix[i][j] = init[count];
50 public void setIdentity() {
53 for (i = 0; i < SIZE; i++) {
54 for (j = 0; j < SIZE; j++) {
64 public void set(
int row,
int column,
float value) {
65 if ((row > SIZE) || (row < 0) || (column > SIZE) || (column < 0)) {
66 throw new ArrayIndexOutOfBoundsException(
"Matrix 3 set passed invalid row or column value");
69 matrix[row][column] = value;
72 public float get(
int row,
int column){
73 if ((row > SIZE) || (row < 0) || (column > SIZE) || (column < 0)) {
74 throw new ArrayIndexOutOfBoundsException(
"Matrix 3 set passed invalid row or column value");
77 return matrix[row][column];
99 rot =
new float[SIZE][SIZE];
100 srot =
new float[SIZE][SIZE];
101 nsrot =
new float[SIZE][SIZE];
102 trans =
new float[SIZE][SIZE];
103 strans =
new float[SIZE][SIZE];
104 nstrans =
new float[SIZE][SIZE];
105 sc =
new float[SIZE][SIZE];
106 finalscale =
new float[SIZE][SIZE];
108 value =
new float[SIZE];
109 axisr =
new float[SIZE];
111 for (i = 0; i < SIZE; i++) {
112 for (j=0; j < SIZE; j++) {
119 nstrans[i][j] = 1.0F;
121 finalscale[i][j] = 1.0F;
125 nstrans[i][j] = 0.0F;
130 finalscale[i][j] = 0.0F;
135 if (translation != null) {
137 translation.getValue(value);
138 }
catch (Exception e) {
139 System.out.println(e);
142 trans[3][0] = value[0];
143 trans[3][1] = value[1];
144 trans[3][2] = value[2];
149 scale.getValue(value);
150 }
catch (Exception e) {
151 System.out.println(e);
158 if (centre != null) {
160 centre.getValue(value);
161 }
catch (Exception e) {
162 System.out.println(e);
165 strans[3][0] = value[0];
166 strans[3][1] = value[1];
167 strans[3][2] = value[2];
171 if (scaleOrientation!=null) {
173 scaleOrientation.getValue(axisr);
174 }
catch (Exception e) {
175 System.out.println(e);
178 length = (float) (Math.sqrt(axisr[0]*axisr[0] + axisr[1]*axisr[1] + axisr[2]*axisr[2]));
185 c = (float)(Math.cos(axisr[3]));
186 s = (float)(Math.sin(axisr[3]));
189 srot[0][0] = t*x*x + c;
190 srot[0][1] = t*x*y - z*s;
191 srot[0][2] = t*x*z + y*s;
192 srot[1][0] = t*x*y + z*s;
193 srot[1][1] = t*y*y + c;
194 srot[1][2] = t*y*z - x*s;
195 srot[2][0] = t*x*z - y*s;
196 srot[2][1] = t*y*z + x*s;
197 srot[2][2] = t*z*z + c;
200 for (i = 0; i < SIZE; i++) {
201 for (j=0; j< SIZE; j++) {
202 nsrot[i][j] *= -1.0F;
203 nstrans[i][j] *= -1.0F;
210 if (rotation != null) {
213 rotation.getValue(axisr);
214 }
catch (Exception e) {
215 System.out.println(e);
218 length = (float)(Math.sqrt(axisr[0]*axisr[0] + axisr[1]*axisr[1] + axisr[2]*axisr[2]));
225 c = (float)(Math.cos(axisr[3]));
226 s = (float)(Math.sin(axisr[3]));
229 rot[0][0] = t*x*x + c;
230 rot[0][1] = t*x*y - z*s;
231 rot[0][2] = t*x*z + y*s;
232 rot[1][0] = t*x*y + z*s;
233 rot[1][1] = t*y*y + c;
234 rot[1][2] = t*y*z - x*s;
235 rot[2][0] = t*x*z - y*s;
236 rot[2][1] = t*y*z + x*s;
237 rot[2][2] = t*z*z + c;
240 matrix = multiply(matrix, trans);
241 matrix = multiply(matrix, strans);
242 matrix = multiply(matrix, rot);
243 matrix = multiply(matrix, srot);
244 matrix = multiply(matrix, sc);
245 matrix = multiply(matrix, nsrot);
246 matrix = multiply(matrix, nstrans);
262 translation.setValue(t);
267 s[0] = (float) (Math.sqrt(matrix[0][0]*matrix[0][0] + matrix[1][0]*matrix[1][0] + matrix[2][0]*matrix[2][0] + matrix[3][0]*matrix[3][0]));
268 s[1] = (float) (Math.sqrt(matrix[0][1]*matrix[0][1] + matrix[1][1]*matrix[1][1] + matrix[2][1]*matrix[2][1] + matrix[3][1]*matrix[3][1]));
269 s[2] = (float) (Math.sqrt(matrix[0][2]*matrix[0][2] + matrix[1][2]*matrix[1][2] + matrix[2][2]*matrix[2][2] + matrix[3][2]*matrix[3][2]));
273 r[3] = (float) (Math.acos((matrix[0][0] + matrix[1][1] + matrix[2][2] - 1)/2.0F));
274 r[0] = (float)((matrix[2][1]-matrix[1][2])/(Math.sqrt((matrix[2][1]-matrix[1][2])*(matrix[2][1]-matrix[1][2]) + (matrix[0][2]-matrix[2][0])*(matrix[0][2]*matrix[2][0]) + (matrix[1][0]-matrix[0][1])*(matrix[1][0]-matrix[0][1]))));
275 r[1] = (float)((matrix[0][2]-matrix[2][0])/(Math.sqrt((matrix[2][1]-matrix[1][2])*(matrix[2][1]-matrix[1][2]) + (matrix[0][2]-matrix[2][0])*(matrix[0][2]*matrix[2][0]) + (matrix[1][0]-matrix[0][1])*(matrix[1][0]-matrix[0][1]))));
276 r[2] = (float)((matrix[1][0]-matrix[0][1])/(Math.sqrt((matrix[2][1]-matrix[1][2])*(matrix[2][1]-matrix[1][2]) + (matrix[0][2]-matrix[2][0])*(matrix[0][2]*matrix[2][0]) + (matrix[1][0]-matrix[0][1])*(matrix[1][0]-matrix[0][1]))));
278 rotation.setValue(r);
289 transp =
new float[16];
292 mymatrix =
new float[16];
296 A = matrix[0][0]*matrix[1][1]*matrix[2][2]*matrix[3][3] + matrix[0][0]*matrix[1][2]*matrix[2][3]*matrix[3][1] + matrix[0][0]*matrix[1][3]*matrix[2][1]*matrix[3][2];
297 A += matrix[0][1]*matrix[1][0]*matrix[2][3]*matrix[3][2] + matrix[0][1]*matrix[1][2]*matrix[2][0]*matrix[3][3] + matrix[0][1]*matrix[1][3]*matrix[2][2]*matrix[3][0];
298 A += matrix[0][2]*matrix[1][0]*matrix[2][1]*matrix[3][3] + matrix[0][2]*matrix[1][1]*matrix[2][3]*matrix[3][0] + matrix[0][2]*matrix[1][3]*matrix[2][0]*matrix[3][1];
299 A += matrix[0][3]*matrix[1][0]*matrix[2][2]*matrix[3][1] + matrix[0][3]*matrix[1][1]*matrix[2][0]*matrix[3][2] + matrix[0][3]*matrix[1][2]*matrix[2][1]*matrix[3][0];
300 A = A - matrix[0][0]*matrix[1][1]*matrix[2][3]*matrix[3][2] - matrix[0][0]*matrix[1][2]*matrix[2][1]*matrix[3][3] - matrix[0][0]*matrix[1][3]*matrix[2][2]*matrix[3][1];
301 A = A - matrix[0][1]*matrix[1][0]*matrix[2][2]*matrix[3][3] - matrix[0][1]*matrix[1][2]*matrix[2][3]*matrix[3][0] - matrix[0][1]*matrix[1][3]*matrix[2][0]*matrix[3][2];
302 A = A - matrix[0][2]*matrix[1][0]*matrix[2][3]*matrix[3][1] - matrix[0][2]*matrix[1][1]*matrix[2][0]*matrix[3][3] - matrix[0][2]*matrix[1][3]*matrix[2][1]*matrix[3][0];
303 A = A - matrix[0][3]*matrix[1][0]*matrix[2][1]*matrix[3][2] - matrix[0][3]*matrix[1][1]*matrix[2][2]*matrix[3][0] - matrix[0][3]*matrix[1][2]*matrix[2][0]*matrix[3][1];
311 dst[0] = matrix[1][1]*matrix[2][2]*matrix[3][3] + matrix[1][2]*matrix[2][3]*matrix[3][1] + matrix[1][3]*matrix[2][1]*matrix[3][2];
312 dst[0] = dst[0] - matrix[1][1]*matrix[2][3]*matrix[3][2] - matrix[1][2]*matrix[2][1]*matrix[3][3] - matrix[1][3]*matrix[2][2]*matrix[3][1];
313 dst[1] = matrix[0][1]*matrix[2][3]*matrix[3][2] + matrix[0][2]*matrix[2][1]*matrix[3][3] + matrix[0][3]*matrix[2][2]*matrix[3][1];
314 dst[1] = dst[1] - matrix[0][1]*matrix[2][2]*matrix[3][3] - matrix[0][2]*matrix[2][3]*matrix[3][1] - matrix[0][3]*matrix[2][1]*matrix[3][2];
315 dst[2] = matrix[0][1]*matrix[1][2]*matrix[3][3] + matrix[0][2]*matrix[1][3]*matrix[3][1] + matrix[0][3]*matrix[1][1]*matrix[3][2];
316 dst[2] = dst[2] - matrix[0][1]*matrix[1][3]*matrix[3][2] - matrix[0][2]*matrix[1][1]*matrix[3][3] - matrix[0][3]*matrix[1][2]*matrix[3][1];
317 dst[3] = matrix[0][1]*matrix[1][3]*matrix[2][2] + matrix[0][2]*matrix[1][1]*matrix[2][3] + matrix[0][3]*matrix[1][2]*matrix[2][1];
318 dst[3] = dst[3] - matrix[0][1]*matrix[1][2]*matrix[2][3] - matrix[0][2]*matrix[1][3]*matrix[2][1] - matrix[0][3]*matrix[1][1]*matrix[2][2];
319 dst[4] = matrix[1][0]*matrix[2][3]*matrix[3][2] + matrix[1][2]*matrix[2][0]*matrix[3][3] + matrix[1][3]*matrix[2][2]*matrix[3][0];
320 dst[4] = dst[4] - matrix[1][0]*matrix[2][2]*matrix[3][3] - matrix[1][2]*matrix[2][3]*matrix[3][0] - matrix[1][3]*matrix[2][0]*matrix[3][2];
321 dst[5] = matrix[0][0]*matrix[2][2]*matrix[3][3] + matrix[0][2]*matrix[2][3]*matrix[3][0] + matrix[0][3]*matrix[2][0]*matrix[3][2];
322 dst[5] = dst[5] - matrix[0][0]*matrix[2][3]*matrix[3][2] - matrix[0][2]*matrix[2][0]*matrix[3][3] - matrix[0][3]*matrix[2][2]*matrix[3][0];
323 dst[6] = matrix[0][0]*matrix[1][3]*matrix[3][2] + matrix[0][2]*matrix[1][0]*matrix[3][3] + matrix[0][3]*matrix[1][2]*matrix[3][0];
324 dst[6] = dst[6] - matrix[0][0]*matrix[1][2]*matrix[3][3] - matrix[0][2]*matrix[1][3]*matrix[3][0] - matrix[0][3]*matrix[1][0]*matrix[3][2];
325 dst[7] = matrix[0][0]*matrix[1][2]*matrix[2][3] + matrix[0][2]*matrix[1][3]*matrix[2][0] + matrix[0][3]*matrix[1][0]*matrix[2][2];
326 dst[7] = dst[7] - matrix[0][0]*matrix[1][3]*matrix[2][2] - matrix[0][2]*matrix[1][0]*matrix[2][3] - matrix[0][3]*matrix[1][2]*matrix[2][0];
327 dst[8] = matrix[1][0]*matrix[2][1]*matrix[3][3] + matrix[1][1]*matrix[2][3]*matrix[3][0] + matrix[1][3]*matrix[2][0]*matrix[3][1];
328 dst[8] = dst[8] - matrix[1][0]*matrix[2][3]*matrix[3][1] - matrix[1][1]*matrix[2][0]*matrix[3][3] - matrix[1][3]*matrix[2][1]*matrix[3][0];
329 dst[9] = matrix[0][0]*matrix[2][3]*matrix[3][1] + matrix[0][1]*matrix[2][0]*matrix[3][3] + matrix[0][3]*matrix[2][1]*matrix[3][0];
330 dst[9] = dst[9] - matrix[0][0]*matrix[2][1]*matrix[3][3] - matrix[0][1]*matrix[2][3]*matrix[3][0] - matrix[0][3]*matrix[2][0]*matrix[3][1];
331 dst[10] = matrix[0][0]*matrix[1][1]*matrix[3][3] + matrix[0][1]*matrix[1][3]*matrix[3][0] + matrix[0][3]*matrix[1][0]*matrix[3][1];
332 dst[10] = dst[10] - matrix[0][0]*matrix[1][3]*matrix[3][1] - matrix[0][1]*matrix[1][0]*matrix[3][3] - matrix[0][3]*matrix[1][1]*matrix[3][0];
333 dst[11] = matrix[0][0]*matrix[1][3]*matrix[2][1] + matrix[0][1]*matrix[1][0]*matrix[2][3] + matrix[0][3]*matrix[1][1]*matrix[2][0];
334 dst[11] = dst[11] - matrix[0][0]*matrix[1][1]*matrix[2][3] - matrix[0][1]*matrix[1][3]*matrix[2][0] - matrix[0][3]*matrix[1][0]*matrix[2][1];
335 dst[12] = matrix[1][0]*matrix[2][2]*matrix[3][1] + matrix[1][1]*matrix[2][0]*matrix[3][2] + matrix[1][2]*matrix[2][1]*matrix[3][0];
336 dst[12] = dst[12] - matrix[1][0]*matrix[2][1]*matrix[3][2] - matrix[1][1]*matrix[2][2]*matrix[3][0] - matrix[1][2]*matrix[2][0]*matrix[3][1];
337 dst[13] = matrix[0][0]*matrix[2][1]*matrix[3][2] + matrix[0][1]*matrix[2][2]*matrix[3][0] + matrix[0][2]*matrix[2][0]*matrix[3][1];
338 dst[13] = dst[13] - matrix[0][0]*matrix[2][2]*matrix[3][1] - matrix[0][1]*matrix[2][0]*matrix[3][2] - matrix[0][2]*matrix[2][1]*matrix[3][0];
339 dst[14] = matrix[0][0]*matrix[1][2]*matrix[3][1] + matrix[0][1]*matrix[1][0]*matrix[3][2] + matrix[0][2]*matrix[1][1]*matrix[3][0];
340 dst[14] = dst[14] - matrix[0][0]*matrix[1][1]*matrix[3][2] - matrix[0][1]*matrix[1][2]*matrix[3][0] - matrix[0][2]*matrix[1][0]*matrix[3][1];
341 dst[15] = matrix[0][0]*matrix[1][1]*matrix[2][2] + matrix[0][1]*matrix[1][2]*matrix[2][0] + matrix[0][2]*matrix[1][0]*matrix[2][1];
342 dst[15] = dst[15] - matrix[0][0]*matrix[1][2]*matrix[2][1] - matrix[0][1]*matrix[1][0]*matrix[2][2] - matrix[0][2]*matrix[1][1]*matrix[2][0];
345 for (j = 0; j < 16; j++)
355 transp =
new float[16];
357 for (i=0; i < SIZE; i++) {
358 for (j=0; j < SIZE; j++) {
359 transp[j*SIZE + i] = matrix[i][j];
372 multp =
new float[SIZE][SIZE];
374 for ( i = 0; i < SIZE; i++) {
375 for (j = 0; j < SIZE; j++) {
376 multp[i][j] = mat.get(i, j);
380 ans =
new float[SIZE*SIZE];
382 for (i = 0; i < SIZE; i++) {
383 for (j=0; j < SIZE; j++) {
385 for (k = 0; k < SIZE; k++) {
386 sum = sum + multp[i][k]*matrix[k][j];
388 ans[(i*SIZE)+j] = sum;
395 public float[][] multiply(
float[][] multp,
float[][] mat) {
400 ans =
new float[SIZE][SIZE];
402 for (i = 0; i < SIZE; i++) {
403 for (j=0; j < SIZE; j++) {
405 for (k = 0; k < SIZE; k++) {
406 sum = sum + multp[i][k]*mat[k][j];
422 multp =
new float[SIZE][SIZE];
424 for ( i = 0; i < SIZE; i++) {
425 for (j = 0; j < SIZE; j++) {
426 multp[i][j] = mat.get(i, j);
430 ans =
new float[SIZE*SIZE];
432 for (i = 0; i < SIZE; i++) {
433 for (j=0; j < SIZE; j++) {
435 for (k = 0; k < SIZE; k++) {
436 sum = sum + matrix[i][k]*multp[k][j];
444 public float[] multiplyRowVector(
float[] vec) {
449 ans =
new float[SIZE];
451 for (i = 0; i < SIZE; i++) {
453 for (k = 0; k < SIZE; k++) {
454 sum = sum + vec[k] * matrix[i][k];
462 public float[] multiplyColVector(
float[] vec) {
467 ans =
new float[SIZE*SIZE];
469 for (i = 0; i < SIZE; i++) {
471 for (k = 0; k < SIZE; k++) {
472 sum = sum + matrix[k][i]*vec[k];