Updated Timespan / Julian

feature/19
Daniel Warner 2011-06-10 12:41:11 +00:00
parent a53f06ebbf
commit 0f69c839b7
6 changed files with 78 additions and 61 deletions

View File

@ -28,16 +28,26 @@ public:
bool operator>=(const Julian &date) const; bool operator>=(const Julian &date) const;
bool operator<=(const Julian &date) const; bool operator<=(const Julian &date) const;
// asign Julian
Julian & operator=(const Julian& b); Julian & operator=(const Julian& b);
// assign double
Julian & operator=(const double b); Julian & operator=(const double b);
// add Timespan
Julian operator+(const Timespan& b) const; Julian operator+(const Timespan& b) const;
// subtract Timespan
Julian operator-(const Timespan& b) const; Julian operator-(const Timespan& b) const;
// subtracting two Julians produces a Timespan
Timespan operator-(const Julian& b) const; Timespan operator-(const Julian& b) const;
friend std::ostream & operator<<(std::ostream& stream, const Julian& julian); friend std::ostream & operator<<(std::ostream& stream, const Julian& julian);
struct DateTimeComponents { struct DateTimeComponents {
DateTimeComponents()
: years(0), months(0), days(0),
hours(0), minutes(0), seconds(0.0) {
}
int years; int years;
int months; int months;
int days; int days;
@ -84,22 +94,6 @@ public:
date_ += (sec / kSECONDS_PER_DAY); date_ += (sec / kSECONDS_PER_DAY);
} }
double SpanDay(const Julian& b) const {
return date_ - b.date_;
}
double SpanHour(const Julian& b) const {
return SpanDay(b) * kHOURS_PER_DAY;
}
double SpanMin(const Julian& b) const {
return SpanDay(b) * kMINUTES_PER_DAY;
}
double SpanSec(const Julian& b) const {
return SpanDay(b) * kSECONDS_PER_DAY;
}
static bool IsLeapYear(int y) { static bool IsLeapYear(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0); return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
} }

View File

@ -1,6 +1,6 @@
CC=g++ CC=g++
AR=ar AR=ar
CFLAGS=-c -Wall -O2 -pedantic -ansi CFLAGS=-c -Wall -g -pedantic -ansi
LDFLAGS= LDFLAGS=
SOURCES=CoordGeodetic.cpp \ SOURCES=CoordGeodetic.cpp \

View File

@ -91,7 +91,7 @@ Julian FindCrossingPoint(const CoordGeodetic& user_geo, SGP4& sgp4, const Julian
Julian time1 = initial_time1; Julian time1 = initial_time1;
Julian time2 = initial_time2; Julian time2 = initial_time2;
Julian middle_time = time1 + (time2.GetDate() - time1.GetDate()) / 2.0; Julian middle_time = time1 + (time2 - time1) / 2.0;
while (searching && loop_count < 25) { while (searching && loop_count < 25) {
@ -124,7 +124,7 @@ Julian FindCrossingPoint(const CoordGeodetic& user_geo, SGP4& sgp4, const Julian
searching = false; searching = false;
} }
middle_time = time1 + (time2.GetDate() - time1.GetDate()) / 2.0; middle_time = time1 + (time2 - time1) / 2.0;
loop_count++; loop_count++;
}; };

View File

