001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/model/spatialschema/PointImpl.java $ 002 /*---------------------------------------------------------------------------- 003 This file is part of deegree, http://deegree.org/ 004 Copyright (C) 2001-2009 by: 005 Department of Geography, University of Bonn 006 and 007 lat/lon GmbH 008 009 This library is free software; you can redistribute it and/or modify it under 010 the terms of the GNU Lesser General Public License as published by the Free 011 Software Foundation; either version 2.1 of the License, or (at your option) 012 any later version. 013 This library is distributed in the hope that it will be useful, but WITHOUT 014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 016 details. 017 You should have received a copy of the GNU Lesser General Public License 018 along with this library; if not, write to the Free Software Foundation, Inc., 019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 021 Contact information: 022 023 lat/lon GmbH 024 Aennchenstr. 19, 53177 Bonn 025 Germany 026 http://lat-lon.de/ 027 028 Department of Geography, University of Bonn 029 Prof. Dr. Klaus Greve 030 Postfach 1147, 53001 Bonn 031 Germany 032 http://www.geographie.uni-bonn.de/deegree/ 033 034 e-mail: info@deegree.org 035 ----------------------------------------------------------------------------*/ 036 package org.deegree.model.spatialschema; 037 038 import java.io.Serializable; 039 040 import org.deegree.model.crs.CoordinateSystem; 041 042 /** 043 * default implementation of the Point interface. 044 * 045 * <p> 046 * ------------------------------------------------------------ 047 * </p> 048 * 049 * @version 5.6.2001 050 * @author Andreas Poth 051 * <p> 052 */ 053 054 public class PointImpl extends PrimitiveImpl implements Point, Serializable { 055 /** Use serialVersionUID for interoperability. */ 056 private final static long serialVersionUID = 6106017748940535740L; 057 058 private Position position = null; 059 060 /** 061 * constructor. initializes a point to the coordinate 0/0 062 * 063 * @param crs 064 * spatial reference system of the point 065 */ 066 protected PointImpl( CoordinateSystem crs ) { 067 super( crs ); 068 position = new PositionImpl(); 069 empty = true; 070 centroid = this; 071 } 072 073 /** 074 * constructor for initializing a point within a two-dimensional coordinate system 075 * 076 * @param x 077 * x-value of the point 078 * @param y 079 * y-value of the point 080 * @param crs 081 * spatial reference system of the point 082 */ 083 protected PointImpl( double x, double y, CoordinateSystem crs ) { 084 super( crs ); 085 position = new PositionImpl( x, y ); 086 empty = false; 087 centroid = this; 088 } 089 090 /** 091 * constructor for initializing a point within a three-dimensional coordinate system 092 * 093 * @param x 094 * x-value of the point 095 * @param y 096 * y-value of the point 097 * @param z 098 * z-value of the point 099 * @param crs 100 * spatial reference system of the point 101 */ 102 protected PointImpl( double x, double y, double z, CoordinateSystem crs ) { 103 super( crs ); 104 position = new PositionImpl( x, y, z ); 105 empty = false; 106 centroid = this; 107 } 108 109 /** 110 * constructor 111 * 112 * @param otherPoint 113 * existing GM_Point 114 */ 115 protected PointImpl( Point otherPoint ) { 116 super( otherPoint.getCoordinateSystem() ); 117 position = new PositionImpl( otherPoint.getAsArray() ); 118 empty = false; 119 centroid = this; 120 } 121 122 /** 123 * constructor 124 * 125 * @param position 126 * existing position 127 * @param crs 128 * spatial reference system of the point 129 */ 130 protected PointImpl( Position position, CoordinateSystem crs ) { 131 super( crs ); 132 this.position = position; 133 empty = false; 134 centroid = this; 135 } 136 137 /** 138 * checks if this point is completely equal to the submitted geometry 139 */ 140 @Override 141 public boolean equals( Object other ) { 142 if ( super.equals( other ) && ( other instanceof Point ) ) { 143 Point p = (Point) other; 144 boolean flagEq = Math.abs( getX() - p.getX() ) < mute && Math.abs( getY() - p.getY() ) < mute; 145 if ( getCoordinateDimension() == 3 ) { 146 flagEq = flagEq && Math.abs( getZ() - p.getZ() ) < mute; 147 } 148 return flagEq; 149 } 150 151 return false; 152 } 153 154 /** 155 * @return 0 156 */ 157 public int getDimension() { 158 return 0; 159 } 160 161 /** 162 * @return the number of ordinates contained in this point. 163 */ 164 public int getCoordinateDimension() { 165 return getPosition().getCoordinateDimension(); 166 } 167 168 @Override 169 public Object clone() { 170 return new PointImpl( position.getX(), position.getY(), position.getZ(), getCoordinateSystem() ); 171 } 172 173 public double getX() { 174 return position.getX(); 175 } 176 177 public double getY() { 178 return position.getY(); 179 } 180 181 public double getZ() { 182 return position.getZ(); 183 } 184 185 /** 186 * @return the x- and y-value of the point as a two dimensional array the first field contains the x- the second 187 * field the y-value. 188 */ 189 public double[] getAsArray() { 190 return position.getAsArray(); 191 } 192 193 /** 194 * translate the point by the submitted values. the <code>dz</code>- value will be ignored. 195 */ 196 @Override 197 public void translate( double[] d ) { 198 setValid( false ); 199 position.translate( d ); 200 } 201 202 /** 203 * @return position 204 * 205 */ 206 public Position getPosition() { 207 return position; 208 } 209 210 /** 211 * The Boolean valued operation "intersects" shall return TRUE if this Geometry intersects another Geometry. Within 212 * a Complex, the Primitives do not intersect one another. In general, topologically structured data uses shared 213 * geometric objects to capture intersection information. 214 * <p> 215 * </p> 216 * dummy implementation 217 */ 218 @Override 219 public boolean intersects( Geometry gmo ) { 220 boolean inter = false; 221 222 try { 223 if ( gmo instanceof Point ) { 224 inter = LinearIntersects.intersects( (Point) gmo, this ); 225 } else if ( gmo instanceof Curve ) { 226 inter = LinearIntersects.intersects( this, (Curve) gmo ); 227 } else if ( gmo instanceof Surface ) { 228 inter = LinearIntersects.intersects( this, (Surface) gmo ); 229 } else if ( gmo instanceof Aggregate ) { 230 inter = intersectsAggregate( (Aggregate) gmo ); 231 } 232 } catch ( Exception e ) { 233 // ignore 234 } 235 236 return inter; 237 } 238 239 /** 240 * the operations returns true if the submitted multi primitive intersects with the curve segment 241 */ 242 private boolean intersectsAggregate( Aggregate mprim ) 243 throws Exception { 244 boolean inter = false; 245 246 int cnt = mprim.getSize(); 247 248 for ( int i = 0; i < cnt; i++ ) { 249 if ( intersects( mprim.getObjectAt( i ) ) ) { 250 inter = true; 251 break; 252 } 253 } 254 255 return inter; 256 } 257 258 /** 259 * The Boolean valued operation "contains" shall return TRUE if this Geometry contains another Geometry. 260 * <p> 261 * </p> 262 */ 263 @Override 264 public boolean contains( Geometry gmo ) { 265 throw new UnsupportedOperationException( "the contains operation for points " 266 + "isn't supported at the moment." ); 267 } 268 269 /** 270 * recalculates internal parameters 271 */ 272 @Override 273 protected void calculateParam() { 274 setValid( true ); 275 } 276 277 @Override 278 public String toString() { 279 StringBuffer ret = new StringBuffer( 30 ); 280 ret.append( this.getClass().getName() ).append( ": " ); 281 282 for ( int i = 0; i < getAsArray().length; i++ ) { 283 ret.append( getAsArray()[i] ).append( ' ' ); 284 } 285 286 return ret.toString(); 287 } 288 289 }