#include "stdafx.h" #include #include #include "../rubidium/defines.h" #include "../Frame Lisp/intrinsics.h" #include "../rubidium/drawstuff.h" #include "euclid.h" #define INCLINATION_OF_EARTH_ORBIT 23.439281 using namespace std; using namespace TENSORS; #define SIDEREAL (23.0+56.0/60.0+4.091/3600.0) class ellipse: public euclidian { friend class euclidean; private: protected: fpoint m_foci[2]; double m_area, m_aspect; double m_eccentricity; double m_major, m_minor; double m_offset; public: ellipse () { m_major = 0; m_minor = 0; m_area = 0; m_host = NULL; } void compute_area (); void compute_minor (); double get_area (); double aphelion (); double perhelion (); void set_eccentricty (MATH_TYPE); void set_foci (const fpoint &pt, int i); void set_major (MATH_TYPE a); void set_minor (MATH_TYPE b); }; void ellipse::set_major (MATH_TYPE a) { m_major = a; } void ellipse::set_eccentricty (MATH_TYPE e) { m_eccentricity = e; } void ellipse::compute_area () { m_area = PI*m_major*m_minor; m_aspect = m_major/m_minor; } void ellipse::compute_minor () { // assume that e = sqrt(1-(b*b)/(a*a)) // solve for zz = b/a double zz = sqrt(1-m_eccentricity*m_eccentricity); m_minor = zz*m_major; m_offset = 0.5*sqrt (m_major*m_major-m_minor*m_minor); m_foci [0] = fpoint (0.0,0.0); m_foci [1] = fpoint (m_offset,0.0); } void ellipse::set_foci (const fpoint &pt, int i) { m_foci[i] = pt; } double ellipse::aphelion () { double result; result = 0.5*m_major+m_offset; return result; } double ellipse::perhelion () { double result; result = 0.5*m_major-m_offset; return result; } class celestial_coordinates { public: MATH_TYPE right_ascension; MATH_TYPE declination; }; solar_elements::solar_elements () { m_ecliptic = new ellipse; m_ecliptic->set_major (2*149.60e6); m_ecliptic->set_eccentricty (0.0167086); m_ecliptic->compute_minor (); m_ecliptic->compute_area (); double ap = 0.621371*m_ecliptic->aphelion(); double pe = 0.621371*m_ecliptic->perhelion(); set_longitude (119.0); set_latitude (39.0); set_time (); R = 3958.8*5280.0*FEET_TO_CM*1.0e-5; m_ROTX = tensor::rotate_x (TO_RADIANS(INCLINATION_OF_EARTH_ORBIT)); } void solar_elements::set_time () { COleDateTime _dt = COleDateTime::GetCurrentTime(); m_year = _dt.GetYear (); m_month = _dt.GetMonth (); m_day = _dt.GetDay (); m_hour = _dt.GetHour (); m_minute = _dt.GetMinute (); m_second = _dt.GetSecond (); m_time_zone = -8; m_daylight_savings = 0; } void solar_elements::set_time (char *str) { COleDateTime _dt = COleDateTime::GetCurrentTime(); m_year = _dt.GetYear (); m_month = _dt.GetMonth (); m_day = _dt.GetDay (); ASSERT (strlen(str)==6); char str_h [4], str_m [4], str_s [4]; strncpy_s (str_h,4,&str[0],2); strncpy_s (str_m,4,&str[2],2); strncpy_s (str_s,4,&str[4],2); m_hour = atoi(str_h); m_minute = atoi(str_m); m_second = atoi(str_s); m_time_zone = -8; if (m_time_zone!=0) m_hour = (m_hour+24+m_time_zone)%24; m_daylight_savings = 0; } void solar_elements::set_longitude (double arg) { m_longitude = arg; } void solar_elements::set_latitude (double arg) { m_latitude = arg; } void solar_elements::debug_test () { ASSERT (julian_day (1,1,2000)==2451545); ASSERT (julian_day (6,19,1987)==2446966); ASSERT (julian_day (12,8,2009)==2455174); char test_str [256]; int H,M,M1,S; m_month = 7; m_day = 6; int start_hour = 04; int start_minute = 30; int end_hour = 04; int end_minute = 40; for (H=start_hour,M=start_minute;H<=end_hour;H++,M=0) { M1 = (H==end_hour?end_minute:60); for (;M