header updated
[jalview.git] / src / jalview / math / RotatableMatrix.java
1 /*\r
2 * Jalview - A Sequence Alignment Editor and Viewer\r
3 * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4 *\r
5 * This program is free software; you can redistribute it and/or\r
6 * modify it under the terms of the GNU General Public License\r
7 * as published by the Free Software Foundation; either version 2\r
8 * of the License, or (at your option) any later version.\r
9 *\r
10 * This program is distributed in the hope that it will be useful,\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 * GNU General Public License for more details.\r
14 *\r
15 * You should have received a copy of the GNU General Public License\r
16 * along with this program; if not, write to the Free Software\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18 */\r
19 package jalview.math;\r
20 \r
21 \r
22 /**\r
23  * DOCUMENT ME!\r
24  *\r
25  * @author $author$\r
26  * @version $Revision$\r
27  */\r
28 public class RotatableMatrix\r
29 {\r
30     float[][] matrix;\r
31     float[] temp;\r
32     float[][] rot;\r
33 \r
34     /**\r
35      * Creates a new RotatableMatrix object.\r
36      *\r
37      * @param rows DOCUMENT ME!\r
38      * @param cols DOCUMENT ME!\r
39      */\r
40     public RotatableMatrix(int rows, int cols)\r
41     {\r
42         matrix = new float[rows][cols];\r
43 \r
44         temp = new float[3];\r
45 \r
46         rot = new float[3][3];\r
47     }\r
48 \r
49     /**\r
50      * DOCUMENT ME!\r
51      *\r
52      * @param i DOCUMENT ME!\r
53      * @param j DOCUMENT ME!\r
54      * @param value DOCUMENT ME!\r
55      */\r
56     public void addElement(int i, int j, float value)\r
57     {\r
58         matrix[i][j] = value;\r
59     }\r
60 \r
61     /**\r
62      * DOCUMENT ME!\r
63      */\r
64     public void print()\r
65     {\r
66         System.out.println(matrix[0][0] + " " + matrix[0][1] + " " +\r
67             matrix[0][2]);\r
68 \r
69         System.out.println(matrix[1][0] + " " + matrix[1][1] + " " +\r
70             matrix[1][2]);\r
71 \r
72         System.out.println(matrix[2][0] + " " + matrix[2][1] + " " +\r
73             matrix[2][2]);\r
74     }\r
75 \r
76     /**\r
77      * DOCUMENT ME!\r
78      *\r
79      * @param degrees DOCUMENT ME!\r
80      * @param axis DOCUMENT ME!\r
81      */\r
82     public void rotate(float degrees, char axis)\r
83     {\r
84         float costheta = (float) Math.cos((degrees * Math.PI) / (float) 180.0);\r
85 \r
86         float sintheta = (float) Math.sin((degrees * Math.PI) / (float) 180.0);\r
87 \r
88         if (axis == 'z')\r
89         {\r
90             rot[0][0] = (float) costheta;\r
91 \r
92             rot[0][1] = (float) -sintheta;\r
93 \r
94             rot[0][2] = (float) 0.0;\r
95 \r
96             rot[1][0] = (float) sintheta;\r
97 \r
98             rot[1][1] = (float) costheta;\r
99 \r
100             rot[1][2] = (float) 0.0;\r
101 \r
102             rot[2][0] = (float) 0.0;\r
103 \r
104             rot[2][1] = (float) 0.0;\r
105 \r
106             rot[2][2] = (float) 1.0;\r
107 \r
108             preMultiply(rot);\r
109         }\r
110 \r
111         if (axis == 'x')\r
112         {\r
113             rot[0][0] = (float) 1.0;\r
114 \r
115             rot[0][1] = (float) 0.0;\r
116 \r
117             rot[0][2] = (float) 0.0;\r
118 \r
119             rot[1][0] = (float) 0.0;\r
120 \r
121             rot[1][1] = (float) costheta;\r
122 \r
123             rot[1][2] = (float) sintheta;\r
124 \r
125             rot[2][0] = (float) 0.0;\r
126 \r
127             rot[2][1] = (float) -sintheta;\r
128 \r
129             rot[2][2] = (float) costheta;\r
130 \r
131             preMultiply(rot);\r
132         }\r
133 \r
134         if (axis == 'y')\r
135         {\r
136             rot[0][0] = (float) costheta;\r
137 \r
138             rot[0][1] = (float) 0.0;\r
139 \r
140             rot[0][2] = (float) -sintheta;\r
141 \r
142             rot[1][0] = (float) 0.0;\r
143 \r
144             rot[1][1] = (float) 1.0;\r
145 \r
146             rot[1][2] = (float) 0.0;\r
147 \r
148             rot[2][0] = (float) sintheta;\r
149 \r
150             rot[2][1] = (float) 0.0;\r
151 \r
152             rot[2][2] = (float) costheta;\r
153 \r
154             preMultiply(rot);\r
155         }\r
156     }\r
157 \r
158     /**\r
159      * DOCUMENT ME!\r
160      *\r
161      * @param vect DOCUMENT ME!\r
162      *\r
163      * @return DOCUMENT ME!\r
164      */\r
165     public float[] vectorMultiply(float[] vect)\r
166     {\r
167         temp[0] = vect[0];\r
168 \r
169         temp[1] = vect[1];\r
170 \r
171         temp[2] = vect[2];\r
172 \r
173         for (int i = 0; i < 3; i++)\r
174         {\r
175             temp[i] = (matrix[i][0] * vect[0]) + (matrix[i][1] * vect[1]) +\r
176                 (matrix[i][2] * vect[2]);\r
177         }\r
178 \r
179         vect[0] = temp[0];\r
180 \r
181         vect[1] = temp[1];\r
182 \r
183         vect[2] = temp[2];\r
184 \r
185         return vect;\r
186     }\r
187 \r
188     /**\r
189      * DOCUMENT ME!\r
190      *\r
191      * @param mat DOCUMENT ME!\r
192      */\r
193     public void preMultiply(float[][] mat)\r
194     {\r
195         float[][] tmp = new float[3][3];\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                     (mat[i][1] * matrix[1][j]) + (mat[i][2] * matrix[2][j]);\r
203             }\r
204         }\r
205 \r
206         for (int i = 0; i < 3; i++)\r
207         {\r
208             for (int j = 0; j < 3; j++)\r
209             {\r
210                 matrix[i][j] = tmp[i][j];\r
211             }\r
212         }\r
213     }\r
214 \r
215     /**\r
216      * DOCUMENT ME!\r
217      *\r
218      * @param mat DOCUMENT ME!\r
219      */\r
220     public void postMultiply(float[][] mat)\r
221     {\r
222         float[][] tmp = new float[3][3];\r
223 \r
224         for (int i = 0; i < 3; i++)\r
225         {\r
226             for (int j = 0; j < 3; j++)\r
227             {\r
228                 tmp[i][j] = (matrix[i][0] * mat[0][j]) +\r
229                     (matrix[i][1] * mat[1][j]) + (matrix[i][2] * mat[2][j]);\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                 matrix[i][j] = tmp[i][j];\r
238             }\r
239         }\r
240     }\r
241 \r
242     /**\r
243      * DOCUMENT ME!\r
244      *\r
245      * @param args DOCUMENT ME!\r
246      */\r
247     public static void main(String[] args)\r
248     {\r
249         RotatableMatrix m = new RotatableMatrix(3, 3);\r
250 \r
251         m.addElement(0, 0, 1);\r
252 \r
253         m.addElement(0, 1, 0);\r
254 \r
255         m.addElement(0, 2, 0);\r
256 \r
257         m.addElement(1, 0, 0);\r
258 \r
259         m.addElement(1, 1, 2);\r
260 \r
261         m.addElement(1, 2, 0);\r
262 \r
263         m.addElement(2, 0, 0);\r
264 \r
265         m.addElement(2, 1, 0);\r
266 \r
267         m.addElement(2, 2, 1);\r
268 \r
269         m.print();\r
270 \r
271         RotatableMatrix n = new RotatableMatrix(3, 3);\r
272 \r
273         n.addElement(0, 0, 2);\r
274 \r
275         n.addElement(0, 1, 1);\r
276 \r
277         n.addElement(0, 2, 1);\r
278 \r
279         n.addElement(1, 0, 2);\r
280 \r
281         n.addElement(1, 1, 1);\r
282 \r
283         n.addElement(1, 2, 1);\r
284 \r
285         n.addElement(2, 0, 2);\r
286 \r
287         n.addElement(2, 1, 1);\r
288 \r
289         n.addElement(2, 2, 1);\r
290 \r
291         n.print();\r
292 \r
293         //m.postMultiply(n.matrix);\r
294         //m.print();\r
295         //     m.rotate(45,'z',new RotatableMatrix(3,3));\r
296         float[] vect = new float[3];\r
297 \r
298         vect[0] = 2;\r
299 \r
300         vect[1] = 4;\r
301 \r
302         vect[2] = 6;\r
303 \r
304         vect = m.vectorMultiply(vect);\r
305 \r
306         System.out.println(vect[0] + " " + vect[1] + " " + vect[2]);\r
307     }\r
308 \r
309     /**\r
310      * DOCUMENT ME!\r
311      */\r
312     public void setIdentity()\r
313     {\r
314         matrix[0][0] = (float) 1.0;\r
315 \r
316         matrix[1][1] = (float) 1.0;\r
317 \r
318         matrix[2][2] = (float) 1.0;\r
319 \r
320         matrix[0][1] = (float) 0.0;\r
321 \r
322         matrix[0][2] = (float) 0.0;\r
323 \r
324         matrix[1][0] = (float) 0.0;\r
325 \r
326         matrix[1][2] = (float) 0.0;\r
327 \r
328         matrix[2][0] = (float) 0.0;\r
329 \r
330         matrix[2][1] = (float) 0.0;\r
331     }\r
332 }\r