JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / src / javajs / util / M34.java
1 package javajs.util;\r
2 \r
3 /**\r
4  * A base class for both M3 and M4 to conserve code size.\r
5  * \r
6  * @author Kenji hiranabe\r
7  * \r
8  *         additions by Bob Hanson hansonr@stolaf.edu 9/30/2012 for unique\r
9  *         constructor and method names for the optimization of compiled\r
10  *         JavaScript using Java2Script and for subclassing to M3 and M4\r
11  * \r
12  */\r
13 public abstract class M34 {\r
14 \r
15   /**\r
16    * The first element of the first row\r
17    */\r
18   public float m00;\r
19 \r
20   /**\r
21    * The second element of the first row.\r
22    */\r
23   public float m01;\r
24 \r
25   /**\r
26    * third element of the first row.\r
27    */\r
28   public float m02;\r
29 \r
30   /**\r
31    * The first element of the second row.\r
32    */\r
33   public float m10;\r
34 \r
35   /**\r
36    * The second element of the second row.\r
37    */\r
38   public float m11;\r
39 \r
40   /**\r
41    * The third element of the second row.\r
42    */\r
43   public float m12;\r
44 \r
45   /**\r
46    * The first element of the third row.\r
47    */\r
48   public float m20;\r
49 \r
50   /**\r
51    * The second element of the third row.\r
52    */\r
53   public float m21;\r
54 \r
55   /**\r
56    * The third element of the third row.\r
57    */\r
58   public float m22;\r
59 \r
60   protected void setAA33(A4 a) {\r
61     double x = a.x;\r
62     double y = a.y;\r
63     double z = a.z;\r
64     double angle = a.angle;\r
65     // Taken from Rick's which is taken from Wertz. pg. 412\r
66     // Bug Fixed and changed into right-handed by hiranabe\r
67     double n = Math.sqrt(x * x + y * y + z * z);\r
68     // zero-div may occur\r
69     n = 1 / n;\r
70     x *= n;\r
71     y *= n;\r
72     z *= n;\r
73     double c = Math.cos(angle);\r
74     double s = Math.sin(angle);\r
75     double omc = 1.0 - c;\r
76     m00 = (float) (c + x * x * omc);\r
77     m11 = (float) (c + y * y * omc);\r
78     m22 = (float) (c + z * z * omc);\r
79 \r
80     double tmp1 = x * y * omc;\r
81     double tmp2 = z * s;\r
82     m01 = (float) (tmp1 - tmp2);\r
83     m10 = (float) (tmp1 + tmp2);\r
84 \r
85     tmp1 = x * z * omc;\r
86     tmp2 = y * s;\r
87     m02 = (float) (tmp1 + tmp2);\r
88     m20 = (float) (tmp1 - tmp2);\r
89 \r
90     tmp1 = y * z * omc;\r
91     tmp2 = x * s;\r
92     m12 = (float) (tmp1 - tmp2);\r
93     m21 = (float) (tmp1 + tmp2);\r
94   }\r
95 \r
96   public void rotate(T3 t) {\r
97     // alias-safe\r
98     rotate2(t, t);\r
99   }\r
100 \r
101   /**\r
102    * Transform the vector vec using this Matrix3f and place the result into\r
103    * vecOut.\r
104    * \r
105    * @param t\r
106    *        the single precision vector to be transformed\r
107    * @param result\r
108    *        the vector into which the transformed values are placed\r
109    */\r
110   public void rotate2(T3 t, T3 result) {\r
111     // alias-safe\r
112     result.set(m00 * t.x + m01 * t.y + m02 * t.z, m10 * t.x + m11 * t.y + m12\r
113         * t.z, m20 * t.x + m21 * t.y + m22 * t.z);\r
114   }\r
115 \r
116 \r
117   /**\r
118    * Sets the value of this matrix to the double value of the Matrix3f argument.\r
119    * \r
120    * @param m1\r
121    *        the matrix3f\r
122    */\r
123   protected void setM33(M34 m1) {\r
124     m00 = m1.m00;\r
125     m01 = m1.m01;\r
126     m02 = m1.m02;\r
127     m10 = m1.m10;\r
128     m11 = m1.m11;\r
129     m12 = m1.m12;\r
130     m20 = m1.m20;\r
131     m21 = m1.m21;\r
132     m22 = m1.m22;\r
133   }\r
134 \r
135   protected void clear33() {\r
136     m00 = m01 = m02 = m10 = m11 = m12 = m20 = m21 = m22 = 0.0f;\r
137   }\r
138 \r
139   protected void set33(int row, int col, float v) {\r
140     switch (row) {\r
141     case 0:\r
142       switch (col) {\r
143       case 0:\r
144         m00 = v;\r
145         return;\r
146       case 1:\r
147         m01 = v;\r
148         return;\r
149       case 2: \r
150         m02 = v;\r
151         return;\r
152       }\r
153       break;\r
154     case 1:\r
155       switch (col) {\r
156       case 0:\r
157         m10 = v;\r
158         return;\r
159       case 1:\r
160         m11 = v;\r
161         return;\r
162       case 2: \r
163         m12 = v;\r
164         return;\r
165       }\r
166       break;\r
167     case 2: \r
168       switch (col) {\r
169       case 0:\r
170         m20 = v;\r
171         return;\r
172       case 1:\r
173         m21 = v;\r
174         return;\r
175       case 2: \r
176         m22 = v;\r
177         return;\r
178       }\r
179       break;\r
180     }\r
181     err();\r
182   }\r
183 \r
184   protected float get33(int row, int col) {\r
185     switch (row) {\r
186     case 0:\r
187       switch (col) {\r
188       case 0:\r
189         return m00;\r
190       case 1:\r
191         return m01;\r
192       case 2:\r
193         return m02;\r
194       }\r
195       break;\r
196     case 1:\r
197       switch (col) {\r
198       case 0:\r
199         return m10;\r
200       case 1:\r
201         return m11;\r
202       case 2:\r
203         return m12;\r
204       }\r
205       break;\r
206     case 2:\r
207       switch (col) {\r
208       case 0:\r
209         return m20;\r
210       case 1:\r
211         return m21;\r
212       case 2:\r
213         return m22;\r
214       }\r
215       break;\r
216     }\r
217     err();\r
218     return 0;\r
219   }\r
220 \r
221   protected void setRow33(int row, float v[]) {\r
222     switch (row) {\r
223     case 0:\r
224       m00 = v[0];\r
225       m01 = v[1];\r
226       m02 = v[2];\r
227       return;\r
228     case 1:\r
229       m10 = v[0];\r
230       m11 = v[1];\r
231       m12 = v[2];\r
232       return;\r
233     case 2:\r
234       m20 = v[0];\r
235       m21 = v[1];\r
236       m22 = v[2];\r
237       return;\r
238     default:\r
239       err();\r
240     }\r
241   }\r
242   \r
243   public abstract void getRow(int row, float v[]);\r
244 \r
245   protected void getRow33(int row, float v[]) {\r
246     switch (row) {\r
247     case 0:\r
248       v[0] = m00;\r
249       v[1] = m01;\r
250       v[2] = m02;\r
251       return;\r
252     case 1:\r
253       v[0] = m10;\r
254       v[1] = m11;\r
255       v[2] = m12;\r
256       return;\r
257     case 2:\r
258       v[0] = m20;\r
259       v[1] = m21;\r
260       v[2] = m22;\r
261       return;\r
262     }\r
263     err();\r
264   }\r
265 \r
266   protected void setColumn33(int column, float v[]) {\r
267     switch(column) {\r
268     case 0:\r
269       m00 = v[0];\r
270       m10 = v[1];\r
271       m20 = v[2];\r
272       break;\r
273     case 1:\r
274       m01 = v[0];\r
275       m11 = v[1];\r
276       m21 = v[2];\r
277       break;\r
278     case 2:\r
279       m02 = v[0];\r
280       m12 = v[1];\r
281       m22 = v[2];\r
282       break;\r
283      default:\r
284       err();\r
285     }\r
286   }\r
287 \r
288   protected void getColumn33(int column, float v[]) {\r
289     switch(column) {\r
290     case 0:\r
291       v[0] = m00;\r
292       v[1] = m10;\r
293       v[2] = m20;\r
294       break;\r
295     case 1:\r
296       v[0] = m01;\r
297       v[1] = m11;\r
298       v[2] = m21;\r
299       break;\r
300     case 2:\r
301       v[0] = m02;\r
302       v[1] = m12;\r
303       v[2] = m22;\r
304       break;\r
305     default:\r
306       err();\r
307     }\r
308   }\r
309 \r
310   protected void add33(M34 m1) {\r
311     m00 += m1.m00;\r
312     m01 += m1.m01;\r
313     m02 += m1.m02;\r
314     m10 += m1.m10;\r
315     m11 += m1.m11;\r
316     m12 += m1.m12;\r
317     m20 += m1.m20;\r
318     m21 += m1.m21;\r
319     m22 += m1.m22;\r
320   }\r
321 \r
322   protected void sub33(M34 m1) {\r
323     m00 -= m1.m00;\r
324     m01 -= m1.m01;\r
325     m02 -= m1.m02;\r
326     m10 -= m1.m10;\r
327     m11 -= m1.m11;\r
328     m12 -= m1.m12;\r
329     m20 -= m1.m20;\r
330     m21 -= m1.m21;\r
331     m22 -= m1.m22;\r
332   }\r
333 \r
334   protected void mul33(float x) {\r
335     m00 *= x;\r
336     m01 *= x;\r
337     m02 *= x;\r
338     m10 *= x;\r
339     m11 *= x;\r
340     m12 *= x;\r
341     m20 *= x;\r
342     m21 *= x;\r
343     m22 *= x;\r
344   }\r
345 \r
346   protected void transpose33() {\r
347     float tmp = m01;\r
348     m01 = m10;\r
349     m10 = tmp;\r
350 \r
351     tmp = m02;\r
352     m02 = m20;\r
353     m20 = tmp;\r
354 \r
355     tmp = m12;\r
356     m12 = m21;\r
357     m21 = tmp;\r
358   }\r
359 \r
360   protected void setXRot(float angle) {\r
361     double c = Math.cos(angle);\r
362     double s = Math.sin(angle);\r
363     m00 = 1.0f;\r
364     m01 = 0.0f;\r
365     m02 = 0.0f;\r
366     m10 = 0.0f;\r
367     m11 = (float) c;\r
368     m12 = (float) -s;\r
369     m20 = 0.0f;\r
370     m21 = (float) s;\r
371     m22 = (float) c;\r
372   }\r
373 \r
374   protected void setYRot(float angle) {\r
375     double c = Math.cos(angle);\r
376     double s = Math.sin(angle);\r
377     m00 = (float) c;\r
378     m01 = 0.0f;\r
379     m02 = (float) s;\r
380     m10 = 0.0f;\r
381     m11 = 1.0f;\r
382     m12 = 0.0f;\r
383     m20 = (float) -s;\r
384     m21 = 0.0f;\r
385     m22 = (float) c;\r
386   }\r
387   \r
388   protected void setZRot(float angle) {\r
389     double c = Math.cos(angle);\r
390     double s = Math.sin(angle);\r
391     m00 = (float) c;\r
392     m01 = (float) -s;\r
393     m02 = 0.0f;\r
394     m10 = (float) s;\r
395     m11 = (float) c;\r
396     m12 = 0.0f;\r
397     m20 = 0.0f;\r
398     m21 = 0.0f;\r
399     m22 = 1.0f;\r
400   }\r
401   \r
402   /**\r
403    * @return 3x3 determinant\r
404    */\r
405   public float determinant3() {\r
406     return m00 * (m11 * m22 - m21 * m12) - m01 * (m10 * m22 - m20 * m12) + m02\r
407         * (m10 * m21 - m20 * m11);\r
408   }\r
409   \r
410   protected void err() {\r
411     throw new ArrayIndexOutOfBoundsException(\r
412         "matrix column/row out of bounds");\r
413   }\r
414 \r
415 \r
416 }\r