@ -236,9 +236,9 @@ void SGP4::FindPosition(Eci* eci, double tsince) const {
void SGP4::FindPosition(Eci* eci, const Julian& date) const { void SGP4::FindPosition(Eci* eci, const Julian& date) const {
const double tsince = date.SpanMin(Epoch()); Timespan diff = date - Epoch();
FindPosition(eci, tsince); FindPosition(eci, diff.GetTotalMinutes());
} }
void SGP4::FindPositionSDP4(Eci* eci, double tsince) const { void SGP4::FindPositionSDP4(Eci* eci, double tsince) const {
@ -581,8 +581,9 @@ void SGP4::CalculateFinalPositionVelocity(Eci* eci, const double& tsince, const
const double zdot = (rdotk * uz + rfdotk * vz) * kXKMPER / 60.0; const double zdot = (rdotk * uz + rfdotk * vz) * kXKMPER / 60.0;
Vector velocity(xdot, ydot, zdot); Vector velocity(xdot, ydot, zdot);
Julian julian = Epoch(); Timespan diff;
julian.AddMin(tsince); diff.AddMinutes(tsince);
Julian julian = Epoch() + diff;
(*eci) = Eci(julian, position, velocity); (*eci) = Eci(julian, position, velocity);
} }

70
Timespan.cpp Normal file → Executable file
View File

@ -2,24 +2,38 @@
#include "Globals.h" #include "Globals.h"
Timespan::Timespan(void) { Timespan::Timespan()
: time_span_(0.0) {
} }
/* Timespan::Timespan(const double b){
* time_span is days and fraction of a day
*/ time_span_ = b;
Timespan::Timespan(const double time_span) {
time_span_ = time_span;
} }
Timespan::Timespan(const Timespan& b) { Timespan::Timespan(const Timespan& b) {
time_span_ = b.time_span_; time_span_ = b.time_span_;
} }
Timespan::~Timespan(void) { Timespan::~Timespan(void) {
} }
void Timespan::AddDays(const double days) {
time_span_ += days;
}
void Timespan::AddHours(const double hours) {
time_span_ += (hours / kHOURS_PER_DAY);
}
void Timespan::AddMinutes(const double minutes) {
time_span_ += (minutes / kMINUTES_PER_DAY);
}
void Timespan::AddSeconds(const double seconds) {
time_span_ += (seconds / kSECONDS_PER_DAY);
}
double Timespan::GetTotalDays() const { double Timespan::GetTotalDays() const {
return time_span_; return time_span_;
} }
@ -40,49 +54,52 @@ Timespan& Timespan::operator =(const Timespan& b) {
if (this != &b) { if (this != &b) {
time_span_ = b.time_span_; time_span_ = b.time_span_;
} }
return (*this); return (*this);
} }
Timespan Timespan::operator +(const Timespan& b) const { Timespan Timespan::operator +(const Timespan& b) const {
Timespan result(*this); return Timespan(*this) += b;
result.time_span_ += b.GetTotalDays();
return result;
} }
Timespan Timespan::operator -(const Timespan& b) const { Timespan Timespan::operator -(const Timespan& b) const {
Timespan result(*this); return Timespan(*this) -= b;
result.time_span_ -= b.GetTotalDays();
return result;
} }
const Timespan & Timespan::operator+=(const Timespan& b) { Timespan Timespan::operator/(const double b) const {
return Timespan(*this) /= b;
}
Timespan Timespan::operator*(const double b) const {
return Timespan(*this) *= b;
}
Timespan & Timespan::operator+=(const Timespan& b) {
time_span_ += b.time_span_; time_span_ += b.time_span_;
return (*this); return (*this);
} }
const Timespan & Timespan::operator-=(const Timespan& b) { Timespan & Timespan::operator-=(const Timespan& b) {
time_span_ -= b.time_span_; time_span_ -= b.time_span_;
return (*this); return (*this);
} }
Timespan Timespan::operator +() const { Timespan & Timespan::operator/=(const double b) {
Timespan result(*this); time_span_ /= b;
result.time_span_ = +result.time_span_; return (*this);
return result;
} }
Timespan Timespan::operator -() const { Timespan & Timespan::operator*=(const double b) {
Timespan result(*this); time_span_ *= b;
result.time_span_ = -result.time_span_; return (*this);
return result;
} }
bool Timespan::operator ==(const Timespan& b) const { bool Timespan::operator ==(const Timespan& b) const {
@ -95,10 +112,7 @@ bool Timespan::operator ==(const Timespan& b) const {
bool Timespan::operator !=(const Timespan& b) const { bool Timespan::operator !=(const Timespan& b) const {
if (time_span_ == b.time_span_) return !(*this == b);
return false;
else
return true;
} }
bool Timespan::operator>(const Timespan& b) const { bool Timespan::operator>(const Timespan& b) const {

26
Timespan.h Normal file → Executable file
View File

@ -3,26 +3,34 @@
class Timespan { class Timespan {
public: public:
Timespan(void); Timespan();
Timespan(const double time_span); Timespan(const double b);
Timespan(const Timespan& b); Timespan(const Timespan& b);
virtual ~Timespan(void); virtual ~Timespan(void);
void AddDays(const double days);
void AddHours(const double hours);
void AddMinutes(const double minutes);
void AddSeconds(const double seconds);
double GetTotalDays() const; double GetTotalDays() const;
double GetTotalHours() const; double GetTotalHours() const;
double GetTotalMinutes() const; double GetTotalMinutes() const;
double GetTotalSeconds() const; double GetTotalSeconds() const;
/* // assignment
* overloaded operators
*/
Timespan & operator=(const Timespan& b); Timespan & operator=(const Timespan& b);
// arithmetic
Timespan operator+(const Timespan& b) const; Timespan operator+(const Timespan& b) const;
Timespan operator-(const Timespan& b) const; Timespan operator-(const Timespan& b) const;
Timespan operator+() const; Timespan operator/(const double b) const;
Timespan operator-() const; Timespan operator*(const double b) const;
const Timespan & operator+=(const Timespan& b); // compound arithmetic
const Timespan & operator-=(const Timespan& b); Timespan & operator+=(const Timespan& b);
Timespan & operator-=(const Timespan& b);
Timespan & operator/=(const double b);
Timespan & operator*=(const double b);
// comparison
bool operator==(const Timespan& b) const; bool operator==(const Timespan& b) const;
bool operator!=(const Timespan& b) const; bool operator!=(const Timespan& b) const;
bool operator>(const Timespan& b) const; bool operator>(const Timespan& b) const;