void ViewPort::GetLLFromPix( const wxPoint &p, double *lat, double *lon ) { int dx = p.x - ( pix_width / 2 ); int dy = ( pix_height / 2 ) - p.y; double xpr = dx; double ypr = dy; // Apply VP Rotation double angle = rotation; if(!g_bskew_comp) angle += skew; if( angle ) { xpr = ( dx * cos( angle ) ) - ( dy * sin( angle ) ); ypr = ( dy * cos( angle ) ) + ( dx * sin( angle ) ); } double d_east = xpr / view_scale_ppm; double d_north = ypr / view_scale_ppm; double slat, slon; if( PROJECTION_TRANSVERSE_MERCATOR == m_projection_type ) { double tmceasting, tmcnorthing; toTM( clat, clon, 0., clon, &tmceasting, &tmcnorthing ); fromTM( d_east, d_north + tmcnorthing, 0., clon, &slat, &slon ); } else if( PROJECTION_POLYCONIC == m_projection_type ) { double polyeasting, polynorthing; toPOLY( clat, clon, 0., clon, &polyeasting, &polynorthing ); fromPOLY( d_east, d_north + polynorthing, 0., clon, &slat, &slon ); } //TODO This could be fromSM_ECC to better match some Raster charts // However, it seems that cm93 (and S57) prefer no eccentricity correction // Think about it.... else fromSM( d_east, d_north, clat, clon, &slat, &slon ); *lat = slat; if( slon < -180. ) slon += 360.; else if( slon > 180. ) slon -= 360.; *lon = slon; }
void ViewPort::GetLLFromPix( const wxPoint2DDouble &p, double *lat, double *lon ) { double dx = p.m_x - ( pix_width / 2.0 ); double dy = ( pix_height / 2.0 ) - p.m_y; double xpr = dx; double ypr = dy; // Apply VP Rotation double angle = rotation; if( angle ) { xpr = ( dx * cos( angle ) ) - ( dy * sin( angle ) ); ypr = ( dy * cos( angle ) ) + ( dx * sin( angle ) ); } double d_east = xpr / view_scale_ppm; double d_north = ypr / view_scale_ppm; double slat = 0.0, slon = 0.0; switch( m_projection_type ) { case PROJECTION_MERCATOR: //TODO This could be fromSM_ECC to better match some Raster charts // However, it seems that cm93 (and S57) prefer no eccentricity correction // Think about it.... fromSM( d_east, d_north, clat, clon, &slat, &slon ); break; case PROJECTION_TRANSVERSE_MERCATOR: { double tmceasting, tmcnorthing; toTM( clat, clon, 0., clon, &tmceasting, &tmcnorthing ); fromTM( d_east, d_north + tmcnorthing, 0., clon, &slat, &slon ); } break; case PROJECTION_POLYCONIC: { double polyeasting, polynorthing; toPOLY( clat, clon, 0., clon, &polyeasting, &polynorthing ); fromPOLY( d_east, d_north + polynorthing, 0., clon, &slat, &slon ); } break; case PROJECTION_ORTHOGRAPHIC: fromORTHO( d_east, d_north, clat, clon, &slat, &slon ); break; case PROJECTION_POLAR: fromPOLAR( d_east, d_north, clat, clon, &slat, &slon ); break; case PROJECTION_STEREOGRAPHIC: fromSTEREO( d_east, d_north, clat, clon, &slat, &slon ); break; case PROJECTION_GNOMONIC: fromGNO( d_east, d_north, clat, clon, &slat, &slon ); break; case PROJECTION_EQUIRECTANGULAR: fromEQUIRECT( d_east, d_north, clat, clon, &slat, &slon ); break; default: printf("unhandled projection\n"); } *lat = slat; if( slon < -180. ) slon += 360.; else if( slon > 180. ) slon -= 360.; *lon = slon; }