001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/opengis/pt/PT_CoordinatePoint.java $
002    /*
003     * OpenGIS� Coordinate Transformation Services Implementation Specification
004     * Copyright (2001) OpenGIS consortium
005     *
006     * THIS COPYRIGHT NOTICE IS A TEMPORARY PATCH.   Version 1.00 of official
007     * OpenGIS's interface files doesn't contain a copyright notice yet. This
008     * file is a slightly modified version of official OpenGIS's interface.
009     * Changes have been done in order to fix RMI problems and are documented
010     * on the SEAGIS web site (seagis.sourceforge.net). THIS FILE WILL LIKELY
011     * BE REPLACED BY NEXT VERSION OF OPENGIS SPECIFICATIONS.
012     */
013    package org.opengis.pt;
014    
015    // Various JDK's classes
016    import java.io.Serializable;
017    import java.util.Arrays;
018    
019    /**
020     * A position defined by a list of numbers. The ordinate values are indexed from
021     * 0 to (<code>NumDim-1</code>), where <code>NumDim</code> is the
022     * dimension of the coordinate system the coordinate point belongs in.
023     * 
024     * @version 1.01
025     * @since 1.00
026     * @author Martin Daly
027     * @author Martin Desruisseaux
028     */
029    public class PT_CoordinatePoint implements Cloneable, Serializable {
030        /**
031         * Use <code>serialVersionUID</code> from first draft for interoperability
032         * with CSS 1.00.
033         */
034        private static final long serialVersionUID = -5747198890219811554L;
035    
036        /**
037         * The ordinates of the coordinate point.
038         */
039        public double[] ord;
040    
041        /**
042         * Construct an empty coordinate point. Caller must initialize {@link #ord}.
043         */
044        public PT_CoordinatePoint() {
045        }
046    
047        /**
048         * Construct a 2D coordinate from the specified ordinates.
049         */
050        public PT_CoordinatePoint(final double x, final double y) {
051            ord = new double[] { x, y };
052        }
053    
054        /**
055         * Construct a 3D coordinate from the specified ordinates.
056         */
057        public PT_CoordinatePoint(final double x, final double y, final double z) {
058            ord = new double[] { x, y, z };
059        }
060    
061        /**
062         * Returns a hash value for this coordinate. This value need not remain
063         * consistent between different implementations of the same class.
064         */
065        public int hashCode() {
066            long code = 326145729;
067            if (ord != null) {
068                for (int i = ord.length; --i >= 0;)
069                    code = code * 37 + Double.doubleToLongBits(ord[i]);
070            }
071            return (int) (code >>> 32) ^ (int) code;
072        }
073    
074        /**
075         * Compares the specified object with this coordinate for equality.
076         */
077        public boolean equals(final Object object) {
078            if (object != null && getClass().equals(object.getClass())) {
079                final PT_CoordinatePoint that = (PT_CoordinatePoint) object;
080                if (false) {
081                    return Arrays.equals(this.ord, that.ord);
082                    /*
083                     * NOTE: The 'Arrays.equals(double[],double[])' method does not
084                     * exists in JDK 1.1. If compatibility with JDK 1.1 is wanted,
085                     * use the code below instead.
086                     */
087                }
088    
089                if (this.ord == that.ord)
090                    return true;
091                if (this.ord != null && that.ord != null) {
092                    if (this.ord.length == that.ord.length) {
093                        for (int i = ord.length; --i >= 0;)
094                            if (Double.doubleToLongBits(this.ord[i]) != Double
095                                    .doubleToLongBits(that.ord[i]))
096                                return false;
097                        return true;
098                    }
099                }
100            }
101            return false;
102        }
103    
104        /**
105         * Returns a deep copy of this coordinate.
106         */
107        public Object clone() {
108            try {
109                return super.clone();
110            } catch (CloneNotSupportedException exception) {
111                // Should not happen, since we are cloneable.
112                throw new InternalError(exception.getMessage());
113            }
114        }
115    
116        /**
117         * Returns a string representation of this coordinate. The returned string
118         * is implementation dependent. It is usually provided for debugging
119         * purposes only.
120         */
121        public String toString() {
122            final StringBuffer buffer = new StringBuffer("PT_CoordinatePoint");
123            buffer.append('[');
124            if (ord != null) {
125                for (int i = 0; i < ord.length; i++) {
126                    if (i != 0)
127                        buffer.append(", ");
128                    buffer.append(ord[i]);
129                }
130            }
131            buffer.append(']');
132            return buffer.toString();
133        }
134    }/* ********************************************************************
135    Changes to this class. What the people have been up to:
136    $Log$
137    Revision 1.3  2006/07/13 06:28:31  poth
138    comment footer added
139    
140    ********************************************************************** */