// Spatial Index Library
//
// Copyright (C) 2002 Navel Ltd.
//
// 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.
//
// 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 information:
// Mailing address:
// Marios Hadjieleftheriou
// University of California, Riverside
// Department of Computer Science
// Surge Building, Room 310
// Riverside, CA 92521
//
// Email:
// marioh@cs.ucr.edu
package org.geotools.caching.spatialindex;
public class Point implements Shape, Cloneable {
public double[] m_pCoords = null;
public Point(double[] pCoords) {
m_pCoords = new double[pCoords.length];
System.arraycopy(pCoords, 0, m_pCoords, 0, pCoords.length);
}
public Point(final Point pt) {
m_pCoords = new double[pt.m_pCoords.length];
System.arraycopy(pt.m_pCoords, 0, m_pCoords, 0, pt.m_pCoords.length);
}
public boolean equals(Object o) {
if (o instanceof Point) {
Point pt = (Point) o;
if (pt.m_pCoords.length != m_pCoords.length) {
return false;
}
for (int cIndex = 0; cIndex < m_pCoords.length; cIndex++) {
if ((m_pCoords[cIndex] < (pt.m_pCoords[cIndex] - SpatialIndex.EPSILON))
|| (m_pCoords[cIndex] > (pt.m_pCoords[cIndex] + SpatialIndex.EPSILON))) {
return false;
}
}
return true;
}
return false;
}
//
// Cloneable interface
//
public Object clone() {
return new Point(m_pCoords);
}
//
// IShape interface
//
public boolean intersects(final Shape s) {
if (s instanceof Region) {
return ((Region) s).contains(this);
}
return false;
}
public boolean contains(final Shape s) {
return false;
}
public boolean touches(final Shape s) {
if (s instanceof Point && this.equals(s)) {
return true;
}
if (s instanceof Region) {
return ((Region) s).touches(this);
}
return false;
}
public double[] getCenter() {
double[] pCoords = new double[m_pCoords.length];
System.arraycopy(m_pCoords, 0, pCoords, 0, m_pCoords.length);
return pCoords;
}
public int getDimension() {
return m_pCoords.length;
}
public Region getMBR() {
return new Region(m_pCoords, m_pCoords);
}
public double getArea() {
return 0.0f;
}
public double getMinimumDistance(final Shape s) {
if (s instanceof Region) {
return ((Region) s).getMinimumDistance(this);
}
if (s instanceof Point) {
return getMinimumDistance((Point) s);
}
throw new IllegalStateException("getMinimumDistance: Not implemented yet!");
}
double getMinimumDistance(final Point p) {
if (m_pCoords.length != p.m_pCoords.length) {
throw new IllegalArgumentException(
"getMinimumDistance: Shape has the wrong number of dimensions.");
}
double ret = 0.0;
for (int cIndex = 0; cIndex < m_pCoords.length; cIndex++) {
ret += Math.pow(m_pCoords[cIndex] - p.m_pCoords[cIndex], 2.0);
}
return Math.sqrt(ret);
}
public double getCoord(int index) throws IndexOutOfBoundsException {
if (index >= m_pCoords.length) {
throw new IndexOutOfBoundsException("" + index);
}
return m_pCoords[index];
}
}