0N/A/*
3845N/A * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
0N/A *
0N/A * Redistribution and use in source and binary forms, with or without
0N/A * modification, are permitted provided that the following conditions
0N/A * are met:
0N/A *
0N/A * - Redistributions of source code must retain the above copyright
0N/A * notice, this list of conditions and the following disclaimer.
0N/A *
0N/A * - Redistributions in binary form must reproduce the above copyright
0N/A * notice, this list of conditions and the following disclaimer in the
0N/A * documentation and/or other materials provided with the distribution.
0N/A *
2362N/A * - Neither the name of Oracle nor the names of its
0N/A * contributors may be used to endorse or promote products derived
0N/A * from this software without specific prior written permission.
0N/A *
0N/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
0N/A * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
0N/A * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
0N/A * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
0N/A * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
0N/A * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
0N/A * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
0N/A * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
0N/A * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
0N/A * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
0N/A * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
0N/A */
0N/A
4378N/A/*
4378N/A * This source code is provided to illustrate the usage of a given feature
4378N/A * or technique and has been deliberately simplified. Additional steps
4378N/A * required for a production-quality application, such as security checks,
4378N/A * input validation and proper error handling, might not be present in
4378N/A * this sample code.
4378N/A */
4378N/A
4378N/A
0N/A
0N/A/** A fairly conventional 3D matrix object that can transform sets of
3845N/A3D points and perform a variety of manipulations on the transform */
0N/Aclass Matrix3D {
3845N/A
0N/A float xx, xy, xz, xo;
0N/A float yx, yy, yz, yo;
0N/A float zx, zy, zz, zo;
0N/A static final double pi = 3.14159265;
3845N/A
0N/A /** Create a new unit matrix */
3845N/A Matrix3D() {
0N/A xx = 1.0f;
0N/A yy = 1.0f;
0N/A zz = 1.0f;
0N/A }
3845N/A
0N/A /** Scale by f in all dimensions */
0N/A void scale(float f) {
0N/A xx *= f;
0N/A xy *= f;
0N/A xz *= f;
0N/A xo *= f;
0N/A yx *= f;
0N/A yy *= f;
0N/A yz *= f;
0N/A yo *= f;
0N/A zx *= f;
0N/A zy *= f;
0N/A zz *= f;
0N/A zo *= f;
0N/A }
3845N/A
0N/A /** Scale along each axis independently */
0N/A void scale(float xf, float yf, float zf) {
0N/A xx *= xf;
0N/A xy *= xf;
0N/A xz *= xf;
0N/A xo *= xf;
0N/A yx *= yf;
0N/A yy *= yf;
0N/A yz *= yf;
0N/A yo *= yf;
0N/A zx *= zf;
0N/A zy *= zf;
0N/A zz *= zf;
0N/A zo *= zf;
0N/A }
3845N/A
0N/A /** Translate the origin */
0N/A void translate(float x, float y, float z) {
0N/A xo += x;
0N/A yo += y;
0N/A zo += z;
0N/A }
3845N/A
0N/A /** rotate theta degrees about the y axis */
0N/A void yrot(double theta) {
0N/A theta *= (pi / 180);
0N/A double ct = Math.cos(theta);
0N/A double st = Math.sin(theta);
0N/A
0N/A float Nxx = (float) (xx * ct + zx * st);
0N/A float Nxy = (float) (xy * ct + zy * st);
0N/A float Nxz = (float) (xz * ct + zz * st);
0N/A float Nxo = (float) (xo * ct + zo * st);
0N/A
0N/A float Nzx = (float) (zx * ct - xx * st);
0N/A float Nzy = (float) (zy * ct - xy * st);
0N/A float Nzz = (float) (zz * ct - xz * st);
0N/A float Nzo = (float) (zo * ct - xo * st);
0N/A
0N/A xo = Nxo;
0N/A xx = Nxx;
0N/A xy = Nxy;
0N/A xz = Nxz;
0N/A zo = Nzo;
0N/A zx = Nzx;
0N/A zy = Nzy;
0N/A zz = Nzz;
0N/A }
3845N/A
0N/A /** rotate theta degrees about the x axis */
0N/A void xrot(double theta) {
0N/A theta *= (pi / 180);
0N/A double ct = Math.cos(theta);
0N/A double st = Math.sin(theta);
0N/A
0N/A float Nyx = (float) (yx * ct + zx * st);
0N/A float Nyy = (float) (yy * ct + zy * st);
0N/A float Nyz = (float) (yz * ct + zz * st);
0N/A float Nyo = (float) (yo * ct + zo * st);
0N/A
0N/A float Nzx = (float) (zx * ct - yx * st);
0N/A float Nzy = (float) (zy * ct - yy * st);
0N/A float Nzz = (float) (zz * ct - yz * st);
0N/A float Nzo = (float) (zo * ct - yo * st);
0N/A
0N/A yo = Nyo;
0N/A yx = Nyx;
0N/A yy = Nyy;
0N/A yz = Nyz;
0N/A zo = Nzo;
0N/A zx = Nzx;
0N/A zy = Nzy;
0N/A zz = Nzz;
0N/A }
3845N/A
0N/A /** rotate theta degrees about the z axis */
0N/A void zrot(double theta) {
0N/A theta *= (pi / 180);
0N/A double ct = Math.cos(theta);
0N/A double st = Math.sin(theta);
0N/A
0N/A float Nyx = (float) (yx * ct + xx * st);
0N/A float Nyy = (float) (yy * ct + xy * st);
0N/A float Nyz = (float) (yz * ct + xz * st);
0N/A float Nyo = (float) (yo * ct + xo * st);
0N/A
0N/A float Nxx = (float) (xx * ct - yx * st);
0N/A float Nxy = (float) (xy * ct - yy * st);
0N/A float Nxz = (float) (xz * ct - yz * st);
0N/A float Nxo = (float) (xo * ct - yo * st);
0N/A
0N/A yo = Nyo;
0N/A yx = Nyx;
0N/A yy = Nyy;
0N/A yz = Nyz;
0N/A xo = Nxo;
0N/A xx = Nxx;
0N/A xy = Nxy;
0N/A xz = Nxz;
0N/A }
3845N/A
0N/A /** Multiply this matrix by a second: M = M*R */
0N/A void mult(Matrix3D rhs) {
0N/A float lxx = xx * rhs.xx + yx * rhs.xy + zx * rhs.xz;
0N/A float lxy = xy * rhs.xx + yy * rhs.xy + zy * rhs.xz;
0N/A float lxz = xz * rhs.xx + yz * rhs.xy + zz * rhs.xz;
0N/A float lxo = xo * rhs.xx + yo * rhs.xy + zo * rhs.xz + rhs.xo;
0N/A
0N/A float lyx = xx * rhs.yx + yx * rhs.yy + zx * rhs.yz;
0N/A float lyy = xy * rhs.yx + yy * rhs.yy + zy * rhs.yz;
0N/A float lyz = xz * rhs.yx + yz * rhs.yy + zz * rhs.yz;
0N/A float lyo = xo * rhs.yx + yo * rhs.yy + zo * rhs.yz + rhs.yo;
0N/A
0N/A float lzx = xx * rhs.zx + yx * rhs.zy + zx * rhs.zz;
0N/A float lzy = xy * rhs.zx + yy * rhs.zy + zy * rhs.zz;
0N/A float lzz = xz * rhs.zx + yz * rhs.zy + zz * rhs.zz;
0N/A float lzo = xo * rhs.zx + yo * rhs.zy + zo * rhs.zz + rhs.zo;
0N/A
0N/A xx = lxx;
0N/A xy = lxy;
0N/A xz = lxz;
0N/A xo = lxo;
0N/A
0N/A yx = lyx;
0N/A yy = lyy;
0N/A yz = lyz;
0N/A yo = lyo;
0N/A
0N/A zx = lzx;
0N/A zy = lzy;
0N/A zz = lzz;
0N/A zo = lzo;
0N/A }
0N/A
0N/A /** Reinitialize to the unit matrix */
0N/A void unit() {
0N/A xo = 0;
0N/A xx = 1;
0N/A xy = 0;
0N/A xz = 0;
0N/A yo = 0;
0N/A yx = 0;
0N/A yy = 1;
0N/A yz = 0;
0N/A zo = 0;
0N/A zx = 0;
0N/A zy = 0;
0N/A zz = 1;
0N/A }
3845N/A
0N/A /** Transform nvert points from v into tv. v contains the input
3845N/A coordinates in floating point. Three successive entries in
3845N/A the array constitute a point. tv ends up holding the transformed
3845N/A points as integers; three successive entries per point */
0N/A void transform(float v[], int tv[], int nvert) {
0N/A float lxx = xx, lxy = xy, lxz = xz, lxo = xo;
0N/A float lyx = yx, lyy = yy, lyz = yz, lyo = yo;
0N/A float lzx = zx, lzy = zy, lzz = zz, lzo = zo;
0N/A for (int i = nvert * 3; (i -= 3) >= 0;) {
0N/A float x = v[i];
0N/A float y = v[i + 1];
0N/A float z = v[i + 2];
3845N/A tv[i] = (int) (x * lxx + y * lxy + z * lxz + lxo);
0N/A tv[i + 1] = (int) (x * lyx + y * lyy + z * lyz + lyo);
0N/A tv[i + 2] = (int) (x * lzx + y * lzy + z * lzz + lzo);
0N/A }
0N/A }
3845N/A
3845N/A @Override
0N/A public String toString() {
0N/A return ("[" + xo + "," + xx + "," + xy + "," + xz + ";"
0N/A + yo + "," + yx + "," + yy + "," + yz + ";"
0N/A + zo + "," + zx + "," + zy + "," + zz + "]");
0N/A }
0N/A}