Skip to content

File Equinoctial.hpp

File List > astrea > astro > astro > state > orbital_elements > instances > Equinoctial.hpp

Go to the documentation of this file

#pragma once

#include <iosfwd>

#include <units/units.hpp>

#include <astro/astro.fwd.hpp>
#include <astro/types/typedefs.hpp>

namespace astrea {
namespace astro {

class Equinoctial {

    friend std::ostream& operator<<(std::ostream&, Equinoctial const&);
    friend class OrbitalElements;

  public:
    Equinoctial(Unitless scale = 0.0 * astrea::detail::unitless) :
        _semilatus(scale * astrea::detail::distance_unit),
        _f(scale * astrea::detail::unitless),
        _g(scale * astrea::detail::unitless),
        _h(scale * astrea::detail::unitless),
        _k(scale * astrea::detail::unitless),
        _trueLongitude(scale * astrea::detail::angle_unit)
    {
    }

    Equinoctial(const Distance& semilatus, const Unitless& f, const Unitless& g, const Unitless& h, const Unitless& k, const Angle& trueLongitude) :
        _semilatus(semilatus),
        _f(f),
        _g(g),
        _h(h),
        _k(k),
        _trueLongitude(trueLongitude)
    {
    }

    Equinoctial(const Equinoctial& elements, const GravParam& mu) :
        Equinoctial(elements)
    {
    }

    Equinoctial(const Keplerian& elements, const GravParam& mu);

    Equinoctial(const Cartesian& elements, const GravParam& mu);

    Equinoctial(const OrbitalElements& elements, const GravParam& mu);

    static Equinoctial LEO(const GravParam& mu);

    static Equinoctial LMEO(const GravParam& mu);

    static Equinoctial GPS(const GravParam& mu);

    static Equinoctial HMEO(const GravParam& mu);

    static Equinoctial GEO(const GravParam& mu);

    Equinoctial(const Equinoctial&);

    Equinoctial(Equinoctial&& other) noexcept;

    Equinoctial& operator=(Equinoctial&& other) noexcept;

    Equinoctial& operator=(const Equinoctial& other);

    ~Equinoctial() = default;

    bool operator==(const Equinoctial& other) const;

    bool operator!=(const Equinoctial& other) const;

    Equinoctial operator+(const Equinoctial& other) const;

    Equinoctial& operator+=(const Equinoctial& other);

    Equinoctial operator-(const Equinoctial& other) const;

    Equinoctial& operator-=(const Equinoctial& other);

    Equinoctial operator*(const Unitless& multiplier) const;

    Equinoctial& operator*=(const Unitless& multiplier);

    EquinoctialPartial operator/(const Time& time) const;

    Equinoctial operator/(const Unitless& divisor) const;

    Equinoctial& operator/=(const Unitless& divisor);

    const Distance& get_semilatus() const { return _semilatus; }

    const Unitless& get_f() const { return _f; }

    const Unitless& get_g() const { return _g; }

    const Unitless& get_h() const { return _h; }

    const Unitless& get_k() const { return _k; }

    const Angle& get_true_longitude() const { return _trueLongitude; }

    std::vector<Unitless> force_to_vector() const;

    Equinoctial interpolate(const Time& thisTime, const Time& otherTime, const Equinoctial& other, const GravParam& mu, const Time& targetTime) const;

  private:
    Distance _semilatus;  
    Unitless _f;          
    Unitless _g;          
    Unitless _h;          
    Unitless _k;          
    Angle _trueLongitude; 

    static Equinoctial from_vector(const std::vector<Unitless>& vec);
};

class EquinoctialPartial {

    friend std::ostream& operator<<(std::ostream&, EquinoctialPartial const&);

  public:
    EquinoctialPartial() = default;

    EquinoctialPartial(
        const Velocity& semilatusPartial,
        const UnitlessPerTime& fPartial,
        const UnitlessPerTime& gPartial,
        const UnitlessPerTime& hPartial,
        const UnitlessPerTime& kPartial,
        const AngularRate& trueLongitudePartial
    ) :
        _semilatusPartial(semilatusPartial),
        _fPartial(fPartial),
        _gPartial(gPartial),
        _hPartial(hPartial),
        _kPartial(kPartial),
        _trueLongitudePartial(trueLongitudePartial)
    {
    }

    Equinoctial operator*(const Time& time) const;

    std::vector<Unitless> force_to_vector() const;

  private:
    Velocity _semilatusPartial;        
    UnitlessPerTime _fPartial;         
    UnitlessPerTime _gPartial;         
    UnitlessPerTime _hPartial;         
    UnitlessPerTime _kPartial;         
    AngularRate _trueLongitudePartial; 
};

} // namespace astro
} // namespace astrea