Пример #1
0
 def __init__(self,
              rotation=None,
              inclination=0.0,
              ascending_node=0.0,
              right_asc=None,
              right_asc_unit=units.Deg,
              declination=None,
              declination_unit=units.Deg,
              frame=None):
     Rotation.__init__(self, frame)
     if rotation is None:
         if right_asc is None:
             self.inclination = inclination * math.pi / 180
             self.ascending_node = ascending_node * math.pi / 180
             inclination_quat = LQuaterniond()
             inclination_quat.setFromAxisAngleRad(self.inclination,
                                                  LVector3d.unitX())
             ascending_node_quat = LQuaterniond()
             ascending_node_quat.setFromAxisAngleRad(
                 self.ascending_node, LVector3d.unitZ())
             rotation = inclination_quat * ascending_node_quat
         else:
             right_asc = right_asc * right_asc_unit
             declination = declination * declination_unit
             self.inclination = math.pi / 2 - declination
             self.ascending_node = right_asc + math.pi / 2
             inclination_quat = LQuaterniond()
             inclination_quat.setFromAxisAngleRad(self.inclination,
                                                  LVector3d.unitX())
             ascending_node_quat = LQuaterniond()
             ascending_node_quat.setFromAxisAngleRad(
                 self.ascending_node, LVector3d.unitZ())
             rotation = inclination_quat * ascending_node_quat
     self.axis_rotation = rotation
     self.rotation = LQuaterniond()
Пример #2
0
 def __init__(self,
              position=None,
              right_asc=0.0,
              right_asc_unit=units.Deg,
              declination=0.0,
              declination_unit=units.Deg,
              distance=0.0,
              distance_unit=units.Ly,
              frame=None):
     Orbit.__init__(self, frame)
     if position is None:
         self.right_asc = right_asc * right_asc_unit
         self.declination = declination * declination_unit
         distance = distance * distance_unit
     else:
         self.right_asc = None
         self.declination = None
         if not isinstance(position, LPoint3d):
             position = LPoint3d(*position)
     if position is None:
         inclination = pi / 2 - self.declination
         ascending_node = self.right_asc + pi / 2
         inclination_quat = LQuaterniond()
         inclination_quat.setFromAxisAngleRad(inclination,
                                              LVector3d.unitX())
         ascending_node_quat = LQuaterniond()
         ascending_node_quat.setFromAxisAngleRad(ascending_node,
                                                 LVector3d.unitZ())
         self.orientation = inclination_quat * ascending_node_quat * J2000EquatorialReferenceFrame.orientation
         position = self.orientation.xform(LVector3d(0, 0, distance))
     self.global_position = position
     self.position = LPoint3d()
     self.rotation = LQuaterniond()
Пример #3
0
class J2000EquatorialReferenceFrame(BodyReferenceFrame):
    orientation = LQuaterniond()
    orientation.setFromAxisAngleRad(-units.J2000_Obliquity / 180.0 * pi,
                                    LVector3d.unitX())

    def get_orientation(self):
        return self.orientation
Пример #4
0
    def __init__(self,
                 body=None,
                 right_asc=0.0,
                 right_asc_unit=units.Deg,
                 declination=0.0,
                 declination_unit=units.Deg,
                 longitude_at_node=0.0,
                 longitude_at_nod_units=units.Deg):
        RelativeReferenceFrame.__init__(self, body)
        self.right_asc = right_asc * right_asc_unit
        self.declination = declination * declination_unit
        self.longitude_at_node = longitude_at_node * longitude_at_nod_units

        inclination = pi / 2 - self.declination
        ascending_node = self.right_asc + pi / 2

        inclination_quat = LQuaterniond()
        inclination_quat.setFromAxisAngleRad(inclination, LVector3d.unitX())
        ascending_node_quat = LQuaterniond()
        ascending_node_quat.setFromAxisAngleRad(ascending_node,
                                                LVector3d.unitZ())
        longitude_quad = LQuaterniond()
        longitude_quad.setFromAxisAngleRad(self.longitude_at_node,
                                           LVector3d.unitZ())
        self.orientation = longitude_quad * inclination_quat * ascending_node_quat * J2000EquatorialReferenceFrame.orientation
