/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2005-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*/
package org.geotools.referencing.operation.matrix;
import org.opengis.referencing.operation.Matrix;
/**
* Static utility methods for creating matrix. This factory selects one of the {@link Matrix1},
* {@link Matrix2}, {@link Matrix3}, {@link Matrix4} or {@link GeneralMatrix} implementation
* according the desired matrix size. Note that if the matrix size is know at compile time,
* it may be more efficient to invoke directly the constructor of the appropriate class instead.
*
* @since 2.2
* @source $URL$
* @version $Id$
* @author Martin Desruisseaux (IRD)
*/
public final class MatrixFactory {
/**
* Do not allows instantiation of this class.
*/
private MatrixFactory() {
}
/**
* Creates a square identity matrix of size {@code size} × {@code size}.
*
* @param size For an affine transform, this is the number of source and target dimensions + 1.
* @return An identity matrix of the given size.
*/
public static XMatrix create(final int size) {
switch (size) {
case 1: return new Matrix1();
case 2: return new Matrix2();
case 3: return new Matrix3();
case 4: return new Matrix4();
default: return new GeneralMatrix(size);
}
}
/**
* Creates a matrix of size {@code numRow} × {@code numCol}.
* Elements on the diagonal <var>j==i</var> are set to 1.
*
* @param numRow For an affine transform, this is the number of
* {@linkplain org.opengis.referencing.operation.MathTransform#getTargetDimensions
* target dimensions} + 1.
* @param numCol For an affine transform, this is the number of
* {@linkplain org.opengis.referencing.operation.MathTransform#getSourceDimensions
* source dimensions} + 1.
* @return An identity matrix of the given size.
*/
public static XMatrix create(final int numRow, final int numCol) {
if (numRow == numCol) {
return create(numRow);
} else {
return new GeneralMatrix(numRow, numCol);
}
}
/**
* Creates a new matrix which is a copy of the specified matrix.
*/
public static XMatrix create(final Matrix matrix) {
final int size = matrix.getNumRow();
if (size == matrix.getNumCol()) {
switch (size) {
case 1: return new Matrix1(matrix);
case 2: return new Matrix2(matrix);
case 3: return new Matrix3(matrix);
case 4: return new Matrix4(matrix);
}
}
return new GeneralMatrix(matrix);
}
}