dfe09f1fe6a8a59dad17aa4af48a08e126a8acb8
[jalview.git] / src / jalview / math / RotatableMatrix.java
1 package jalview.math;\r
2 \r
3 \r
4 \r
5 public class RotatableMatrix {\r
6 \r
7   float matrix[][];\r
8 \r
9   float[] temp;\r
10 \r
11   float[][] rot;\r
12 \r
13 \r
14 \r
15   public RotatableMatrix(int rows, int cols) {\r
16 \r
17     matrix = new float[rows][cols];\r
18 \r
19     temp = new float[3];\r
20 \r
21     rot = new float[3][3];\r
22 \r
23   }\r
24 \r
25 \r
26 \r
27   public void addElement(int i, int j, float value) {\r
28 \r
29     matrix[i][j] = value;\r
30 \r
31   }\r
32 \r
33 \r
34 \r
35   public void print() {\r
36 \r
37     System.out.println(matrix[0][0] + " " + matrix[0][1] + " " + matrix[0][2]);\r
38 \r
39     System.out.println(matrix[1][0] + " " + matrix[1][1] + " " + matrix[1][2]);\r
40 \r
41     System.out.println(matrix[2][0] + " " + matrix[2][1] + " " + matrix[2][2]);\r
42 \r
43   }\r
44 \r
45 \r
46 \r
47   public void rotate (float degrees, char axis) {\r
48 \r
49 \r
50 \r
51     float costheta = (float)Math.cos(degrees*Math.PI/(float)180.0);\r
52 \r
53     float sintheta = (float)Math.sin(degrees*Math.PI/(float)180.0);\r
54 \r
55 \r
56 \r
57     if (axis == 'z') {\r
58 \r
59 \r
60 \r
61       rot[0][0] = (float)costheta;\r
62 \r
63       rot[0][1] = (float)-sintheta;\r
64 \r
65       rot[0][2] = (float)0.0;\r
66 \r
67 \r
68 \r
69       rot[1][0] = (float)sintheta;\r
70 \r
71       rot[1][1] = (float)costheta;\r
72 \r
73       rot[1][2] = (float)0.0;\r
74 \r
75 \r
76 \r
77       rot[2][0] = (float)0.0;\r
78 \r
79       rot[2][1] = (float)0.0;\r
80 \r
81       rot[2][2] = (float)1.0;\r
82 \r
83 \r
84 \r
85       preMultiply(rot);\r
86 \r
87     }\r
88 \r
89     if (axis == 'x') {\r
90 \r
91       rot[0][0] = (float)1.0;\r
92 \r
93       rot[0][1] = (float)0.0;\r
94 \r
95       rot[0][2] = (float)0.0;\r
96 \r
97 \r
98 \r
99       rot[1][0] = (float)0.0;\r
100 \r
101       rot[1][1] = (float)costheta;\r
102 \r
103       rot[1][2] = (float)sintheta;\r
104 \r
105 \r
106 \r
107       rot[2][0] = (float)0.0;\r
108 \r
109       rot[2][1] = (float)-sintheta;\r
110 \r
111       rot[2][2] = (float)costheta;\r
112 \r
113 \r
114 \r
115       preMultiply(rot);\r
116 \r
117 \r
118 \r
119     }\r
120 \r
121     if (axis == 'y') {\r
122 \r
123       rot[0][0] = (float)costheta;\r
124 \r
125       rot[0][1] = (float)0.0;\r
126 \r
127       rot[0][2] = (float)-sintheta;\r
128 \r
129 \r
130 \r
131       rot[1][0] = (float)0.0;\r
132 \r
133       rot[1][1] = (float)1.0;\r
134 \r
135       rot[1][2] = (float)0.0;\r
136 \r
137 \r
138 \r
139       rot[2][0] = (float)sintheta;\r
140 \r
141       rot[2][1] = (float)0.0;\r
142 \r
143       rot[2][2] = (float)costheta;\r
144 \r
145 \r
146 \r
147       preMultiply(rot);\r
148 \r
149 \r
150 \r
151     }\r
152 \r
153 \r
154 \r
155   }\r
156 \r
157 \r
158 \r
159   public float[] vectorMultiply(float[] vect) {\r
160 \r
161     temp[0] = vect[0];\r
162 \r
163     temp[1] = vect[1];\r
164 \r
165     temp[2] = vect[2];\r
166 \r
167 \r
168 \r
169     for (int i = 0; i < 3; i++) {\r
170 \r
171       temp[i] = matrix[i][0]*vect[0] + matrix[i][1]*vect[1] + matrix[i][2]*vect[2];\r
172 \r
173     }\r
174 \r
175 \r
176 \r
177     vect[0] = temp[0];\r
178 \r
179     vect[1] = temp[1];\r
180 \r
181     vect[2] = temp[2];\r
182 \r
183 \r
184 \r
185     return vect;\r
186 \r
187   }\r
188 \r
189 \r
190 \r
191   public void preMultiply(float mat[][]) {\r
192 \r
193     float tmp[][]  = new float[3][3];\r
194 \r
195 \r
196 \r
197     for (int i = 0; i < 3 ; i++) {\r
198 \r
199       for (int j = 0; j < 3; j++ ) {\r
200 \r
201         tmp[i][j] = mat[i][0]*matrix[0][j] +\r
202 \r
203                     mat[i][1]*matrix[1][j] +\r
204 \r
205                     mat[i][2]*matrix[2][j];\r
206 \r
207       }\r
208 \r
209     }\r
210 \r
211 \r
212 \r
213     for (int i = 0; i < 3 ; i++) {\r
214 \r
215       for (int j = 0; j < 3; j++ ) {\r
216 \r
217         matrix[i][j] = tmp[i][j];\r
218 \r
219       }\r
220 \r
221     }\r
222 \r
223   }\r
224 \r
225 \r
226 \r
227   public void postMultiply(float mat[][]) {\r
228 \r
229     float tmp[][]  = new float[3][3];\r
230 \r
231 \r
232 \r
233     for (int i = 0; i < 3 ; i++) {\r
234 \r
235       for (int j = 0; j < 3; j++ ) {\r
236 \r
237         tmp[i][j] = matrix[i][0]*mat[0][j] +\r
238 \r
239                     matrix[i][1]*mat[1][j] +\r
240 \r
241                     matrix[i][2]*mat[2][j];\r
242 \r
243       }\r
244 \r
245     }\r
246 \r
247 \r
248 \r
249     for (int i = 0; i < 3 ; i++) {\r
250 \r
251       for (int j = 0; j < 3; j++ ) {\r
252 \r
253         matrix[i][j] = tmp[i][j];\r
254 \r
255       }\r
256 \r
257     }\r
258 \r
259   }\r
260 \r
261 \r
262 \r
263   public static void main(String[] args) {\r
264 \r
265 \r
266 \r
267     RotatableMatrix m = new  RotatableMatrix(3,3);\r
268 \r
269     m.addElement(0,0,1);\r
270 \r
271     m.addElement(0,1,0);\r
272 \r
273     m.addElement(0,2,0);\r
274 \r
275     m.addElement(1,0,0);\r
276 \r
277     m.addElement(1,1,2);\r
278 \r
279     m.addElement(1,2,0);\r
280 \r
281     m.addElement(2,0,0);\r
282 \r
283     m.addElement(2,1,0);\r
284 \r
285     m.addElement(2,2,1);\r
286 \r
287 \r
288 \r
289     m.print();\r
290 \r
291 \r
292 \r
293     RotatableMatrix n = new  RotatableMatrix(3,3);\r
294 \r
295     n.addElement(0,0,2);\r
296 \r
297     n.addElement(0,1,1);\r
298 \r
299     n.addElement(0,2,1);\r
300 \r
301     n.addElement(1,0,2);\r
302 \r
303     n.addElement(1,1,1);\r
304 \r
305     n.addElement(1,2,1);\r
306 \r
307     n.addElement(2,0,2);\r
308 \r
309     n.addElement(2,1,1);\r
310 \r
311     n.addElement(2,2,1);\r
312 \r
313 \r
314 \r
315     n.print();\r
316 \r
317 \r
318 \r
319     //m.postMultiply(n.matrix);\r
320 \r
321     //m.print();\r
322 \r
323     //     m.rotate(45,'z',new RotatableMatrix(3,3));\r
324 \r
325 \r
326 \r
327     float vect[] = new float[3];\r
328 \r
329     vect[0] = 2;\r
330 \r
331     vect[1] = 4;\r
332 \r
333     vect[2] = 6;\r
334 \r
335 \r
336 \r
337     vect = m.vectorMultiply(vect);\r
338 \r
339     System.out.println(vect[0] + " " + vect[1] + " " + vect[2]);\r
340 \r
341 \r
342 \r
343   }\r
344 \r
345   public void setIdentity() {\r
346 \r
347     matrix[0][0] = (float)1.0;\r
348 \r
349     matrix[1][1] = (float)1.0;\r
350 \r
351     matrix[2][2] = (float)1.0;\r
352 \r
353     matrix[0][1] = (float)0.0;\r
354 \r
355     matrix[0][2] = (float)0.0;\r
356 \r
357     matrix[1][0] = (float)0.0;\r
358 \r
359     matrix[1][2] = (float) 0.0;\r
360 \r
361     matrix[2][0] = (float)0.0;\r
362 \r
363     matrix[2][1] = (float)0.0;\r
364 \r
365   }\r
366 \r
367 }\r
368 \r
369 \r
370 \r