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