Skip to content

File RadialInTrackCrossTrack.hpp

File List > astrea > astro > astro > frames > instances > RadialInTrackCrossTrack.hpp

Go to the documentation of this file

#pragma once

#include <astro/astro.fwd.hpp>
#include <astro/frames/CartesianVector.hpp>
#include <astro/frames/instances/body_centered_inertial_frames.hpp>
#include <astro/frames/types/DirectionCosineMatrix.hpp>
#include <astro/frames/types/DynamicFrame.hpp>
#include <astro/time/Date.hpp>

namespace astrea {
namespace astro {
namespace frames {

class RadialInTrackCrossTrack : public DynamicFrame<RadialInTrackCrossTrack, FrameAxis::RIC> {

    friend DynamicFrame<RadialInTrackCrossTrack, FrameAxis::RIC>;

  public:
    RadialInTrackCrossTrack() = delete; 

    RadialInTrackCrossTrack(const FrameReference* parent) :
        DynamicFrame<RadialInTrackCrossTrack, FrameAxis::RIC>(parent)
    {
    }

    ~RadialInTrackCrossTrack() = default;

    DirectionCosineMatrix<frames::earth::icrf, RadialInTrackCrossTrack> get_dcm(const Date& date) const
    {
        const auto r       = get_inertial_position(date).unit();
        const auto v       = get_inertial_velocity(date).unit();
        const auto h       = r.cross(v).unit();
        const auto inTrack = (-r.cross(h)).unit();
        return DirectionCosineMatrix<frames::earth::icrf, RadialInTrackCrossTrack>::from_vectors(r, inTrack, h);
    }

  private:
    RadialInTrackCrossTrack(const RadiusVector<frames::earth::icrf>& position, const VelocityVector<frames::earth::icrf>& velocity) :
        DynamicFrame<RadialInTrackCrossTrack, FrameAxis::RIC>(position, velocity)
    {
    }
};

namespace dynamic {
using ric = RadialInTrackCrossTrack;
} // namespace dynamic

} // namespace frames
} // namespace astro
} // namespace astrea