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