Commit 14da93c9 authored by Alexander Lapshin's avatar Alexander Lapshin

.

parent 44857c88
...@@ -21,7 +21,7 @@ void RAzGammaCoords::SetXYZ(const Vect3 &src) ...@@ -21,7 +21,7 @@ void RAzGammaCoords::SetXYZ(const Vect3 &src)
Dist = src.Len(); Dist = src.Len();
Az = atan2(src.z, src.x); Az = atan2(src.z, src.x);
Gamma = asin(src.y / Dist); Gamma = Dist != 0 ? asin(src.y / Dist) : 0;
// Az = atan2(src.y, src.x); // Az = atan2(src.y, src.x);
// Gamma = asin(src.z / Dist); // Gamma = asin(src.z / Dist);
......
...@@ -258,11 +258,21 @@ static double DaysInterval(const TimeGD& date1, const TimeGD& date2) ...@@ -258,11 +258,21 @@ static double DaysInterval(const TimeGD& date1, const TimeGD& date2)
return diff.Day().GetDouble(); return diff.Day().GetDouble();
} }
static double SecInterval(const TimeGD& date1, const TimeGD& date2)
{
return DaysInterval(date1, date2) * 86400;
}
static double DaysInterval(const TimeJD& date1, const TimeJD& date2) static double DaysInterval(const TimeJD& date1, const TimeJD& date2)
{ {
return (date2 - date1).Day().GetDouble(); return (date2 - date1).Day().GetDouble();
} }
static double SecInterval(const TimeJD& date1, const TimeJD& date2)
{
return DaysInterval(date1, date2) * 86400;
}
static void DegToDMS(double deg, int &rd, int &rm, double &rs) static void DegToDMS(double deg, int &rd, int &rm, double &rs)
{ {
if (deg < 0) { if (deg < 0) {
......
...@@ -93,8 +93,10 @@ void XInterpolator::propagate(const SInitOrbit& orbit, const TimeJD& beg, const ...@@ -93,8 +93,10 @@ void XInterpolator::propagate(const SInitOrbit& orbit, const TimeJD& beg, const
propagate_dir(orbit, ShiftDate(orbit.GetDate(), +get_step(orbit) / 2.0), end, +1, result); propagate_dir(orbit, ShiftDate(orbit.GetDate(), +get_step(orbit) / 2.0), end, +1, result);
propagate_dir(orbit, ShiftDate(orbit.GetDate(), -get_step(orbit) / 2.0), beg, -1, result); propagate_dir(orbit, ShiftDate(orbit.GetDate(), -get_step(orbit) / 2.0), beg, -1, result);
} }
std::sort(result.begin(), result.end(), cmppos<false, IRes>()); std::sort(result.begin(), result.end(), [](const IRes& a, const IRes& b) {
return a.get_date() < b.get_date();
});
} }
void XInterpolator::calc_positions(const SInitOrbit& orbit, const TimeJD& beg, const TimeJD& end, std::vector<IRes>& result) void XInterpolator::calc_positions(const SInitOrbit& orbit, const TimeJD& beg, const TimeJD& end, std::vector<IRes>& result)
......
...@@ -15,6 +15,7 @@ public: ...@@ -15,6 +15,7 @@ public:
TimeJD get_end() const { return m_end; } TimeJD get_end() const { return m_end; }
const SInitOrbit& get_orbit() const { return m_orbit; } const SInitOrbit& get_orbit() const { return m_orbit; }
double get_min_distance() const { return m_mind; } double get_min_distance() const { return m_mind; }
std::string get_next_orbitid() const {return m_next_orbitid;}
void interpolate(const TimeJD& beg, const TimeJD& end); void interpolate(const TimeJD& beg, const TimeJD& end);
const XInterpolator* get_interpolator() const { return m_ip; } const XInterpolator* get_interpolator() const { return m_ip; }
private: private:
......
...@@ -2,17 +2,7 @@ ...@@ -2,17 +2,7 @@
#include "TimeFunctions.h" #include "TimeFunctions.h"
#include "Propagator.h" #include "Propagator.h"
#include "xalgorithm.h" #include "xalgorithm.h"
#include "orb_date.h"
template<bool dir, typename vartype> struct cmporb : public std::binary_function<vartype, vartype, bool>
{
bool operator()(vartype s1, vartype s2) const
{
const TimeJD& v1 = s1.GetDate();
const TimeJD& v2 = s2.GetDate();
return (v1 == v2) ? false : (v1 < v2) ^ dir;
}
};
OrbBlocksStore::OrbBlocksStore() OrbBlocksStore::OrbBlocksStore()
{ {
...@@ -21,7 +11,10 @@ OrbBlocksStore::OrbBlocksStore() ...@@ -21,7 +11,10 @@ OrbBlocksStore::OrbBlocksStore()
void OrbBlocksStore::init(const SInitOrbits& orbits, const TimeJD* beg, const TimeJD* end, bool filter_orbits, bool min_dist_forced, bool interpolate) void OrbBlocksStore::init(const SInitOrbits& orbits, const TimeJD* beg, const TimeJD* end, bool filter_orbits, bool min_dist_forced, bool interpolate)
{ {
SInitOrbits sordet_orbits = orbits; SInitOrbits sordet_orbits = orbits;
std::sort(sordet_orbits.begin(), sordet_orbits.end(), cmporb<false, SInitOrbit>());
std::sort(sordet_orbits.begin(), sordet_orbits.end(), [](const SInitOrbit& a, const SInitOrbit& b) {
return a.GetDate() < b.GetDate();
});
m_beg_before_filter = beg ? *beg : sordet_orbits.front().GetDate(); m_beg_before_filter = beg ? *beg : sordet_orbits.front().GetDate();
m_end_before_filter = end ? *end : sordet_orbits.back().GetDate(); m_end_before_filter = end ? *end : sordet_orbits.back().GetDate();
...@@ -256,3 +249,39 @@ const SInitOrbit& OrbBlocksStore::get_orbit(const TimeJD& date) const ...@@ -256,3 +249,39 @@ const SInitOrbit& OrbBlocksStore::get_orbit(const TimeJD& date) const
throw (Exp() << "no orbit found"); throw (Exp() << "no orbit found");
} }
SInitOrbits OrbBlocksStore::calc_orbits(std::vector<TimeJD> dates, bool variates) const
{
std::sort(dates.begin(), dates.end(), [](const TimeJD& a, const TimeJD& b) {
return a < b;
});
SInitOrbits result;
result.reserve(dates.size());
size_t j = 0;
for (auto const& block : get_blocks()) {
std::vector<TimeJD> b_dates;
for (size_t i = j; i < dates.size(); i++) {
const TimeJD& date = dates[i];
if (date >= block.get_beg() && date <= block.get_end()) {
b_dates.push_back(date);
}
else if (date > block.get_end()) {
j = i;
break;
}
}
if (b_dates.empty()) {
continue;
}
std::vector<SInitOrbit> orbits = calc_orbits_on_dates(block.get_orbit(), b_dates, variates);
result.insert(result.end(), orbits.begin(), orbits.end());
}
return result;
}
...@@ -13,6 +13,7 @@ public: ...@@ -13,6 +13,7 @@ public:
OrbBlocksStore(); OrbBlocksStore();
void init(const SInitOrbits& orbits, const TimeJD* beg, const TimeJD* end, bool filter_orbits, bool min_dist_forced, bool interpolate); void init(const SInitOrbits& orbits, const TimeJD* beg, const TimeJD* end, bool filter_orbits, bool min_dist_forced, bool interpolate);
void init(const SInitOrbits& orbits, const TimeJD& beg, const TimeJD& end, bool filter_orbits, bool min_dist_forced, bool interpolate); void init(const SInitOrbits& orbits, const TimeJD& beg, const TimeJD& end, bool filter_orbits, bool min_dist_forced, bool interpolate);
SInitOrbits calc_orbits(std::vector<TimeJD> dates, bool variates) const;
Vect6 get_pos(const TimeJD& date) const; Vect6 get_pos(const TimeJD& date) const;
const SInitOrbit& get_orbit(const TimeJD& date) const; const SInitOrbit& get_orbit(const TimeJD& date) const;
const OrbBlocks& get_blocks() const { return m_blocks; } const OrbBlocks& get_blocks() const { return m_blocks; }
......
...@@ -112,14 +112,18 @@ void split_dates(const std::vector<TimeJD>& dates, const TimeJD& date, std::vect ...@@ -112,14 +112,18 @@ void split_dates(const std::vector<TimeJD>& dates, const TimeJD& date, std::vect
} }
} }
template <typename T> void calc_orbit_on_dates(const SInitOrbit& orbit, const std::vector<TimeJD>& dates, bool variates, std::vector<T>& result) template <typename T> void calc_orbit_on_dates(const SInitOrbit& orbit, std::vector<TimeJD> dates, bool variates, std::vector<T>& result)
{ {
if (dates.empty()) { if (dates.empty()) {
return; return;
} }
TimeJD beg_ext = dates.front(); std::sort(dates.begin(), dates.end(), [](const TimeJD& a, const TimeJD& b) {
TimeJD end_ext = dates.back(); return a < b;
});
const TimeJD& beg_ext = dates.front();
const TimeJD& end_ext = dates.back();
if (orbit.GetDate() <= beg_ext) { if (orbit.GetDate() <= beg_ext) {
propagate_dir(orbit, dates, 1, variates, result); propagate_dir(orbit, dates, 1, variates, result);
...@@ -149,7 +153,11 @@ std::vector<IRes> calc_positions_on_dates(const SInitOrbit& orbit, const std::ve ...@@ -149,7 +153,11 @@ std::vector<IRes> calc_positions_on_dates(const SInitOrbit& orbit, const std::ve
{ {
std::vector<IRes> result; std::vector<IRes> result;
calc_orbit_on_dates(orbit, dates, false, result); calc_orbit_on_dates(orbit, dates, false, result);
std::sort(result.begin(), result.end(), cmppos<false, IRes>());
std::sort(result.begin(), result.end(), [](const IRes& a, const IRes& b) {
return a.get_date() < b.get_date();
});
return result; return result;
} }
...@@ -157,6 +165,10 @@ std::vector<SInitOrbit> calc_orbits_on_dates(const SInitOrbit& orbit, const std: ...@@ -157,6 +165,10 @@ std::vector<SInitOrbit> calc_orbits_on_dates(const SInitOrbit& orbit, const std:
{ {
std::vector<SInitOrbit> result; std::vector<SInitOrbit> result;
calc_orbit_on_dates(orbit, dates, variates, result); calc_orbit_on_dates(orbit, dates, variates, result);
std::sort(result.begin(), result.end(), cmporb<false, SInitOrbit>());
std::sort(result.begin(), result.end(), [](const SInitOrbit& a, const SInitOrbit& b) {
return a.GetDate() < b.GetDate();
});
return result; return result;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment