Commit d764526c authored by Alexander Lapshin's avatar Alexander Lapshin

.

Merge branch 'master' of https://gitlab.ancprotek.ru/alapshin/common
parents 061ddd28 0969b9b3
#ifndef MAGDATA_H #pragma once
#define MAGDATA_H
#include "XMLFunctions.h" #include "XMLFunctions.h"
#include "json_functions.h" #include "json_functions.h"
...@@ -18,6 +17,9 @@ public: ...@@ -18,6 +17,9 @@ public:
bool HasGeomData() const { return m_hasGeomData; } bool HasGeomData() const { return m_hasGeomData; }
void CalcMag(double phase, double range); void CalcMag(double phase, double range);
void CalcGeomMag(double phase, double range); void CalcGeomMag(double phase, double range);
double get_std_mag() const { return m_stdmag; }
double get_std_phase() const { return m_stdphase; }
double get_std_range() const { return m_stdrange; }
private: private:
static double CalcA0g(double stdmag, double stdphase, double stdrange, double sunMag); static double CalcA0g(double stdmag, double stdphase, double stdrange, double sunMag);
static double CalcRealMag(double A0g, double sunMag, double phase, double range); static double CalcRealMag(double A0g, double sunMag, double phase, double range);
...@@ -33,5 +35,3 @@ private: ...@@ -33,5 +35,3 @@ private:
bool m_hasData; bool m_hasData;
bool m_hasGeomData; bool m_hasGeomData;
}; };
#endif
This diff is collapsed.
...@@ -48,13 +48,18 @@ OrbBlock::~OrbBlock() ...@@ -48,13 +48,18 @@ OrbBlock::~OrbBlock()
delete m_ip; delete m_ip;
} }
void OrbBlock::interpolate(const TimeJD& beg, const TimeJD& end) void OrbBlock::init_by_orbit()
{ {
m_ip = new XInterpolator(m_orbit, beg, end); m_ip = new XInterpolator(m_orbit, get_beg(), get_end());
}
void OrbBlock::init_by_data()
{
m_ip = new XInterpolator(m_data.get_vecs());
} }
void OrbBlock::load(const jsonval& parent) void OrbBlock::load(const jsonval& parent)
{ {
m_data.load(parent); m_data.load(parent);
} }
...@@ -18,7 +18,8 @@ public: ...@@ -18,7 +18,8 @@ public:
const SInitOrbit& get_orbit() const { return m_orbit; } const SInitOrbit& get_orbit() const { return m_orbit; }
double get_min_distance() const { return get_data().get_min_distance(); } double get_min_distance() const { return get_data().get_min_distance(); }
std::string get_next_orbitid() const { return get_data().get_next_orbitid(); } std::string get_next_orbitid() const { return get_data().get_next_orbitid(); }
void interpolate(const TimeJD& beg, const TimeJD& end); void init_by_orbit();
void init_by_data();
const XInterpolator* get_interpolator() const { return m_ip; } const XInterpolator* get_interpolator() const { return m_ip; }
void load(const jsonval& parent); void load(const jsonval& parent);
const orb_block_data& get_data() const { return m_data; } const orb_block_data& get_data() const { return m_data; }
......
...@@ -33,8 +33,9 @@ void OrbBlocksStore::init( ...@@ -33,8 +33,9 @@ void OrbBlocksStore::init(
if (interpolate) { if (interpolate) {
for (auto& m_block : m_blocks) { for (auto& m_block : m_blocks) {
m_block.interpolate(m_block.get_beg(), m_block.get_end()); m_block.init_by_orbit();
} }
m_initiated = true;
} }
} }
...@@ -49,6 +50,15 @@ void OrbBlocksStore::init( ...@@ -49,6 +50,15 @@ void OrbBlocksStore::init(
init(orbits, &beg, &end, filter_orbits, min_dist_forced, interpolate); init(orbits, &beg, &end, filter_orbits, min_dist_forced, interpolate);
} }
void OrbBlocksStore::init()
{
for (auto& m_block : m_blocks) {
m_block.init_by_data();
}
m_initiated = true;
}
SInitOrbits OrbBlocksStore::filter(const SInitOrbits& orbits) const SInitOrbits OrbBlocksStore::filter(const SInitOrbits& orbits) const
{ {
SInitOrbits result; SInitOrbits result;
...@@ -244,11 +254,11 @@ void OrbBlocksStore::calc_min_dist(const SInitOrbit& orb1, const SInitOrbit& orb ...@@ -244,11 +254,11 @@ void OrbBlocksStore::calc_min_dist(const SInitOrbit& orb1, const SInitOrbit& orb
result_dist = eval.calc(shift); result_dist = eval.calc(shift);
} }
Vect6 OrbBlocksStore::get_pos(const TimeJD& date) const Vect6 OrbBlocksStore::get_pos(const TimeJD& date, const bool tks) const
{ {
for (const auto& block : m_blocks) { for (const auto& block : m_blocks) {
if (date >= block.get_beg() && date <= block.get_end()) { if (date >= block.get_beg() && date <= block.get_end()) {
return block.get_interpolator()->get_pos(date); return block.get_interpolator()->get_pos(date, tks);
} }
} }
...@@ -269,7 +279,7 @@ const SInitOrbit& OrbBlocksStore::get_orbit(const TimeJD& date) const ...@@ -269,7 +279,7 @@ const SInitOrbit& OrbBlocksStore::get_orbit(const TimeJD& date) const
std::vector<orb_block_data> OrbBlocksStore::get_orb_data() const std::vector<orb_block_data> OrbBlocksStore::get_orb_data() const
{ {
std::vector<orb_block_data> result; std::vector<orb_block_data> result;
for(const auto& el: m_blocks) { for (const auto& el : m_blocks) {
result.emplace_back(el.get_data()); result.emplace_back(el.get_data());
} }
return result; return result;
......
...@@ -8,14 +8,14 @@ ...@@ -8,14 +8,14 @@
typedef std::vector<OrbBlock> OrbBlocks; typedef std::vector<OrbBlock> OrbBlocks;
class OrbBlocksStore class OrbBlocksStore {
{
public: 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);
void init();
SInitOrbits calc_orbits(std::vector<TimeJD> dates, bool variates) const; SInitOrbits calc_orbits(std::vector<TimeJD> dates, bool variates) const;
Vect6 get_pos(const TimeJD& date) const; Vect6 get_pos(const TimeJD& date, bool tks = false) 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; }
std::vector<orb_block_data> get_orb_data() const; std::vector<orb_block_data> get_orb_data() const;
...@@ -23,6 +23,7 @@ public: ...@@ -23,6 +23,7 @@ public:
const TimeJD& get_beg_before_filter() const { return m_beg_before_filter; } const TimeJD& get_beg_before_filter() const { return m_beg_before_filter; }
const TimeJD& get_end_before_filter() const { return m_end_before_filter; } const TimeJD& get_end_before_filter() const { return m_end_before_filter; }
void load(const jsonval& parent); void load(const jsonval& parent);
bool is_initiated() const { return m_initiated; }
private: private:
void init_min_dist(const SInitOrbits& orbits, const TimeJD& beg, const TimeJD& end, bool forced); void init_min_dist(const SInitOrbits& orbits, const TimeJD& beg, const TimeJD& end, bool forced);
void calc_min_dist(const SInitOrbit& orb1, const SInitOrbit& orb2, const TimeJD& beg, const TimeJD& end, TimeJD& result_jd, double& result_dist) const; void calc_min_dist(const SInitOrbit& orb1, const SInitOrbit& orb2, const TimeJD& beg, const TimeJD& end, TimeJD& result_jd, double& result_dist) const;
...@@ -30,4 +31,5 @@ private: ...@@ -30,4 +31,5 @@ private:
OrbBlocks m_blocks; OrbBlocks m_blocks;
TimeJD m_beg_before_filter; TimeJD m_beg_before_filter;
TimeJD m_end_before_filter; TimeJD m_end_before_filter;
bool m_initiated{false};
}; };
...@@ -41,4 +41,38 @@ void orb_block_data::load(const jsonval& parent) ...@@ -41,4 +41,38 @@ void orb_block_data::load(const jsonval& parent)
loadjson(parent, "beg", m_beg); loadjson(parent, "beg", m_beg);
loadjson(parent, "end", m_end); loadjson(parent, "end", m_end);
loadjson(parent, "mind_km", m_mind, false); loadjson(parent, "mind_km", m_mind, false);
std::string vecs;
loadjson(parent, "vecs", vecs);
std::vector<std::string> parts;
splitstrf(vecs, parts, ",");
for (size_t i = 0; i < parts.size(); i += 8) {
int days;
Converter::ToNumber(parts[i], days);
double fraction;
Converter::ToNumber(parts[i + 1], fraction);
double x;
Converter::ToNumber(parts[i + 2], x);
double y;
Converter::ToNumber(parts[i + 3], y);
double z;
Converter::ToNumber(parts[i + 4], z);
double vx;
Converter::ToNumber(parts[i + 5], vx);
double vy;
Converter::ToNumber(parts[i + 6], vy);
double vz;
Converter::ToNumber(parts[i + 7], vz);
m_vecs.emplace_back(Vect6(x, y, z, vx, vy, vz), TimeJD(days, fraction), 0, "");
}
} }
...@@ -2,21 +2,22 @@ ...@@ -2,21 +2,22 @@
#include "TM.h" #include "TM.h"
#include "json_functions.h" #include "json_functions.h"
#include "ires.h"
class orb_block_data { class orb_block_data {
public: public:
orb_block_data() = default; orb_block_data() = default;
orb_block_data( orb_block_data(
std::string orbitid, std::string orbitid,
const TimeJD& date, const TimeJD& date,
const TimeJD& beg, const TimeJD& beg,
const TimeJD& end); const TimeJD& end);
orb_block_data( orb_block_data(
std::string orbitid, std::string orbitid,
const TimeJD& date, const TimeJD& date,
const TimeJD& beg, const TimeJD& beg,
const TimeJD& end, const TimeJD& end,
double mind, double mind,
std::string next_orbitid); std::string next_orbitid);
void load(const jsonval& parent); void load(const jsonval& parent);
TimeJD get_date() const { return m_date; } TimeJD get_date() const { return m_date; }
...@@ -25,6 +26,7 @@ public: ...@@ -25,6 +26,7 @@ public:
const std::string& get_orbitid() const { return m_orbitid; } const std::string& get_orbitid() const { return m_orbitid; }
const std::string& get_next_orbitid() const { return m_next_orbitid; } const std::string& get_next_orbitid() const { return m_next_orbitid; }
double get_min_distance() const { return m_mind; } double get_min_distance() const { return m_mind; }
const std::vector<IRes>& get_vecs() const { return m_vecs; }
private: private:
std::string m_orbitid; std::string m_orbitid;
std::string m_next_orbitid; std::string m_next_orbitid;
...@@ -32,5 +34,5 @@ private: ...@@ -32,5 +34,5 @@ private:
TimeJD m_beg; TimeJD m_beg;
TimeJD m_end; TimeJD m_end;
double m_mind; double m_mind;
std::vector<IRes> m_vecs;
}; };
This diff is collapsed.
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