66c37986e4e778f492a743176f80ec18570a00cc
[jalview.git] / MCMatrix.java
1 /*\r
2 * Jalview - A Sequence Alignment Editor and Viewer\r
3 * Copyright (C) 2005 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 MCview;\r
20 \r
21 public class MCMatrix {\r
22     float[][] matrix;\r
23     float[][] tmp;\r
24     float mycos;\r
25     float mysin;\r
26     float myconst = (float) (Math.PI / 180);\r
27 \r
28     public MCMatrix(int rows, int cols) {\r
29         matrix = new float[rows][cols];\r
30         tmp = new float[rows][cols];\r
31     }\r
32 \r
33     public void addElement(int i, int j, float value) {\r
34         matrix[i][j] = value;\r
35     }\r
36 \r
37     public void rotatex(float degrees) {\r
38         mycos = (float) (Math.cos(degrees * myconst));\r
39         mysin = (float) (Math.sin(degrees * myconst));\r
40 \r
41         tmp[0][0] = 1;\r
42         tmp[0][1] = 0;\r
43         tmp[0][2] = 0;\r
44         tmp[1][0] = 0;\r
45         tmp[1][1] = mycos;\r
46         tmp[1][2] = mysin;\r
47         tmp[2][0] = 0;\r
48         tmp[2][1] = -mysin;\r
49         tmp[2][2] = mycos;\r
50         preMultiply(tmp);\r
51     }\r
52 \r
53     public void rotatez(float degrees) {\r
54         mycos = (float) (Math.cos(degrees * myconst));\r
55         mysin = (float) (Math.sin(degrees * myconst));\r
56 \r
57         tmp[0][0] = mycos;\r
58         tmp[0][1] = -mysin;\r
59         tmp[0][2] = 0;\r
60         tmp[1][0] = mysin;\r
61         tmp[1][1] = mycos;\r
62         tmp[1][2] = 0;\r
63         tmp[2][0] = 0;\r
64         tmp[2][1] = 0;\r
65         tmp[2][2] = 1;\r
66 \r
67         preMultiply(tmp);\r
68     }\r
69 \r
70     public void rotatey(float degrees) {\r
71         mycos = (float) (Math.cos(degrees * myconst));\r
72         mysin = (float) (Math.sin(degrees * myconst));\r
73 \r
74         tmp[0][0] = mycos;\r
75         tmp[0][1] = 0;\r
76         tmp[0][2] = -mysin;\r
77         tmp[1][0] = 0;\r
78         tmp[1][1] = 1;\r
79         tmp[1][2] = 0;\r
80         tmp[2][0] = mysin;\r
81         tmp[2][1] = 0;\r
82         tmp[2][2] = mycos;\r
83 \r
84         preMultiply(tmp);\r
85     }\r
86 \r
87     public float[] vectorMultiply(float[] vect) {\r
88         float[] temp = new float[3];\r
89 \r
90         temp[0] = vect[0];\r
91         temp[1] = vect[1];\r
92         temp[2] = vect[2];\r
93 \r
94         for (int i = 0; i < 3; i++) {\r
95             temp[i] = ((float) matrix[i][0] * vect[0]) +\r
96                 ((float) matrix[i][1] * vect[1]) +\r
97                 ((float) matrix[i][2] * vect[2]);\r
98         }\r
99 \r
100         vect[0] = temp[0];\r
101         vect[1] = temp[1];\r
102         vect[2] = temp[2];\r
103 \r
104         return vect;\r
105     }\r
106 \r
107     public void preMultiply(float[][] mat) {\r
108         float[][] tmp = new float[3][3];\r
109 \r
110         for (int i = 0; i < 3; i++) {\r
111             for (int j = 0; j < 3; j++) {\r
112                 tmp[i][j] = (mat[i][0] * matrix[0][j]) +\r
113                     (mat[i][1] * matrix[1][j]) + (mat[i][2] * matrix[2][j]);\r
114             }\r
115         }\r
116 \r
117         for (int i = 0; i < 3; i++) {\r
118             for (int j = 0; j < 3; j++) {\r
119                 matrix[i][j] = tmp[i][j];\r
120             }\r
121         }\r
122     }\r
123 \r
124     public void postMultiply(float[][] mat) {\r
125         float[][] tmp = new float[3][3];\r
126 \r
127         for (int i = 0; i < 3; i++) {\r
128             for (int j = 0; j < 3; j++) {\r
129                 tmp[i][j] = (matrix[i][0] * mat[0][j]) +\r
130                     (matrix[i][1] * mat[1][j]) + (matrix[i][2] * mat[2][j]);\r
131             }\r
132         }\r
133 \r
134         for (int i = 0; i < 3; i++) {\r
135             for (int j = 0; j < 3; j++) {\r
136                 matrix[i][j] = tmp[i][j];\r
137             }\r
138         }\r
139     }\r
140 \r
141     public void setIdentity() {\r
142         matrix[0][0] = 1;\r
143         matrix[1][1] = 1;\r
144         matrix[2][2] = 1;\r
145         matrix[0][1] = 0;\r
146         matrix[0][2] = 0;\r
147         matrix[1][0] = 0;\r
148         matrix[1][2] = 0;\r
149         matrix[2][0] = 0;\r
150         matrix[2][1] = 0;\r
151     }\r
152 }\r