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