Formatted source
[jalview.git] / src / MCview / 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 print() {\r
38         System.out.println(matrix[0][0] + " " + matrix[0][1] + " " +\r
39             matrix[0][2]);\r
40         System.out.println(matrix[1][0] + " " + matrix[1][1] + " " +\r
41             matrix[1][2]);\r
42         System.out.println(matrix[2][0] + " " + matrix[2][1] + " " +\r
43             matrix[2][2]);\r
44     }\r
45 \r
46     public void rotatex(float degrees) {\r
47         mycos = (float) (Math.cos(degrees * myconst));\r
48         mysin = (float) (Math.sin(degrees * myconst));\r
49 \r
50         tmp[0][0] = 1;\r
51         tmp[0][1] = 0;\r
52         tmp[0][2] = 0;\r
53         tmp[1][0] = 0;\r
54         tmp[1][1] = mycos;\r
55         tmp[1][2] = mysin;\r
56         tmp[2][0] = 0;\r
57         tmp[2][1] = -mysin;\r
58         tmp[2][2] = mycos;\r
59         preMultiply(tmp);\r
60     }\r
61 \r
62     public void rotatez(float degrees) {\r
63         mycos = (float) (Math.cos(degrees * myconst));\r
64         mysin = (float) (Math.sin(degrees * myconst));\r
65 \r
66         tmp[0][0] = mycos;\r
67         tmp[0][1] = -mysin;\r
68         tmp[0][2] = 0;\r
69         tmp[1][0] = mysin;\r
70         tmp[1][1] = mycos;\r
71         tmp[1][2] = 0;\r
72         tmp[2][0] = 0;\r
73         tmp[2][1] = 0;\r
74         tmp[2][2] = 1;\r
75 \r
76         preMultiply(tmp);\r
77     }\r
78 \r
79     public void rotatey(float degrees) {\r
80         mycos = (float) (Math.cos(degrees * myconst));\r
81         mysin = (float) (Math.sin(degrees * myconst));\r
82 \r
83         tmp[0][0] = mycos;\r
84         tmp[0][1] = 0;\r
85         tmp[0][2] = -mysin;\r
86         tmp[1][0] = 0;\r
87         tmp[1][1] = 1;\r
88         tmp[1][2] = 0;\r
89         tmp[2][0] = mysin;\r
90         tmp[2][1] = 0;\r
91         tmp[2][2] = mycos;\r
92 \r
93         preMultiply(tmp);\r
94     }\r
95 \r
96     public float[] vectorMultiply(float[] vect) {\r
97         float[] temp = new float[3];\r
98 \r
99         temp[0] = vect[0];\r
100         temp[1] = vect[1];\r
101         temp[2] = vect[2];\r
102 \r
103         for (int i = 0; i < 3; i++) {\r
104             temp[i] = ((float) matrix[i][0] * vect[0]) +\r
105                 ((float) matrix[i][1] * vect[1]) +\r
106                 ((float) matrix[i][2] * vect[2]);\r
107         }\r
108 \r
109         vect[0] = temp[0];\r
110         vect[1] = temp[1];\r
111         vect[2] = temp[2];\r
112 \r
113         return vect;\r
114     }\r
115 \r
116     public void preMultiply(float[][] mat) {\r
117         float[][] tmp = new float[3][3];\r
118 \r
119         for (int i = 0; i < 3; i++) {\r
120             for (int j = 0; j < 3; j++) {\r
121                 tmp[i][j] = (mat[i][0] * matrix[0][j]) +\r
122                     (mat[i][1] * matrix[1][j]) + (mat[i][2] * matrix[2][j]);\r
123             }\r
124         }\r
125 \r
126         for (int i = 0; i < 3; i++) {\r
127             for (int j = 0; j < 3; j++) {\r
128                 matrix[i][j] = tmp[i][j];\r
129             }\r
130         }\r
131     }\r
132 \r
133     public void postMultiply(float[][] mat) {\r
134         float[][] tmp = new float[3][3];\r
135 \r
136         for (int i = 0; i < 3; i++) {\r
137             for (int j = 0; j < 3; j++) {\r
138                 tmp[i][j] = (matrix[i][0] * mat[0][j]) +\r
139                     (matrix[i][1] * mat[1][j]) + (matrix[i][2] * mat[2][j]);\r
140             }\r
141         }\r
142 \r
143         for (int i = 0; i < 3; i++) {\r
144             for (int j = 0; j < 3; j++) {\r
145                 matrix[i][j] = tmp[i][j];\r
146             }\r
147         }\r
148     }\r
149 \r
150     public void setIdentity() {\r
151         matrix[0][0] = 1;\r
152         matrix[1][1] = 1;\r
153         matrix[2][2] = 1;\r
154         matrix[0][1] = 0;\r
155         matrix[0][2] = 0;\r
156         matrix[1][0] = 0;\r
157         matrix[1][2] = 0;\r
158         matrix[2][0] = 0;\r
159         matrix[2][1] = 0;\r
160     }\r
161 }\r