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