osgEarth 2.1.1

/home/cube/sources/osgearth/src/osgEarth/Mercator.cpp

Go to the documentation of this file.
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 //
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines