コード例 #1
0
    def from_equatorial(equatorial_coo, fixed_frame):
        assert equatorial_coo.body == fixed_frame.body

        r = equatorial_coo.data.xyz
        v = equatorial_coo.data.differentials["s"].d_xyz

        ra, dec, W = fixed_frame.rot_elements_at_epoch(equatorial_coo.obstime)

        icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel(
            equatorial_coo.body.name, time=equatorial_coo.obstime)

        r_trans1 = r - icrs_frame_pos_coord.xyz
        r_trans2 = transform_vector(r_trans1, (90 * u.deg + ra), "z")
        r_f = transform_vector(r_trans2, (90 * u.deg - dec), "x")

        v_trans1 = v - icrs_frame_vel_coord.xyz
        v_trans2 = transform_vector(v_trans1, (90 * u.deg + ra), "z")
        v_f = transform_vector(v_trans2, (90 * u.deg - dec), "x")

        r_f = transform_vector(r_f, W, "z")
        v_f = transform_vector(v_f, W, "z")

        data = CartesianRepresentation(
            r_f, differentials=CartesianDifferential(v_f))
        return fixed_frame.realize_frame(data)
コード例 #2
0
    def to_equatorial(fixed_coo, equatorial_frame):
        # TODO replace w/ something smart (Sun/Earth special cased)
        # assert fixed_coo.body == equatorial_frame.body

        r = fixed_coo.cartesian.xyz

        ra, dec, W = fixed_coo.rot_elements_at_epoch(fixed_coo.obstime)
        equatorial_frame._obstime = fixed_coo.obstime

        r = transform_vector(r, -W, "z")

        r_trans1 = transform_vector(r, -(90 * u.deg - dec), "x")
        r_f = transform_vector(r_trans1, -(90 * u.deg + ra), "z")

        if fixed_coo.data.differentials:
            v = fixed_coo.differentials["s"].d_xyz
            v = transform_vector(v, -W, "z")
            v_trans1 = transform_vector(v, -(90 * u.deg - dec), "x")
            v_f = transform_vector(v_trans1, -(90 * u.deg + ra), "z")

            data = CartesianRepresentation(
                r_f, differentials=CartesianDifferential(v_f))
        else:
            data = CartesianRepresentation(r_f)
        return equatorial_frame.realize_frame(data)
コード例 #3
0
    def to_equatorial(fixed_coo, equatorial_frame):
        assert fixed_coo.body == equatorial_frame.body

        r = fixed_coo.data.xyz
        v = fixed_coo.data.differentials["s"].d_xyz

        ra, dec, W = fixed_coo.rot_elements_at_epoch(fixed_coo.obstime)

        r = transform_vector(r, -W, "z")
        v = transform_vector(v, -W, "z")

        r_trans1 = transform_vector(r, -(90 * u.deg - dec), "x")
        r_trans2 = transform_vector(r_trans1, -(90 * u.deg + ra), "z")

        v_trans1 = transform_vector(v, -(90 * u.deg - dec), "x")
        v_trans2 = transform_vector(v_trans1, -(90 * u.deg + ra), "z")

        icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel(
            fixed_coo.body.name, time=fixed_coo.obstime)

        r_f = icrs_frame_pos_coord.xyz + r_trans2
        v_f = icrs_frame_vel_coord.xyz + v_trans2

        data = CartesianRepresentation(
            r_f, differentials=CartesianDifferential(v_f))
        return equatorial_frame.realize_frame(data)
コード例 #4
0
ファイル: coordinates.py プロジェクト: portmariner/poliastro
def body_centered_to_icrs(r,
                          v,
                          source_body,
                          epoch=J2000,
                          rotate_meridian=False):
    """Converts position and velocity body-centered frame to ICRS.

    Parameters
    ----------
    r : ~astropy.units.Quantity
        Position vector in a body-centered reference frame.
    v : ~astropy.units.Quantity
        Velocity vector in a body-centered reference frame.
    source_body : Body
        Source body.
    epoch : ~astropy.time.Time, optional
        Epoch, default to J2000.
    rotate_meridian : bool, optional
        Whether to apply the rotation of the meridian too, default to False.

    Returns
    -------
    r, v : tuple (~astropy.units.Quantity)
        Position and velocity vectors in ICRS.


    """

    ra, dec, W = source_body.rot_elements_at_epoch(epoch)
    if rotate_meridian:
        r = transform_vector(r, -W, 'z')
        v = transform_vector(v, -W, 'z')

    r_trans1 = transform_vector(r, -(90 * u.deg - dec), 'x')
    r_trans2 = transform_vector(r_trans1, -(90 * u.deg + ra), 'z')

    v_trans1 = transform_vector(v, -(90 * u.deg - dec), 'x')
    v_trans2 = transform_vector(v_trans1, -(90 * u.deg + ra), 'z')

    icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel(
        source_body.name, time=epoch)

    r_f = icrs_frame_pos_coord.xyz + r_trans2
    v_f = icrs_frame_vel_coord.xyz + v_trans2

    return r_f.to(r.unit), v_f.to(v.unit)
