/* * 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.piecewise; import org.geotools.geometry.GeneralDirectPosition; import org.geotools.referencing.operation.matrix.Matrix1; import org.geotools.renderer.i18n.ErrorKeys; import org.geotools.renderer.i18n.Errors; import org.geotools.util.Utilities; import org.opengis.geometry.DirectPosition; import org.opengis.geometry.MismatchedDimensionException; import org.opengis.referencing.operation.MathTransform1D; import org.opengis.referencing.operation.Matrix; import org.opengis.referencing.operation.NoninvertibleTransformException; import org.opengis.referencing.operation.TransformException; /** * Convenience implementation of the {@link PiecewiseTransform1D} interface which subclass the {@link DefaultDomain1D} class in order to provide a suitable framework to handle a list of {@link PiecewiseTransform1DElement} s. <p> * @author Simone Giannecchini, GeoSolutions * * * @source $URL$ */ public class DefaultPiecewiseTransform1D<T extends DefaultPiecewiseTransform1DElement> extends DefaultDomain1D<T> implements PiecewiseTransform1D<T> { private boolean hasDefaultValue; /** * @uml.property name="defaultValue" */ private double defaultValue; private int hashCode=-1; public DefaultPiecewiseTransform1D( final T[] domainElements, final double defaultValue) { super(domainElements); this.hasDefaultValue=true; this.defaultValue=defaultValue; } public DefaultPiecewiseTransform1D(final T[] domainElements) { super( domainElements != null && !(domainElements instanceof DefaultConstantPiecewiseTransformElement[]) ? domainElements : null); } /* * (non-Javadoc) * * @see org.opengis.referencing.operation.MathTransform1D#transform(double) */ public double transform(final double value) throws TransformException { final T piece = findDomainElement(value); if (piece == null) { //do we have a default value? if(hasDefaultValue()) return getDefaultValue(); throw new TransformException(Errors.format(ErrorKeys.TRANSFORM_EVALUATION_$1,new Double(value))); } return piece.transform(value); } /** * Gets the derivative of this transform at a point. */ public Matrix derivative(final DirectPosition point) throws TransformException { PiecewiseUtilities.checkDimension(point); return new Matrix1(derivative(point.getOrdinate(0))); } /** * Gets the derivative of this function at a value. * * @param value * The value where to evaluate the derivative. * @return The derivative at the specified point. * @throws TransformException * if the derivative can't be evaluated at the specified point. */ public double derivative(final double value) throws TransformException { throw new UnsupportedOperationException(Errors.format(ErrorKeys.UNSUPPORTED_OPERATION_$1, "derivate")); } /** * Gets the dimension of input points, which is 1. */ public final int getSourceDimensions() { return 1; } /** * Gets the dimension of output points, which is 1. */ public final int getTargetDimensions() { return 1; } /* * (non-Javadoc) * * @see org.opengis.referencing.operation.MathTransform#inverse() */ public MathTransform1D inverse() throws NoninvertibleTransformException { throw new UnsupportedOperationException(Errors.format(ErrorKeys.UNSUPPORTED_OPERATION_$1, "inverse")); } /* * (non-Javadoc) * * @see org.opengis.referencing.operation.MathTransform#isIdentity() */ public boolean isIdentity() { throw new UnsupportedOperationException(Errors.format(ErrorKeys.UNSUPPORTED_OPERATION_$1, "isIdentity")); } /* * (non-Javadoc) * * @see org.opengis.referencing.operation.MathTransform#toWKT() */ public String toWKT() throws UnsupportedOperationException { throw new UnsupportedOperationException(Errors.format(ErrorKeys.UNSUPPORTED_OPERATION_$1, "toWKT")); } /* * (non-Javadoc) * * @see org.opengis.referencing.operation.MathTransform#transform(org.opengis.spatialschema.geometry.DirectPosition, * org.opengis.spatialschema.geometry.DirectPosition) */ public DirectPosition transform(final DirectPosition ptSrc, DirectPosition ptDst) throws MismatchedDimensionException, TransformException { // ///////////////////////////////////////////////////////////////////// // // input checks // // ///////////////////////////////////////////////////////////////////// PiecewiseUtilities.ensureNonNull("ptSrc", ptSrc); PiecewiseUtilities.checkDimension(ptSrc); if (ptDst == null) { ptDst = new GeneralDirectPosition(1); } else { PiecewiseUtilities.checkDimension(ptDst); } ptDst.setOrdinate(0, transform(ptSrc.getOrdinate(0))); return ptDst; } /** * Transforms a list of coordinate point ordinal values. */ public void transform(final double[] srcPts, final int srcOff, final double[] dstPts, final int dstOff, final int numPts) throws TransformException { throw new UnsupportedOperationException(Errors.format(ErrorKeys.UNSUPPORTED_OPERATION_$1, "transform")); } /** * Transforms a list of coordinate point ordinal values. */ public void transform(final float[] srcPts, final int srcOff, final float[] dstPts, final int dstOff, final int numPts) throws TransformException { throw new UnsupportedOperationException(Errors.format(ErrorKeys.UNSUPPORTED_OPERATION_$1, "transform")); } /** * Transforms a list of coordinate point ordinal values. */ public void transform(final float[] srcPts, final int srcOff, final double[] dstPts, final int dstOff, final int numPts) throws TransformException { throw new UnsupportedOperationException(Errors.format(ErrorKeys.UNSUPPORTED_OPERATION_$1, "transform")); } /** * Transforms a list of coordinate point ordinal values. */ public void transform(final double[] srcPts, final int srcOff, final float[] dstPts, final int dstOff, final int numPts) throws TransformException { throw new UnsupportedOperationException(Errors.format(ErrorKeys.UNSUPPORTED_OPERATION_$1, "transform")); } public boolean hasDefaultValue() { return hasDefaultValue; } /** * @return * @uml.property name="defaultValue" */ public double getDefaultValue() { return defaultValue; } @Override public int hashCode() { if(hashCode>=0) return hashCode; hashCode = 37; hashCode = Utilities.hash( defaultValue,hashCode ); hashCode = Utilities.hash( hasDefaultValue ,hashCode); hashCode = Utilities.hash( super.hashCode(),hashCode ); return hashCode; } @SuppressWarnings("unchecked") @Override public boolean equals(Object object) { if((object instanceof DefaultPiecewiseTransform1D)) { final DefaultPiecewiseTransform1D<?> that = (DefaultPiecewiseTransform1D<?>) object; if(this.hasDefaultValue!=that.hasDefaultValue) return false; if(Utilities.equals(defaultValue, that.defaultValue)); return false; } return super.equals(object); } protected Class<?> getEquivalenceClass(){ return DefaultPiecewiseTransform1D.class; } }