001: /*
002: * GeoTools - OpenSource mapping toolkit
003: * http://geotools.org
004: * (C) 2005-2006, GeoTools Project Managment Committee (PMC)
005: * (C) 2005, Institut de Recherche pour le Développement
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation;
010: * version 2.1 of the License.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: */
017: package org.geotools.referencing.operation.matrix;
018:
019: // J2SE dependencies and extensions
020: import javax.vecmath.Matrix4d;
021:
022: // OpenGIS dependencies
023: import org.opengis.referencing.operation.Matrix;
024:
025: // Geotools dependencies
026: import org.geotools.resources.i18n.Errors;
027: import org.geotools.resources.i18n.ErrorKeys;
028:
029: /**
030: * A matrix of fixed {@value #SIZE}×{@value #SIZE} size. This specialized matrix provides
031: * better accuracy than {@link GeneralMatrix} for matrix inversion and multiplication. It is used
032: * primarily for supporting datum shifts.
033: *
034: * @since 2.2
035: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/library/referencing/src/main/java/org/geotools/referencing/operation/matrix/Matrix4.java $
036: * @version $Id: Matrix4.java 24493 2007-02-17 17:28:12Z desruisseaux $
037: * @author Martin Desruisseaux
038: */
039: public class Matrix4 extends Matrix4d implements XMatrix {
040: /**
041: * Serial number for interoperability with different versions.
042: */
043: private static final long serialVersionUID = 5685762518066856310L;
044:
045: /**
046: * The matrix size, which is {@value}.
047: */
048: public static final int SIZE = 4;
049:
050: /**
051: * Creates a new identity matrix.
052: */
053: public Matrix4() {
054: setIdentity();
055: }
056:
057: /**
058: * Creates a new matrix initialized to the specified values.
059: */
060: public Matrix4(double m00, double m01, double m02, double m03,
061: double m10, double m11, double m12, double m13, double m20,
062: double m21, double m22, double m23, double m30, double m31,
063: double m32, double m33) {
064: super (m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22,
065: m23, m30, m31, m32, m33);
066: }
067:
068: /**
069: * Creates a new matrix initialized to the same value than the specified one.
070: * The specified matrix size must be {@value #SIZE}×{@value #SIZE}.
071: */
072: public Matrix4(final Matrix matrix) {
073: if (matrix.getNumRow() != SIZE || matrix.getNumCol() != SIZE) {
074: throw new IllegalArgumentException(Errors
075: .format(ErrorKeys.ILLEGAL_MATRIX_SIZE));
076: }
077: for (int j = 0; j < SIZE; j++) {
078: for (int i = 0; i < SIZE; i++) {
079: setElement(j, i, matrix.getElement(j, i));
080: }
081: }
082: }
083:
084: /**
085: * Returns the number of rows in this matrix, which is always {@value #SIZE}
086: * in this implementation.
087: */
088: public final int getNumRow() {
089: return SIZE;
090: }
091:
092: /**
093: * Returns the number of colmuns in this matrix, which is always {@value #SIZE}
094: * in this implementation.
095: */
096: public final int getNumCol() {
097: return SIZE;
098: }
099:
100: /**
101: * {@inheritDoc}
102: */
103: public final boolean isIdentity() {
104: for (int j = 0; j < SIZE; j++) {
105: for (int i = 0; i < SIZE; i++) {
106: if (getElement(j, i) != ((i == j) ? 1 : 0)) {
107: return false;
108: }
109: }
110: }
111: return true;
112: }
113:
114: /**
115: * {@inheritDoc}
116: */
117: public final boolean isIdentity(double tolerance) {
118: return GeneralMatrix.isIdentity(this , tolerance);
119: }
120:
121: /**
122: * {@inheritDoc}
123: */
124: public final boolean isAffine() {
125: return m30 == 0 && m31 == 0 && m32 == 0 && m33 == 1;
126: }
127:
128: /**
129: * {@inheritDoc}
130: */
131: public final void multiply(final Matrix matrix) {
132: final Matrix4d m;
133: if (matrix instanceof Matrix4d) {
134: m = (Matrix4d) matrix;
135: } else {
136: m = new Matrix4(matrix);
137: }
138: mul(m);
139: }
140:
141: /**
142: * Returns a string representation of this matrix. The returned string is implementation
143: * dependent. It is usually provided for debugging purposes only.
144: */
145: public String toString() {
146: return GeneralMatrix.toString(this);
147: }
148: }
|