Crossfire JXClient, Trunk
Matrix3D.java
Go to the documentation of this file.
1 /*
2  * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * - Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * - Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  *
15  * - Neither the name of Oracle nor the names of its
16  * contributors may be used to endorse or promote products derived
17  * from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*
33  * This source code is provided to illustrate the usage of a given feature
34  * or technique and has been deliberately simplified. Additional steps
35  * required for a production-quality application, such as security checks,
36  * input validation and proper error handling, might not be present in
37  * this sample code.
38  */
39 
40 
41 
44 class Matrix3D {
45 
46  float xx, xy, xz, xo;
47  float yx, yy, yz, yo;
48  float zx, zy, zz, zo;
49  static final double pi = 3.14159265;
50 
53  xx = 1.0f;
54  yy = 1.0f;
55  zz = 1.0f;
56  }
57 
59  void scale(float f) {
60  xx *= f;
61  xy *= f;
62  xz *= f;
63  xo *= f;
64  yx *= f;
65  yy *= f;
66  yz *= f;
67  yo *= f;
68  zx *= f;
69  zy *= f;
70  zz *= f;
71  zo *= f;
72  }
73 
75  void scale(float xf, float yf, float zf) {
76  xx *= xf;
77  xy *= xf;
78  xz *= xf;
79  xo *= xf;
80  yx *= yf;
81  yy *= yf;
82  yz *= yf;
83  yo *= yf;
84  zx *= zf;
85  zy *= zf;
86  zz *= zf;
87  zo *= zf;
88  }
89 
91  void translate(float x, float y, float z) {
92  xo += x;
93  yo += y;
94  zo += z;
95  }
96 
98  void yrot(double theta) {
99  theta *= (pi / 180);
100  double ct = Math.cos(theta);
101  double st = Math.sin(theta);
102 
103  float Nxx = (float) (xx * ct + zx * st);
104  float Nxy = (float) (xy * ct + zy * st);
105  float Nxz = (float) (xz * ct + zz * st);
106  float Nxo = (float) (xo * ct + zo * st);
107 
108  float Nzx = (float) (zx * ct - xx * st);
109  float Nzy = (float) (zy * ct - xy * st);
110  float Nzz = (float) (zz * ct - xz * st);
111  float Nzo = (float) (zo * ct - xo * st);
112 
113  xo = Nxo;
114  xx = Nxx;
115  xy = Nxy;
116  xz = Nxz;
117  zo = Nzo;
118  zx = Nzx;
119  zy = Nzy;
120  zz = Nzz;
121  }
122 
124  void xrot(double theta) {
125  theta *= (pi / 180);
126  double ct = Math.cos(theta);
127  double st = Math.sin(theta);
128 
129  float Nyx = (float) (yx * ct + zx * st);
130  float Nyy = (float) (yy * ct + zy * st);
131  float Nyz = (float) (yz * ct + zz * st);
132  float Nyo = (float) (yo * ct + zo * st);
133 
134  float Nzx = (float) (zx * ct - yx * st);
135  float Nzy = (float) (zy * ct - yy * st);
136  float Nzz = (float) (zz * ct - yz * st);
137  float Nzo = (float) (zo * ct - yo * st);
138 
139  yo = Nyo;
140  yx = Nyx;
141  yy = Nyy;
142  yz = Nyz;
143  zo = Nzo;
144  zx = Nzx;
145  zy = Nzy;
146  zz = Nzz;
147  }
148 
150  void zrot(double theta) {
151  theta *= (pi / 180);
152  double ct = Math.cos(theta);
153  double st = Math.sin(theta);
154 
155  float Nyx = (float) (yx * ct + xx * st);
156  float Nyy = (float) (yy * ct + xy * st);
157  float Nyz = (float) (yz * ct + xz * st);
158  float Nyo = (float) (yo * ct + xo * st);
159 
160  float Nxx = (float) (xx * ct - yx * st);
161  float Nxy = (float) (xy * ct - yy * st);
162  float Nxz = (float) (xz * ct - yz * st);
163  float Nxo = (float) (xo * ct - yo * st);
164 
165  yo = Nyo;
166  yx = Nyx;
167  yy = Nyy;
168  yz = Nyz;
169  xo = Nxo;
170  xx = Nxx;
171  xy = Nxy;
172  xz = Nxz;
173  }
174 
176  void mult(Matrix3D rhs) {
177  float lxx = xx * rhs.xx + yx * rhs.xy + zx * rhs.xz;
178  float lxy = xy * rhs.xx + yy * rhs.xy + zy * rhs.xz;
179  float lxz = xz * rhs.xx + yz * rhs.xy + zz * rhs.xz;
180  float lxo = xo * rhs.xx + yo * rhs.xy + zo * rhs.xz + rhs.xo;
181 
182  float lyx = xx * rhs.yx + yx * rhs.yy + zx * rhs.yz;
183  float lyy = xy * rhs.yx + yy * rhs.yy + zy * rhs.yz;
184  float lyz = xz * rhs.yx + yz * rhs.yy + zz * rhs.yz;
185  float lyo = xo * rhs.yx + yo * rhs.yy + zo * rhs.yz + rhs.yo;
186 
187  float lzx = xx * rhs.zx + yx * rhs.zy + zx * rhs.zz;
188  float lzy = xy * rhs.zx + yy * rhs.zy + zy * rhs.zz;
189  float lzz = xz * rhs.zx + yz * rhs.zy + zz * rhs.zz;
190  float lzo = xo * rhs.zx + yo * rhs.zy + zo * rhs.zz + rhs.zo;
191 
192  xx = lxx;
193  xy = lxy;
194  xz = lxz;
195  xo = lxo;
196 
197  yx = lyx;
198  yy = lyy;
199  yz = lyz;
200  yo = lyo;
201 
202  zx = lzx;
203  zy = lzy;
204  zz = lzz;
205  zo = lzo;
206  }
207 
209  void unit() {
210  xo = 0;
211  xx = 1;
212  xy = 0;
213  xz = 0;
214  yo = 0;
215  yx = 0;
216  yy = 1;
217  yz = 0;
218  zo = 0;
219  zx = 0;
220  zy = 0;
221  zz = 1;
222  }
223 
228  void transform(float v[], int tv[], int nvert) {
229  float lxx = xx, lxy = xy, lxz = xz, lxo = xo;
230  float lyx = yx, lyy = yy, lyz = yz, lyo = yo;
231  float lzx = zx, lzy = zy, lzz = zz, lzo = zo;
232  for (int i = nvert * 3; (i -= 3) >= 0;) {
233  float x = v[i];
234  float y = v[i + 1];
235  float z = v[i + 2];
236  tv[i] = (int) (x * lxx + y * lxy + z * lxz + lxo);
237  tv[i + 1] = (int) (x * lyx + y * lyy + z * lyz + lyo);
238  tv[i + 2] = (int) (x * lzx + y * lzy + z * lzz + lzo);
239  }
240  }
241 
242  @Override
243  public String toString() {
244  return ("[" + xo + "," + xx + "," + xy + "," + xz + ";"
245  + yo + "," + yx + "," + yy + "," + yz + ";"
246  + zo + "," + zx + "," + zy + "," + zz + "]");
247  }
248 }
Matrix3D.yz
float yz
Definition: Matrix3D.java:47
Matrix3D.unit
void unit()
Definition: Matrix3D.java:209
Matrix3D.zx
float zx
Definition: Matrix3D.java:48
Matrix3D.xx
float xx
Definition: Matrix3D.java:46
Matrix3D.xy
float xy
Definition: Matrix3D.java:46
Matrix3D
Definition: Matrix3D.java:44
Matrix3D.yx
float yx
Definition: Matrix3D.java:47
Matrix3D.pi
static final double pi
Definition: Matrix3D.java:49
Matrix3D.zy
float zy
Definition: Matrix3D.java:48
Matrix3D.xo
float xo
Definition: Matrix3D.java:46
Matrix3D.toString
String toString()
Definition: Matrix3D.java:243
Matrix3D.zrot
void zrot(double theta)
Definition: Matrix3D.java:150
Matrix3D.xz
float xz
Definition: Matrix3D.java:46
Matrix3D.scale
void scale(float xf, float yf, float zf)
Definition: Matrix3D.java:75
Matrix3D.zo
float zo
Definition: Matrix3D.java:48
Matrix3D.yy
float yy
Definition: Matrix3D.java:47
Matrix3D.yrot
void yrot(double theta)
Definition: Matrix3D.java:98
Matrix3D.transform
void transform(float v[], int tv[], int nvert)
Definition: Matrix3D.java:228
Matrix3D.Matrix3D
Matrix3D()
Definition: Matrix3D.java:52
Matrix3D.scale
void scale(float f)
Definition: Matrix3D.java:59
Matrix3D.zz
float zz
Definition: Matrix3D.java:48
Matrix3D.mult
void mult(Matrix3D rhs)
Definition: Matrix3D.java:176
Matrix3D.yo
float yo
Definition: Matrix3D.java:47
Matrix3D.translate
void translate(float x, float y, float z)
Definition: Matrix3D.java:91
Matrix3D.xrot
void xrot(double theta)
Definition: Matrix3D.java:124