Пример #5
0
def calc_orientation_from_incl_an(inclination, ascending_node, flipped=False):
    inclination_quat = LQuaterniond()
    if flipped:
        inclination += pi
    inclination_quat.setFromAxisAngleRad(inclination, LVector3d.unitX())
    ascending_node_quat = LQuaterniond()
    ascending_node_quat.setFromAxisAngleRad(ascending_node, LVector3d.unitZ())
    return inclination_quat * ascending_node_quat
Пример #6
0
 def update_rotation(self):
     inclination_quat = LQuaterniond()
     inclination_quat.setFromAxisAngleRad(self.inclination,
                                          LVector3d.unitX())
     arg_of_periapsis_quat = LQuaterniond()
     arg_of_periapsis_quat.setFromAxisAngleRad(self.arg_of_periapsis,
                                               LVector3d.unitZ())
     ascending_node_quat = LQuaterniond()
     ascending_node_quat.setFromAxisAngleRad(self.ascending_node,
                                             LVector3d.unitZ())
     self.rotation = arg_of_periapsis_quat * inclination_quat * ascending_node_quat
Пример #7
0
 def __init__(self,
              radius,
              radius_units=units.AU,
              radial_speed=None,
              period=None,
              period_units=units.JYear,
              inclination=0,
              ascending_node=0.0,
              arg_of_periapsis=None,
              long_of_pericenter=None,
              mean_anomaly=None,
              mean_longitude=0.0,
              epoch=units.J2000,
              frame=None):
     Orbit.__init__(self, frame)
     self.radius = radius * radius_units
     if radial_speed is None:
         if period is None:
             self.mean_motion = 0.0
             self.period = 0.0
         else:
             self.period = period * period_units
             self.mean_motion = 2 * pi / self.period
     else:
         self.mean_motion = radial_speed
         self.period = 2 * pi / self.mean_motion / period_units
     if arg_of_periapsis is None:
         if long_of_pericenter is None:
             arg_of_periapsis = 0.0
         else:
             arg_of_periapsis = long_of_pericenter - ascending_node
     if inclination == 0.0:
         #Ascending node is undefined if there is no inclination
         ascending_node = 0.0
     if mean_anomaly is None:
         mean_anomaly = mean_longitude - (arg_of_periapsis + ascending_node)
     self.inclination = inclination * pi / 180
     self.ascending_node = ascending_node * pi / 180
     self.arg_of_periapsis = arg_of_periapsis * pi / 180
     self.mean_anomaly = mean_anomaly * pi / 180
     self.epoch = epoch
     inclination_quat = LQuaterniond()
     inclination_quat.setFromAxisAngleRad(self.inclination,
                                          LVector3d.unitX())
     arg_of_periapsis_quat = LQuaterniond()
     arg_of_periapsis_quat.setFromAxisAngleRad(self.arg_of_periapsis,
                                               LVector3d.unitZ())
     ascending_node_quat = LQuaterniond()
     ascending_node_quat.setFromAxisAngleRad(self.ascending_node,
                                             LVector3d.unitZ())
     #self.rotation = ascending_node_quat * inclination_quat * arg_of_periapsis_quat
     self.rotation = arg_of_periapsis_quat * inclination_quat * ascending_node_quat
Пример #8
0
 def __init__(self,
              right_asc=0.0,
              right_asc_unit=units.Deg,
              declination=0.0,
              declination_unit=units.Deg,
              frame=None):
     Orbit.__init__(self, frame)
     self.right_asc = right_asc * right_asc_unit
     self.declination = declination * declination_unit
     inclination = pi / 2 - self.declination
     ascending_node = self.right_asc + pi / 2
     inclination_quat = LQuaterniond()
     inclination_quat.setFromAxisAngleRad(inclination, LVector3d.unitX())
     ascending_node_quat = LQuaterniond()
     ascending_node_quat.setFromAxisAngleRad(ascending_node,
                                             LVector3d.unitZ())
     self.orientation = inclination_quat * ascending_node_quat * J2000EquatorialReferenceFrame.orientation
     self.position = LPoint3d()
     self.rotation = LQuaterniond()