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 javax.media.j3d.PickShape; 039 import javax.media.j3d.Transform3D; 040 import javax.vecmath.AxisAngle4d; 041 import javax.vecmath.Point3d; 042 import javax.vecmath.Vector3d; 043 044 import org.deegree.model.crs.CoordinateSystem; 045 import org.deegree.model.spatialschema.Geometry; 046 import org.deegree.model.spatialschema.GeometryException; 047 import org.deegree.ogcwebservices.wpvs.j3d.ViewPoint; 048 049 /** 050 * This abstract class represents a geometry needed for Get3DFeatureInfoRequest. It contains the 3d geometry and its 2d 051 * projektion. The 2d geometry is required for WFS request, the 3d geometry for the final test of intersection. 052 * 053 * @version $Revision: $ 054 * @author <a href="mailto:cordes@lat-lon.de">Lyn Buesching</a> 055 * @author last edited by: $Author: $ 056 * 057 * @version 1.0. $Revision: $, $Date: $ 058 * 059 */ 060 public abstract class RequestGeometry { 061 062 /** 063 * The the feature info request 064 */ 065 protected Get3DFeatureInfo request; 066 067 // begin point of the view ray 068 private Point3d beginPointLine; 069 070 private CoordinateSystem crs; 071 072 /** 073 * geometry for wfs query 074 */ 075 protected Geometry wfsReqGeom; 076 077 /** 078 * 3d geometry: needed for final testing 079 */ 080 protected PickShape pickshape; 081 082 /** 083 * Constructor to initialize the attributes needed for all geometries 084 * 085 * @param request 086 * the Get3DFeatureInfoRequest 087 */ 088 public RequestGeometry( Get3DFeatureInfo request ) { 089 this.request = request; 090 crs = request.getGetViewRequestCopy().getCrs(); 091 beginPointLine = new ViewPoint( request.getGetViewRequestCopy() ).getObserverPosition(); 092 } 093 094 /** 095 * 096 * @return the pickshape or <code>null</code> if it was not set. 097 */ 098 public PickShape getPickshape() { 099 return pickshape; 100 } 101 102 /** 103 * @return the geometry repsonse from the wfs-request or <code>null</code> if it was not set. 104 */ 105 public Geometry getWfsReqGeom() { 106 return wfsReqGeom; 107 } 108 109 /** 110 * @return the starting point of the line. 111 */ 112 public Point3d getBeginPointLine() { 113 return beginPointLine; 114 } 115 116 /** 117 * @return the crs of the request. 118 */ 119 public CoordinateSystem getCrs() { 120 return crs; 121 } 122 123 /** 124 * @return the request. 125 */ 126 public Get3DFeatureInfo getRequest() { 127 return request; 128 } 129 130 // abstract methods 131 /** 132 * sets the geometry needed for WFS request 133 * 134 * @throws GeometryException 135 * if something went wrong. 136 */ 137 public abstract void setWfsReqGeom() 138 throws GeometryException; 139 140 /** 141 * Sets the geometry needed for final test of intersection 142 */ 143 public abstract void setPickshape(); 144 145 /** 146 * Calculates a ray through the ViewPoint and the ClickPoint. 147 * 148 * @param viewPoint 149 * position of the request 150 * @param depth 151 * far clipping plane 152 * @param width 153 * of the request 154 * @param height 155 * of the request 156 * @param clickI 157 * x-axis 158 * @param clickJ 159 * y-axis 160 * @return The end point of the requestGeometry. 161 */ 162 protected Point3d calcEndPoint( ViewPoint viewPoint, double depth, int width, int height, int clickI, int clickJ ) { 163 // sets extension of the ray 164 double extension = viewPoint.getFarClippingPlane(); 165 if ( depth > 0 && depth < extension ) { 166 extension = depth; 167 } 168 GetView getView = request.getGetViewRequestCopy(); 169 170 // rotates the cklickpoint to the roll-angle 171 double roll = getView.getRoll(); 172 double deltaI = -( width / 2 ) + clickI; 173 double deltaJ = ( height / 2 ) - clickJ; 174 175 double x = deltaI * Math.cos( roll ) + deltaJ * Math.sin( roll ); 176 double y = -deltaI * Math.sin( roll ) + deltaJ * Math.cos( roll ); 177 178 // calculates the angles to rotate the vector (vp-poi) 179 double aov = viewPoint.getAngleOfView(); 180 double distProj = ( width / 2 ) / Math.tan( aov / 2 ); 181 182 double angleI = Math.atan( x / distProj ); 183 double angleJ = Math.atan( y / distProj ); 184 185 Point3d vp = viewPoint.getObserverPosition(); 186 Point3d poi = viewPoint.getPointOfInterest(); 187 Vector3d vectorVPtoPOI = new Vector3d(); 188 vectorVPtoPOI.sub( poi, vp ); 189 190 Transform3D trans = new Transform3D(); 191 192 // rotation at angleJ (vertikal) 193 Vector3d rotJ = new Vector3d(); 194 Vector3d eZ = new Vector3d( 0, 0, 1 ); 195 rotJ.cross( vectorVPtoPOI, eZ ); 196 AxisAngle4d axisAngleJ = new AxisAngle4d( rotJ, angleJ ); 197 trans.set( axisAngleJ ); 198 trans.transform( vectorVPtoPOI ); 199 200 // rotation at angleI (horizontal) 201 Vector3d rotI = new Vector3d(); 202 rotI.cross( vectorVPtoPOI, rotJ ); 203 AxisAngle4d axisAngleI = new AxisAngle4d( rotI, angleI ); 204 trans.set( axisAngleI ); 205 trans.transform( vectorVPtoPOI ); 206 207 // scale to extension 208 vectorVPtoPOI.normalize(); 209 vectorVPtoPOI.scale( extension ); 210 Point3d endPoint = new Point3d(); 211 212 // add to the viewpoint 213 endPoint.add( vp, vectorVPtoPOI ); 214 return endPoint; 215 } 216 }