001 /*---------------- FILE HEADER ------------------------------------------ 002 003 This file is part of deegree. 004 Copyright (C) 2001-2008 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 javax.media.j3d.PickShape; 047 import javax.media.j3d.Transform3D; 048 import javax.vecmath.AxisAngle4d; 049 import javax.vecmath.Point3d; 050 import javax.vecmath.Vector3d; 051 052 import org.deegree.model.crs.CoordinateSystem; 053 import org.deegree.model.spatialschema.Geometry; 054 import org.deegree.model.spatialschema.GeometryException; 055 import org.deegree.ogcwebservices.wpvs.j3d.ViewPoint; 056 057 /** 058 * This abstract class represents a geometry needed for Get3DFeatureInfoRequest. 059 * It contains the 3d geometry and its 2d projektion. The 2d geometry is required 060 * for WFS request, the 3d geometry for the final test of intersection. 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 abstract class RequestGeometry { 070 071 protected Get3DFeatureInfo request; 072 073 // begin point of the view ray 074 private Point3d beginPointLine; 075 076 private CoordinateSystem crs; 077 078 // geometry for wfs query 079 protected Geometry wfsReqGeom; 080 081 // 3d geometry: needed for final testing 082 protected PickShape pickshape; 083 084 /** 085 * Constructor to initialize the attributes needed for all geometries 086 * 087 * @param request the Get3DFeatureInfoRequest 088 */ 089 public RequestGeometry ( Get3DFeatureInfo request ) { 090 this.request = request; 091 crs = request.getGetViewRequestCopy().getCrs(); 092 beginPointLine = new ViewPoint(request.getGetViewRequestCopy()).getObserverPosition(); 093 } 094 095 096 // GETTERS 097 public PickShape getPickshape() { 098 return pickshape; 099 } 100 101 public Geometry getWfsReqGeom() { 102 return wfsReqGeom; 103 } 104 105 public Point3d getBeginPointLine() { 106 return beginPointLine; 107 } 108 109 public CoordinateSystem getCrs() { 110 return crs; 111 } 112 113 public Get3DFeatureInfo getRequest() { 114 return request; 115 } 116 117 // abstract methods 118 /** 119 * sets the geometry needed for WFS request 120 */ 121 public abstract void setWfsReqGeom() throws GeometryException; 122 /** 123 * sets the geometry needed for final test of intersection 124 */ 125 public abstract void setPickshape(); 126 127 /** 128 * Calculates a ray thro the ViewPoint and the ClickPoint. 129 * 130 * @param clickI 131 * @param clickJ 132 * @return 133 */ 134 protected Point3d calcEndPoint( ViewPoint viewPoint, double depth, int width, int height, int clickI, int clickJ ) { 135 // sets extension of the ray 136 double extension = viewPoint.getFarClippingPlane(); 137 if ( depth > 0 && depth < extension ) { 138 extension = depth; 139 } 140 GetView getView = request.getGetViewRequestCopy(); 141 142 // rotates the cklickpoint to the roll-angle 143 double roll = getView.getRoll(); 144 double deltaI = -( width / 2 ) + clickI; 145 double deltaJ = ( height / 2 ) - clickJ; 146 147 double x = deltaI * Math.cos( roll ) + deltaJ * Math.sin( roll ); 148 double y = - deltaI * Math.sin( roll ) + deltaJ * Math.cos( roll ); 149 150 // calculates the angles to rotate the vector (vp-poi) 151 double aov = viewPoint.getAngleOfView(); 152 double distProj = ( width / 2 ) / Math.tan( aov / 2 ); 153 154 double angleI = Math.atan( x / distProj ); 155 double angleJ = Math.atan( y / distProj ); 156 157 Point3d vp = viewPoint.getObserverPosition(); 158 Point3d poi = viewPoint.getPointOfInterest(); 159 Vector3d vectorVPtoPOI = new Vector3d(); 160 vectorVPtoPOI.sub( poi, vp ); 161 162 Transform3D trans = new Transform3D(); 163 164 // rotation at angleJ (vertikal) 165 Vector3d rotJ = new Vector3d(); 166 Vector3d eZ = new Vector3d(0,0,1) ; 167 rotJ.cross( vectorVPtoPOI, eZ ); 168 AxisAngle4d axisAngleJ = new AxisAngle4d( rotJ, angleJ ); 169 trans.set(axisAngleJ); 170 trans.transform(vectorVPtoPOI); 171 172 //rotation at angleI (horizontal) 173 Vector3d rotI = new Vector3d(); 174 rotI.cross( vectorVPtoPOI, rotJ ); 175 AxisAngle4d axisAngleI = new AxisAngle4d( rotI, angleI ); 176 trans.set(axisAngleI); 177 trans.transform(vectorVPtoPOI); 178 179 // scale to extension 180 vectorVPtoPOI.normalize(); 181 vectorVPtoPOI.scale(extension); 182 Point3d endPoint = new Point3d(); 183 184 // add to the viewpoint 185 endPoint.add( vp, vectorVPtoPOI); 186 return endPoint; 187 } 188 }