X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FTime%2Fsunsolver.cxx;h=b37112816282f1e061219139f600a770087b47ad;hb=da73dd97d3d0e36b6078728ac39f0b98cae46ff7;hp=504de90817387a90011ab97e38eb8fe1085790e9;hpb=5b29cd4cc0dafc110320af4993cf14eacb7966f0;p=flightgear.git diff --git a/src/Time/sunsolver.cxx b/src/Time/sunsolver.cxx index 504de9081..b37112816 100644 --- a/src/Time/sunsolver.cxx +++ b/src/Time/sunsolver.cxx @@ -29,14 +29,14 @@ #include #include +#include #include -#include #include #include
+#include
-#include "tmp.hxx" #include "sunsolver.hxx" @@ -53,29 +53,24 @@ void fgSunPositionGST(double gst, double *lon, double *lat) { /* double *lat; (return) latitude */ /* double *lon; (return) longitude */ - double alpha, delta; double tmp; - double beta = globals->get_ephem()->get_sun()->getLat(); - // double r = globals->get_ephem()->get_sun()->getDistance(); - double xs = globals->get_ephem()->get_sun()->getxs(); - double ys = globals->get_ephem()->get_sun()->getys(); - double ye = globals->get_ephem()->get_sun()->getye(); - double ze = globals->get_ephem()->get_sun()->getze(); - alpha = atan2(ys - tan(beta)*ze/ys, xs); - delta = asin(sin(beta)*ye/ys + cos(beta)*ze); - - tmp = alpha - (SGD_2PI/24)*gst; - if (tmp < -SGD_PI) { - do tmp += SGD_2PI; - while (tmp < -SGD_PI); - } else if (tmp > SGD_PI) { - do tmp -= SGD_2PI; - while (tmp < -SGD_PI); - } + SGPropertyNode* sun = fgGetNode("/ephemeris/sun"); + assert(sun); + double xs = sun->getDoubleValue("xs"); + //double ys = sun->getDoubleValue("ys"); + double ye = sun->getDoubleValue("ye"); + double ze = sun->getDoubleValue("ze"); + double ra = atan2(ye, xs); + double dec = atan2(ze, sqrt(xs * xs + ye * ye)); + + tmp = ra - (SGD_2PI/24)*gst; + + double signedPI = (tmp < 0.0) ? -SGD_PI : SGD_PI; + tmp = fmod(tmp+signedPI, SGD_2PI) - signedPI; *lon = tmp; - *lat = delta; + *lat = dec; } static double sun_angle( const SGTime &t, const SGVec3d& world_up, @@ -83,25 +78,29 @@ static double sun_angle( const SGTime &t, const SGVec3d& world_up, SG_LOG( SG_EVENT, SG_DEBUG, " Updating Sun position" ); SG_LOG( SG_EVENT, SG_DEBUG, " Gst = " << t.getGst() ); - double sun_lon, sun_gd_lat; - fgSunPositionGST( t.getGst(), &sun_lon, &sun_gd_lat ); - SGVec3d sunpos = SGVec3d::fromGeod(SGGeod::fromRad(sun_lon, sun_gd_lat)); + double sun_lon, sun_gc_lat; + fgSunPositionGST( t.getGst(), &sun_lon, &sun_gc_lat ); + SGVec3d sunpos = SGVec3d::fromGeoc(SGGeoc::fromRadM(sun_lon, sun_gc_lat, + SGGeodesy::EQURAD)); SG_LOG( SG_EVENT, SG_DEBUG, " t.cur_time = " << t.get_cur_time() ); SG_LOG( SG_EVENT, SG_DEBUG, - " Sun Geodetic lat = " << sun_gd_lat ); + " Sun Geocentric lat = " << sun_gc_lat ); // calculate the sun's relative angle to local up - SGVec3f nup = normalize(toVec3f(world_up)); - SGVec3f nsun = normalize(toVec3f(sunpos)); + SGVec3d nup = normalize(world_up); + SGVec3d nsun = normalize(sunpos); // cout << "nup = " << nup[0] << "," << nup[1] << "," // << nup[2] << endl; // cout << "nsun = " << nsun[0] << "," << nsun[1] << "," // << nsun[2] << endl; double sun_angle = acos( dot( nup, nsun ) ); + + double signedPI = (sun_angle < 0.0) ? -SGD_PI : SGD_PI; + sun_angle = fmod(sun_angle+signedPI, SGD_2PI) - signedPI; + double sun_angle_deg = sun_angle * SG_RADIANS_TO_DEGREES; - while ( sun_angle_deg < -180 ) { sun_angle += 360; } SG_LOG( SG_EVENT, SG_DEBUG, "sun angle relative to current location = " << sun_angle_deg );