osgEarth 2.1.1
|
00001 00002 00003 // * Copyright 2008-2009 Pelican Ventures, Inc. 00004 // * http://osgearth.org 00005 // * 00006 // * osgEarth is free software; you can redistribute it and/or modify 00007 // * it under the terms of the GNU Lesser General Public License as published by 00008 // * the Free Software Foundation; either version 2 of the License, or 00009 // * (at your option) any later version. 00010 // * 00011 // * This program is distributed in the hope that it will be useful, 00012 // * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 // * GNU Lesser General Public License for more details. 00015 // * 00016 // * You should have received a copy of the GNU Lesser General Public License 00017 // * along with this program. If not, see <http://www.gnu.org/licenses/> 00018 // */ 00019 // 00020 //#include <osgEarth/Mercator> 00021 //#include <osg/Math> 00022 //#include <osg/Notify> 00023 //#include <sstream> 00024 //#include <algorithm> 00025 //#include <string.h> 00026 // 00027 //using namespace osgEarth; 00028 // 00029 //#define MERC_MAX_LAT 85.084059050110383 00030 //#define MERC_MIN_LAT -85.084059050110383 00031 // 00032 //static double 00033 //lonToU(double lon) { 00034 // return (lon + 180.0) / 360.0; 00035 //} 00036 // 00037 //static double 00038 //latToV(double lat) { 00039 // double sin_lat = sin( osg::DegreesToRadians( lat ) ); 00040 // return 0.5 - log( (1+sin_lat) / (1-sin_lat) ) / (4*osg::PI); 00041 //} 00042 // 00043 //static void 00044 //getUV(const GeoExtent& ext, 00045 // double lon, double lat, 00046 // double& out_u, double& out_v) 00047 //{ 00048 // out_u = (lon-ext.xMin())/ext.width(); 00049 // 00050 // double vmin = latToV( osg::clampBetween( ext.yMax(), MERC_MIN_LAT, MERC_MAX_LAT ) ); 00051 // double vmax = latToV( osg::clampBetween( ext.yMin(), MERC_MIN_LAT, MERC_MAX_LAT ) ); 00052 // double vlat = latToV( osg::clampBetween( lat, MERC_MIN_LAT, MERC_MAX_LAT ) ); 00053 // 00054 // out_v = (vlat-vmin)/(vmax-vmin); 00055 //} 00056 // 00057 // 00058 //MercatorLocator::MercatorLocator( const osgTerrain::Locator& prototype, const GeoExtent& image_ext ) : 00059 //osgTerrain::Locator( prototype ) 00060 //{ 00061 // // assumption: incoming extent is Mercator SRS 00062 // _image_ext = image_ext.transform( image_ext.getSRS()->getGeographicSRS() ); 00063 //} 00064 // 00065 // 00066 //bool 00067 //MercatorLocator::convertLocalToModel(const osg::Vec3d& local, osg::Vec3d& world) const 00068 //{ 00069 // switch(_coordinateSystemType) 00070 // { 00071 // case(GEOCENTRIC): 00072 // { 00073 // return Locator::convertLocalToModel( local, world ); 00074 // } 00075 // case(GEOGRAPHIC): 00076 // { 00077 // return Locator::convertLocalToModel( local, world ); 00078 // } 00079 // case(PROJECTED): 00080 // { 00081 // return Locator::convertLocalToModel( local, world ); 00082 // } 00083 // } 00084 // 00085 // return false; 00086 //} 00087 // 00088 //bool 00089 //MercatorLocator::convertModelToLocal(const osg::Vec3d& world, osg::Vec3d& local) const 00090 //{ 00091 // // OSG 2.7 bug workaround: bug fix in Locator submitted by GW on 10/3/2008: 00092 // const_cast<MercatorLocator*>(this)->_inverse.invert( _transform ); 00093 // 00094 // switch(_coordinateSystemType) 00095 // { 00096 // case(GEOCENTRIC): 00097 // { 00098 // double longitude, latitude, height; 00099 // 00100 // _ellipsoidModel->convertXYZToLatLongHeight(world.x(), world.y(), world.z(), 00101 // latitude, longitude, height ); 00102 // 00103 // local = osg::Vec3d(longitude, latitude, height) * _inverse; 00104 // 00105 // double lon_deg = osg::RadiansToDegrees(longitude); 00106 // double lat_deg = osg::RadiansToDegrees(latitude); 00107 // double xr, yr; 00108 // 00109 // //GeoExtent tile_extent( 00110 // // NULL, 00111 // // osg::RadiansToDegrees(_transform(3,0)), 00112 // // osg::RadiansToDegrees(_transform(3,1)), 00113 // // osg::RadiansToDegrees(_transform(3,0)+_transform(0,0)), 00114 // // osg::RadiansToDegrees(_transform(3,1)+_transform(1,1) ) ); 00115 // 00116 // getUV( _image_ext, lon_deg, lat_deg, xr, yr ); 00117 // 00118 // local.x() = xr; 00119 // local.y() = 1.0-yr; 00120 // return true; 00121 // } 00122 // 00123 // 00124 // case(GEOGRAPHIC): 00125 // { 00126 // local = world * _inverse; 00127 // 00128 // osg::Vec3d w = world; 00129 // double lon_deg = w.x(); 00130 // double lat_deg = w.y(); 00131 // 00132 // double xr, yr; 00133 // getUV( _image_ext, lon_deg, lat_deg, xr, yr ); 00134 // 00135 // local.x() = xr; 00136 // local.y() = 1.0-yr; 00137 // return true; 00138 // } 00139 // 00140 // case(PROJECTED): 00141 // { 00142 // local = world * _inverse; 00143 // return true; 00144 // } 00145 // } 00146 // 00147 // return false; 00148 //} 00149 //