/*---------------- FILE HEADER ------------------------------------------
This file is part of deegree.
Copyright (C) 2001 by:
EXSE, Department of Geography, University of Bonn
http://www.giub.uni-bonn.de/exse/
lat/lon GmbH
http://www.lat-lon.de
It has been implemented within SEAGIS - An OpenSource implementation of OpenGIS specification
(C) 2001, Institut de Recherche pour le D�veloppement (http://sourceforge.net/projects/seagis/)
SEAGIS Contacts: Surveillance de l'Environnement Assist�e par Satellite
Institut de Recherche pour le D�veloppement / US-Espace
mailto:seasnet@teledetection.fr
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; either
version 2.1 of the License, or (at your option) any later version.
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.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact:
Andreas Poth
lat/lon GmbH
Aennchenstr. 19
53115 Bonn
Germany
E-Mail: poth@lat-lon.de
Klaus Greve
Department of Geography
University of Bonn
Meckenheimer Allee 166
53115 Bonn
Germany
E-Mail: klaus.greve@uni-bonn.de
---------------------------------------------------------------------------*/
package org.deegree.model.csct.ct;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import org.deegree.model.csct.pt.CoordinatePoint;
import org.deegree.model.csct.pt.Matrix;
import org.deegree.model.csct.resources.XAffineTransform;
import org.deegree.model.csct.resources.css.ResourceKeys;
import org.deegree.model.csct.resources.css.Resources;
/**
* Transforms two-dimensional coordinate points using an {@link AffineTransform}.
*
* @version 1.00
* @author Martin Desruisseaux
*/
final class AffineTransform2D extends XAffineTransform implements MathTransform2D
{
/**
* Serial number for interoperability with different versions.
*/
private static final long serialVersionUID = -5299837898367149069L;
/**
* The inverse transform. This field
* will be computed only when needed.
*/
private transient AffineTransform2D inverse;
/**
* Construct an affine transform.
*/
protected AffineTransform2D(final AffineTransform transform)
{super(transform);}
/**
* Throws an {@link UnsupportedOperationException} when a mutable method
* is invoked, since <code>AffineTransform2D</code> must be immutable.
*/
protected void checkPermission()
{throw new UnsupportedOperationException(Resources.format(ResourceKeys.ERROR_UNMODIFIABLE_AFFINE_TRANSFORM));}
/**
* Gets the dimension of input points.
*/
public int getDimSource()
{return 2;}
/**
* Gets the dimension of output points.
*/
public int getDimTarget()
{return 2;}
/**
* Transforms the specified <code>ptSrc</code> and stores the result in <code>ptDst</code>.
*/
public CoordinatePoint transform(final CoordinatePoint ptSrc, CoordinatePoint ptDst)
{
if (ptDst==null)
{
ptDst = new CoordinatePoint(2);
}
transform(ptSrc.ord, 0, ptDst.ord, 0, 1);
return ptDst;
}
/**
* Gets the derivative of this transform at a point.
* For an affine transform, the derivative is the
* same everywhere.
*/
public Matrix derivative(final Point2D point)
{
final Matrix matrix = new Matrix(2);
matrix.setElement(0,0, getScaleX());
matrix.setElement(1,1, getScaleY());
matrix.setElement(0,1, getShearX());
matrix.setElement(1,0, getShearY());
return matrix;
}
/**
* Gets the derivative of this transform at a point.
* For an affine transform, the derivative is the
* same everywhere.
*/
public Matrix derivative(final CoordinatePoint point)
{return derivative((Point2D) null);}
/**
* Creates the inverse transform of this object.
*/
public synchronized MathTransform inverse() throws NoninvertibleTransformException
{
if (inverse==null) try
{
if (!isIdentity())
{
inverse = new AffineTransform2D(createInverse());
inverse.inverse = this;
}
else inverse = this;
}
catch (java.awt.geom.NoninvertibleTransformException exception)
{
throw new NoninvertibleTransformException(exception.getLocalizedMessage(), exception);
}
return inverse;
}
/**
* Returns the WKT for this affine transform.
*/
public String toString()
{return MatrixTransform.toString(new Matrix(this));}
}