コード例 #5
0
ファイル: coordinates.py プロジェクト: portmariner/poliastro
def icrs_to_body_centered(r,
                          v,
                          target_body,
                          epoch=J2000,
                          rotate_meridian=False):
    """Converts position and velocity in ICRS to body-centered frame.

    Parameters
    ----------
    r : ~astropy.units.Quantity
        Position vector in ICRS.
    v : ~astropy.units.Quantity
        Velocity vector in ICRS.
    target_body : Body
        Target body.
    epoch : ~astropy.time.Time, optional
        Epoch, default to J2000.
    rotate_meridian : bool, optional
        Whether to apply the rotation of the meridian too, default to False.

    Returns
    -------
    r, v : tuple (~astropy.units.Quantity)
        Position and velocity vectors in a body-centered reference frame.

    """

    ra, dec, W = target_body.rot_elements_at_epoch(epoch)

    icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel(
        target_body.name, time=epoch)

    r_trans1 = r - icrs_frame_pos_coord.xyz
    r_trans2 = transform_vector(r_trans1, (90 * u.deg + ra), 'z')
    r_f = transform_vector(r_trans2, (90 * u.deg - dec), 'x')

    v_trans1 = v - icrs_frame_vel_coord.xyz
    v_trans2 = transform_vector(v_trans1, (90 * u.deg + ra), 'z')
    v_f = transform_vector(v_trans2, (90 * u.deg - dec), 'x')

    if rotate_meridian:
        r_f = transform_vector(r_f, W, 'z')
        v_f = transform_vector(v_f, W, 'z')

    return r_f.to(r.unit), v_f.to(v.unit)
コード例 #6
0
ファイル: coordinates.py プロジェクト: aarribas/poliastro
def body_centered_to_icrs(r, v, source_body, epoch=J2000, rotate_meridian=False):
    """Converts position and velocity body-centered frame to ICRS.

    Parameters
    ----------
    r : ~astropy.units.Quantity
        Position vector in a body-centered reference frame.
    v : ~astropy.units.Quantity
        Velocity vector in a body-centered reference frame.
    source_body : Body
        Source body.
    epoch : ~astropy.time.Time, optional
        Epoch, default to J2000.
    rotate_meridian : bool, optional
        Whether to apply the rotation of the meridian too, default to False.

    Returns
    -------
    r, v : tuple (~astropy.units.Quantity)
        Position and velocity vectors in ICRS.


    """

    ra, dec, W = source_body.rot_elements_at_epoch(epoch)
    if rotate_meridian:
        r = transform_vector(r, -W, 'z')
        v = transform_vector(v, -W, 'z')

    r_trans1 = transform_vector(r, -(90 * u.deg - dec), 'x')
    r_trans2 = transform_vector(r_trans1, -(90 * u.deg + ra), 'z')

    v_trans1 = transform_vector(v, -(90 * u.deg - dec), 'x')
    v_trans2 = transform_vector(v_trans1, -(90 * u.deg + ra), 'z')

    icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel(source_body.name, time=epoch)

    r_f = icrs_frame_pos_coord.xyz + r_trans2
    v_f = icrs_frame_vel_coord.xyz + v_trans2

    return r_f.to(r.unit), v_f.to(v.unit)
コード例 #7
0
ファイル: coordinates.py プロジェクト: aarribas/poliastro
def icrs_to_body_centered(r, v, target_body, epoch=J2000, rotate_meridian=False):
    """Converts position and velocity in ICRS to body-centered frame.

    Parameters
    ----------
    r : ~astropy.units.Quantity
        Position vector in ICRS.
    v : ~astropy.units.Quantity
        Velocity vector in ICRS.
    target_body : Body
        Target body.
    epoch : ~astropy.time.Time, optional
        Epoch, default to J2000.
    rotate_meridian : bool, optional
        Whether to apply the rotation of the meridian too, default to False.

    Returns
    -------
    r, v : tuple (~astropy.units.Quantity)
        Position and velocity vectors in a body-centered reference frame.

    """

    ra, dec, W = target_body.rot_elements_at_epoch(epoch)

    icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel(target_body.name, time=epoch)

    r_trans1 = r - icrs_frame_pos_coord.xyz
    r_trans2 = transform_vector(r_trans1, (90 * u.deg + ra), 'z')
    r_f = transform_vector(r_trans2, (90 * u.deg - dec), 'x')

    v_trans1 = v - icrs_frame_vel_coord.xyz
    v_trans2 = transform_vector(v_trans1, (90 * u.deg + ra), 'z')
    v_f = transform_vector(v_trans2, (90 * u.deg - dec), 'x')

    if rotate_meridian:
        r_f = transform_vector(r_f, W, 'z')
        v_f = transform_vector(v_f, W, 'z')

    return r_f.to(r.unit), v_f.to(v.unit)