From: akl Date: Fri, 6 Sep 2013 09:08:39 +0000 (+0000) Subject: Convert to Unix format X-Git-Tag: BR_hydro_v_0_1~65 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=d6c292cb8fd69d63c5295d32870e54d8aac352fc;p=modules%2Fhydro.git Convert to Unix format --- diff --git a/src/HYDROData/HYDROData_Lambert93.cxx b/src/HYDROData/HYDROData_Lambert93.cxx index 786eb7e6..504eab76 100755 --- a/src/HYDROData/HYDROData_Lambert93.cxx +++ b/src/HYDROData/HYDROData_Lambert93.cxx @@ -1,167 +1,334 @@ - -#include -#include - -// Standard values -const double PI = 3.14159265; - -// Base values of the Lambert-93 -const double a = 6378137; // m -- le demi-grand axe -const double f = 1.0 / 298.257222101; // l'aplatissement - -const double phi_1_deg = 44; // deg -- le premier parallèle d'échelle -const double phi_2_deg = 49; // deg -- le deuxième parallèle d'échell - -const double lambda_0_deg = 3; // deg -- la longitude d'origine donnée par le méridien central de Greenwich -const double phi_0_deg = 46.5; // deg -- la latitude d'origine - -const double X_0 = 700000; // m -- la coordonnée à l'origine -const double Y_0 = 6600000; // m -- la coordonnée à l'origine - -// Derived values of the Lambert-93 -const double b = a * ( 1 - f ); // m -- le demi-petit axe -const double e = sqrt( a*a - b*b ) / a; // l'excentricité - -const double phi_0 = HYDROData_Lambert93::toRad( phi_0_deg ); -const double phi_1 = HYDROData_Lambert93::toRad( phi_1_deg ); -const double phi_2 = HYDROData_Lambert93::toRad( phi_2_deg ); -const double lambda_0 = HYDROData_Lambert93::toRad( lambda_0_deg ); - - -double cot( double x ) -{ - return cos( x ) / sin( x ); -} - -double ln( double x ) -{ - return log( x ); -} - -const double s1 = sin( phi_1 ); -const double s2 = sin( phi_2 ); -const double c1 = cos( phi_1 ); -const double c2 = cos( phi_2 ); - -const double n1 = ln( c2/c1 ) + 1.0/2.0 * ln( (1-e*e*s1*s1)/(1-e*e*s2*s2) ); -const double n2 = tan( phi_1 / 2 + PI/4 ) * pow( 1-e*s1, e/2 ) * pow( 1+e*s2, e/2 ); -const double n3 = tan( phi_2 / 2 + PI/4 ) * pow( 1+e*s1, e/2 ) * pow( 1-e*s2, e/2 ); -const double n = n1 / ( ln( n2/n3 ) ); - -const double p1 = a * c1 / ( n * sqrt( 1-e*e*s1*s1 ) ); -const double p2 = tan( phi_1 / 2 + PI / 4 ); -const double p3 = pow( (1-e*s1)/(1+e*s1), e/2 ); -const double p_0 = p1 * pow( p2*p3, n ); - -double HYDROData_Lambert93::toRad( double theDeg ) -{ - return theDeg * PI / 180.0; -} - -double HYDROData_Lambert93::toDeg( double theRad ) -{ - return theRad / PI * 180.0; -} - -double HYDROData_Lambert93::calc_rho( double phi ) -{ - double c1 = cot( phi/2 + PI/4 ); - double c2 = ( 1 + e * sin( phi ) ) / ( 1 - e * sin( phi ) ); - double rho = p_0 * pow( c1 * pow( c2, e/2 ), n ); - return rho; -} - -void HYDROData_Lambert93::toXY( double theLatitudeDeg, double theLongitudeDeg, - double& theX, double& theY ) -{ - double phi = toRad( theLatitudeDeg ); - double lambda = toRad( theLongitudeDeg ); - - double rho = calc_rho( phi ); - double rho_0 = calc_rho( phi_0 ); - double theta = n * ( lambda - lambda_0 ); - - theX = X_0 + rho * sin( theta ); - theY = Y_0 + rho_0 - rho * cos( theta ); -} - -double arctan( double x ) -{ - return atan( x ); -} - -typedef double (*FUNC)( double ); -double solve( FUNC f, double c, double x1, double x2, double eps ) -{ - double f1 = f( x1 ) - c; - double f2 = f( x2 ) - c; - while( fabs( x1 - x2 ) > eps ) - { - double x = ( x1 + x2 ) / 2; - double fx = f( x ) - c; - bool b1 = f1>=0; - bool b2 = f2>=0; - bool b = fx>=0; - if( b==b1 ) - { - x1 = x; - f1 = fx; - } - else - { - x2 = x; - f2 = fx; - } - } - return ( x1 + x2 ) / 2; -} - -double F( double phi ) -{ - double f1 = tan( phi/2 + PI/4 ); - double f2 = ( 1 - e*sin(phi) ) / ( 1 + e*sin(phi) ); - return f1 * pow( f2, e/2 ); -} - -double Finv( double x, double eps ) -{ - return solve( F, x, 0, PI/2-eps, eps ); -} - -double HYDROData_Lambert93::calc_phi_inv( double rho, double eps ) -{ - double x = pow( p_0 / rho, 1/n ); - double phi = Finv( x, eps ); - return phi; -} - -double HYDROData_Lambert93::calc_phi_ign( double rho, double eps ) -{ - double x = p_0 / rho; - double y = pow( x, 1/n ); - double phi_i_1, phi_i = 2*arctan( y ) - PI/2; - while( true ) - { - phi_i_1 = phi_i; - double z = y * pow( ( 1 + e*sin(phi_i_1) ) / ( 1 - e*sin(phi_i_1) ), e/2 ); - phi_i = 2*arctan( pow( x, 1/n ) * z ) - PI/2; - if( fabs( phi_i - phi_i_1 ) < eps ) - return phi_i; - } - return -1; -} - -void HYDROData_Lambert93::toGeo( double theX, double theY, - double& theLatitudeDeg, double& theLongitudeDeg, - double theEps ) -{ - double rho_0 = calc_rho( phi_0 ); - double rho = sqrt( pow( theX - X_0, 2 ) + pow( Y_0 - theY + rho_0, 2 ) ); - double theta = 2 * arctan( ( theX - X_0 ) / ( Y_0 - theY + rho_0 + rho ) ); - - double lambda = theta / n + lambda_0; - double phi = calc_phi_inv( rho, theEps ); - - theLatitudeDeg = toDeg( phi ); - theLongitudeDeg = toDeg( lambda ); -} + + +#include + +#include + + + +// Standard values + +const double PI = 3.14159265; + + + +// Base values of the Lambert-93 + +const double a = 6378137; // m -- le demi-grand axe + +const double f = 1.0 / 298.257222101; // l'aplatissement + + + +const double phi_1_deg = 44; // deg -- le premier parallèle d'échelle + +const double phi_2_deg = 49; // deg -- le deuxième parallèle d'échell + + + +const double lambda_0_deg = 3; // deg -- la longitude d'origine donnée par le méridien central de Greenwich + +const double phi_0_deg = 46.5; // deg -- la latitude d'origine + + + +const double X_0 = 700000; // m -- la coordonnée à l'origine + +const double Y_0 = 6600000; // m -- la coordonnée à l'origine + + + +// Derived values of the Lambert-93 + +const double b = a * ( 1 - f ); // m -- le demi-petit axe + +const double e = sqrt( a*a - b*b ) / a; // l'excentricité + + + +const double phi_0 = HYDROData_Lambert93::toRad( phi_0_deg ); + +const double phi_1 = HYDROData_Lambert93::toRad( phi_1_deg ); + +const double phi_2 = HYDROData_Lambert93::toRad( phi_2_deg ); + +const double lambda_0 = HYDROData_Lambert93::toRad( lambda_0_deg ); + + + + + +double cot( double x ) + +{ + + return cos( x ) / sin( x ); + +} + + + +double ln( double x ) + +{ + + return log( x ); + +} + + + +const double s1 = sin( phi_1 ); + +const double s2 = sin( phi_2 ); + +const double c1 = cos( phi_1 ); + +const double c2 = cos( phi_2 ); + + + +const double n1 = ln( c2/c1 ) + 1.0/2.0 * ln( (1-e*e*s1*s1)/(1-e*e*s2*s2) ); + +const double n2 = tan( phi_1 / 2 + PI/4 ) * pow( 1-e*s1, e/2 ) * pow( 1+e*s2, e/2 ); + +const double n3 = tan( phi_2 / 2 + PI/4 ) * pow( 1+e*s1, e/2 ) * pow( 1-e*s2, e/2 ); + +const double n = n1 / ( ln( n2/n3 ) ); + + + +const double p1 = a * c1 / ( n * sqrt( 1-e*e*s1*s1 ) ); + +const double p2 = tan( phi_1 / 2 + PI / 4 ); + +const double p3 = pow( (1-e*s1)/(1+e*s1), e/2 ); + +const double p_0 = p1 * pow( p2*p3, n ); + + + +double HYDROData_Lambert93::toRad( double theDeg ) + +{ + + return theDeg * PI / 180.0; + +} + + + +double HYDROData_Lambert93::toDeg( double theRad ) + +{ + + return theRad / PI * 180.0; + +} + + + +double HYDROData_Lambert93::calc_rho( double phi ) + +{ + + double c1 = cot( phi/2 + PI/4 ); + + double c2 = ( 1 + e * sin( phi ) ) / ( 1 - e * sin( phi ) ); + + double rho = p_0 * pow( c1 * pow( c2, e/2 ), n ); + + return rho; + +} + + + +void HYDROData_Lambert93::toXY( double theLatitudeDeg, double theLongitudeDeg, + + double& theX, double& theY ) + +{ + + double phi = toRad( theLatitudeDeg ); + + double lambda = toRad( theLongitudeDeg ); + + + + double rho = calc_rho( phi ); + + double rho_0 = calc_rho( phi_0 ); + + double theta = n * ( lambda - lambda_0 ); + + + + theX = X_0 + rho * sin( theta ); + + theY = Y_0 + rho_0 - rho * cos( theta ); + +} + + + +double arctan( double x ) + +{ + + return atan( x ); + +} + + + +typedef double (*FUNC)( double ); + +double solve( FUNC f, double c, double x1, double x2, double eps ) + +{ + + double f1 = f( x1 ) - c; + + double f2 = f( x2 ) - c; + + while( fabs( x1 - x2 ) > eps ) + + { + + double x = ( x1 + x2 ) / 2; + + double fx = f( x ) - c; + + bool b1 = f1>=0; + + bool b2 = f2>=0; + + bool b = fx>=0; + + if( b==b1 ) + + { + + x1 = x; + + f1 = fx; + + } + + else + + { + + x2 = x; + + f2 = fx; + + } + + } + + return ( x1 + x2 ) / 2; + +} + + + +double F( double phi ) + +{ + + double f1 = tan( phi/2 + PI/4 ); + + double f2 = ( 1 - e*sin(phi) ) / ( 1 + e*sin(phi) ); + + return f1 * pow( f2, e/2 ); + +} + + + +double Finv( double x, double eps ) + +{ + + return solve( F, x, 0, PI/2-eps, eps ); + +} + + + +double HYDROData_Lambert93::calc_phi_inv( double rho, double eps ) + +{ + + double x = pow( p_0 / rho, 1/n ); + + double phi = Finv( x, eps ); + + return phi; + +} + + + +double HYDROData_Lambert93::calc_phi_ign( double rho, double eps ) + +{ + + double x = p_0 / rho; + + double y = pow( x, 1/n ); + + double phi_i_1, phi_i = 2*arctan( y ) - PI/2; + + while( true ) + + { + + phi_i_1 = phi_i; + + double z = y * pow( ( 1 + e*sin(phi_i_1) ) / ( 1 - e*sin(phi_i_1) ), e/2 ); + + phi_i = 2*arctan( pow( x, 1/n ) * z ) - PI/2; + + if( fabs( phi_i - phi_i_1 ) < eps ) + + return phi_i; + + } + + return -1; + +} + + + +void HYDROData_Lambert93::toGeo( double theX, double theY, + + double& theLatitudeDeg, double& theLongitudeDeg, + + double theEps ) + +{ + + double rho_0 = calc_rho( phi_0 ); + + double rho = sqrt( pow( theX - X_0, 2 ) + pow( Y_0 - theY + rho_0, 2 ) ); + + double theta = 2 * arctan( ( theX - X_0 ) / ( Y_0 - theY + rho_0 + rho ) ); + + + + double lambda = theta / n + lambda_0; + + double phi = calc_phi_inv( rho, theEps ); + + + + theLatitudeDeg = toDeg( phi ); + + theLongitudeDeg = toDeg( lambda ); + +} + diff --git a/src/HYDROData/HYDROData_Lambert93.h b/src/HYDROData/HYDROData_Lambert93.h index 47f08754..f6e8a16c 100755 --- a/src/HYDROData/HYDROData_Lambert93.h +++ b/src/HYDROData/HYDROData_Lambert93.h @@ -1,22 +1,44 @@ - -#ifndef HYDROData_Lambert93_HeaderFile -#define HYDROData_Lambert93_HeaderFile - -class HYDROData_Lambert93 -{ -public: - static double toRad( double theDeg ); - static double toDeg( double theRad ); - - static void toXY( double theLatitudeDeg, double theLongitudeDeg, - double& theX, double& theY ); - static void toGeo( double theX, double theY, - double& theLatitudeDeg, double& theLongitudeDeg, - double theEps ); -private: - static double calc_rho( double phi ); - static double calc_phi_inv( double rho, double eps ); - static double calc_phi_ign( double rho, double eps ); -}; - -#endif + + +#ifndef HYDROData_Lambert93_HeaderFile + +#define HYDROData_Lambert93_HeaderFile + + + +class HYDROData_Lambert93 + +{ + +public: + + static double toRad( double theDeg ); + + static double toDeg( double theRad ); + + + + static void toXY( double theLatitudeDeg, double theLongitudeDeg, + + double& theX, double& theY ); + + static void toGeo( double theX, double theY, + + double& theLatitudeDeg, double& theLongitudeDeg, + + double theEps ); + +private: + + static double calc_rho( double phi ); + + static double calc_phi_inv( double rho, double eps ); + + static double calc_phi_ign( double rho, double eps ); + +}; + + + +#endif +