001 /*---------------- FILE HEADER ------------------------------------------
002
003 This file is part of deegree.
004 Copyright (C) 2001-2006 by:
005 EXSE, Department of Geography, University of Bonn
006 http://www.giub.uni-bonn.de/deegree/
007 lat/lon GmbH
008 http://www.lat-lon.de
009
010 This library is free software; you can redistribute it and/or
011 modify it under the terms of the GNU Lesser General Public
012 License as published by the Free Software Foundation; either
013 version 2.1 of the License, or (at your option) any later version.
014
015 This library is distributed in the hope that it will be useful,
016 but WITHOUT ANY WARRANTY; without even the implied warranty of
017 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
018 Lesser General Public License for more details.
019
020 You should have received a copy of the GNU Lesser General Public
021 License along with this library; if not, write to the Free Software
022 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
023
024 Contact:
025
026 Andreas Poth
027 lat/lon GmbH
028 Aennchenstr. 19
029 53177 Bonn
030 Germany
031 E-Mail: poth@lat-lon.de
032
033 Prof. Dr. Klaus Greve
034 Department of Geography
035 University of Bonn
036 Meckenheimer Allee 166
037 53115 Bonn
038 Germany
039 E-Mail: greve@giub.uni-bonn.de
040
041
042 ---------------------------------------------------------------------------*/
043
044 package org.deegree.ogcwebservices.wpvs.operation;
045
046 import java.awt.geom.Point2D;
047
048 import javax.media.j3d.PickConeSegment;
049 import javax.vecmath.Point3d;
050 import javax.vecmath.Vector3d;
051
052 import org.deegree.model.spatialschema.GeometryException;
053 import org.deegree.model.spatialschema.GeometryFactory;
054 import org.deegree.model.spatialschema.Position;
055 import org.deegree.model.spatialschema.SurfaceInterpolation;
056 import org.deegree.model.spatialschema.SurfaceInterpolationImpl;
057 import org.deegree.ogcwebservices.wpvs.j3d.ViewPoint;
058
059 /**
060 * This class represents the geometry needed for a request cone.
061 *
062 * @version $Revision: $
063 * @author <a href="mailto:cordes@lat-lon.de">Lyn Buesching</a>
064 * @author last edited by: $Author: $
065 *
066 * @version 1.0. $Revision: $, $Date: $
067 *
068 */
069 public class ConeRequest extends RequestGeometry {
070
071 // end point of the view ray
072 private Point3d endPointLine;
073
074 /**
075 * Initializes the two Geometrys for the request with a cone.
076 *
077 * @param request
078 * @throws GeometryException
079 */
080 public ConeRequest(Get3DFeatureInfo request) {
081 super( request );
082 endPointLine = new Point3d (calcEndPoint( new ViewPoint( request.getGetViewRequestCopy() ),
083 (int)request.getDepth(),
084 (int)request.getGetViewRequestCopy().getImageDimension().getWidth(),
085 (int)request.getGetViewRequestCopy().getImageDimension().getHeight(),
086 request.getClickPoint().x, request.getClickPoint().y ) );
087 }
088
089 @Override
090 public void setPickshape() {
091 pickshape = new PickConeSegment( getBeginPointLine(), endPointLine, getRequest().getApexAngle() );
092 }
093
094 @Override
095 public void setWfsReqGeom() throws GeometryException {
096
097 Position[] pos = new Position[4];
098 int i = 0;
099 pos[i++] = GeometryFactory.createPosition(getBeginPointLine().x, getBeginPointLine().y, 0);
100
101 Vector3d tmp = new Vector3d();
102 tmp.sub(getBeginPointLine(), endPointLine);
103 double length = tmp.length();
104 double r = Math.tan( getRequest().getApexAngle() ) * length;
105
106 double dX = endPointLine.x - getBeginPointLine().x;
107 double dY = endPointLine.y - getBeginPointLine().y;
108 double lengthGround = Math.sqrt(Math.pow( dX, 2 ) + Math.pow( dY, 2 ));
109
110 double dif = Math.tan( getRequest().getApexAngle() ) * (lengthGround + r);
111 double rot = Math.toRadians(90);
112 if ( dY == 0 && dX > 0 ) {
113 rot = Math.toRadians(270);
114 }else if ( dX != dY ) {
115 rot = Math.atan( dX / dY );
116 }
117 if ( dY < 0 ) {
118 rot = ( rot + Math.toRadians(180) );
119 } else {
120 rot = ( rot + Math.toRadians(360) );
121 }
122 rot = Math.toRadians( 360 ) - (rot % Math.toRadians( 360 ));
123
124 // transformation
125 Point2D.Double point2 = trans2d(getBeginPointLine().x, getBeginPointLine().y,
126 rot, new Point2D.Double( dif, lengthGround ));
127 pos[i++] = GeometryFactory.createPosition( point2.x, point2.y, 0 );
128
129 Point2D.Double point3 = trans2d(getBeginPointLine().x, getBeginPointLine().y,
130 rot , new Point2D.Double( -dif, lengthGround ));
131 pos[i++] = GeometryFactory.createPosition(point3.x, point3.y, 0);
132
133 pos[i++] = pos[0];
134
135 SurfaceInterpolation si = new SurfaceInterpolationImpl( 0 );
136 wfsReqGeom = GeometryFactory.createSurface( pos, new Position[0][0], si, getCrs() );
137 }
138
139 /**
140 * 3-parameter transformation
141 *
142 * @param translationX the translation in x
143 * @param translationY the translation in x
144 * @param rotation rotation of the transformation
145 * @param transPoint point to transform
146 *
147 * @return the point in the new coordinatsystem
148 */
149 private Point2D.Double trans2d(double translationX, double translationY, double rotation,
150 Point2D.Double transPoint) {
151
152 double xTrans = transPoint.x * Math.cos( rotation ) - transPoint.y * Math.sin( rotation ) + translationX;
153 double yTrans = transPoint.x * Math.sin( rotation ) + transPoint.y * Math.cos( rotation ) + translationY;
154 return new Point2D.Double( xTrans, yTrans );
155 }
156 }