/* Copyright (c) 2012 Jesper Öqvist <jesper@llbit.se>
*
* This file is part of Chunky.
*
* Chunky is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Chunky is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Chunky. If not, see <http://www.gnu.org/licenses/>.
*/
package se.llbit.math;
import org.apache.commons.math3.util.FastMath;
/**
* A three by three matrix of doubles.
*
* @author Jesper Öqvist <jesper@llbit.se>
*/
public class Matrix3 {
public double m11, m12, m13;
public double m21, m22, m23;
public double m31, m32, m33;
/**
* Set the matrix to be a rotation matrix for rotation
* around the X axis.
*/
public final void rotX(double theta) {
double cost = FastMath.cos(theta);
double sint = FastMath.sin(theta);
m11 = 1;
m12 = 0;
m13 = 0;
m21 = 0;
m22 = cost;
m23 = -sint;
m31 = 0;
m32 = sint;
m33 = cost;
}
/**
* Set the matrix to be a rotation matrix for rotation
* around the Y axis.
*/
public final void rotY(double theta) {
double cost = FastMath.cos(theta);
double sint = FastMath.sin(theta);
m11 = cost;
m12 = 0;
m13 = sint;
m21 = 0;
m22 = 1;
m23 = 0;
m31 = -sint;
m32 = 0;
m33 = cost;
}
/**
* Set the matrix to be a rotation matrix for rotation
* around the X axis.
*/
public final void rotZ(double theta) {
double cost = FastMath.cos(theta);
double sint = FastMath.sin(theta);
m11 = cost;
m12 = -sint;
m13 = 0;
m21 = sint;
m22 = cost;
m23 = 0;
m31 = 0;
m32 = 0;
m33 = 1;
}
/**
* Transform a vector using this matrix.
*/
public void transform(Vector3 o) {
o.set(m11 * o.x + m12 * o.y + m13 * o.z, m21 * o.x + m22 * o.y + m23 * o.z,
m31 * o.x + m32 * o.y + m33 * o.z);
}
/**
* Set to the identity matrix.
*/
public final void setIdentity() {
m11 = m22 = m33 = 1;
m12 = m13 = m21 = m23 = m31 = m32 = 0;
}
/**
* Set equal to other matrix.
*/
public final void set(Matrix3 o) {
m11 = o.m11;
m12 = o.m12;
m13 = o.m13;
m21 = o.m21;
m22 = o.m22;
m23 = o.m23;
m31 = o.m31;
m32 = o.m32;
m33 = o.m33;
}
/**
* Multiply with other matrix.
*/
public final void mul(Matrix3 o) {
double t11 = m11 * o.m11 + m12 * o.m21 + m13 * o.m31;
double t12 = m11 * o.m12 + m12 * o.m22 + m13 * o.m32;
double t13 = m11 * o.m13 + m12 * o.m23 + m13 * o.m33;
double t21 = m21 * o.m11 + m22 * o.m21 + m23 * o.m31;
double t22 = m21 * o.m12 + m22 * o.m22 + m23 * o.m32;
double t23 = m21 * o.m13 + m22 * o.m23 + m23 * o.m33;
double t31 = m31 * o.m11 + m32 * o.m21 + m33 * o.m31;
double t32 = m31 * o.m12 + m32 * o.m22 + m33 * o.m32;
double t33 = m31 * o.m13 + m32 * o.m23 + m33 * o.m33;
m11 = t11;
m12 = t12;
m13 = t13;
m21 = t21;
m22 = t22;
m23 = t23;
m31 = t31;
m32 = t32;
m33 = t33;
}
/**
* Set this matrix to a uniform scaling matrix with the given scale factor.
*/
public void scale(double scale) {
m11 = m22 = m33 = scale;
m12 = m13 = 0;
m21 = m23 = 0;
m31 = m32 = 0;
}
}