Class SmoothFieldOfView

    • Constructor Detail

      • SmoothFieldOfView

        protected SmoothFieldOfView​(Vector3D center,
                                    Vector3D primaryMeridian,
                                    double margin)
        Build a new instance.
        Parameters:
        center - direction of the FOV center (Zsmooth), in spacecraft frame
        primaryMeridian - vector defining the (+Xsmooth, Zsmooth) half-plane (it is allowed to have primaryMeridian not orthogonal to center as orthogonality will be fixed internally)
        margin - angular margin to apply to the zone (if positive, the Field Of View will consider points slightly outside of the zone are still visible)
    • Method Detail

      • getCenter

        public Vector3D getCenter()
        Get the direction of the FOV center, in spacecraft frame.
        Returns:
        direction of the FOV center, in spacecraft frame
      • getX

        public Vector3D getX()
        Get the X axis defining FoV boundary.
        Returns:
        X axis defining FoV boundary, in spacecraft frame
      • getY

        public Vector3D getY()
        Get the Y axis defining FoV boundary.
        Returns:
        Y axis defining FoV boundary, in spacecraft frame
      • getZ

        public Vector3D getZ()
        Get the Z axis defining FoV boundary.
        Returns:
        Z axis defining FoV boundary, in spacecraft frame
      • getFootprint

        public List<List<GeodeticPoint>> getFootprint​(Transform fovToBody,
                                                      OneAxisEllipsoid body,
                                                      double angularStep)
        Get the footprint of the Field Of View on ground.

        This method assumes the Field Of View is centered on some carrier, which will typically be a spacecraft or a ground station antenna. The points in the footprint boundary loops are all at altitude zero with respect to the ellipsoid, they correspond either to projection on ground of the edges of the Field Of View, or to points on the body limb if the Field Of View goes past horizon. The points on the limb see the carrier origin at zero elevation. If the Field Of View is so large it contains entirely the body, all points will correspond to points at limb. If the Field Of View looks away from body, the boundary loops will be an empty list. The points within footprint loops are sorted in trigonometric order as seen from the carrier. This implies that someone traveling on ground from one point to the next one will have the points visible from the carrier on his left hand side, and the points not visible from the carrier on his right hand side.

        The truncation of Field Of View at limb can induce strange results for complex Fields Of View. If for example a Field Of View is a ring with a hole and part of the ring goes past horizon, then instead of having a single loop with a C-shaped boundary, the method will still return two loops truncated at the limb, one clockwise and one counterclockwise, hence "closing" the C-shape twice. This behavior is considered acceptable.

        If the carrier is a spacecraft, then the fovToBody transform can be computed from a SpacecraftState as follows:

         Transform inertToBody = state.getFrame().getTransformTo(body.getBodyFrame(), state.getDate());
         Transform fovToBody   = new Transform(state.getDate(),
                                               state.toTransform().getInverse(),
                                               inertToBody);
         

        If the carrier is a ground station, located using a topocentric frame and managing its pointing direction using a transform between the dish frame and the topocentric frame, then the fovToBody transform can be computed as follows:

         Transform topoToBody = topocentricFrame.getTransformTo(body.getBodyFrame(), date);
         Transform topoToDish = ...
         Transform fovToBody  = new Transform(date,
                                              topoToDish.getInverse(),
                                              topoToBody);
         

        Only the raw zone is used, the angular margin is ignored here.

        Parameters:
        fovToBody - transform between the frame in which the Field Of View is defined and body frame.
        body - body surface the Field Of View will be projected on
        angularStep - step used for boundary loops sampling (radians), beware this is generally not an angle on the unit sphere, but rather a phase angle used by the underlying Field Of View boundary model
        Returns:
        list footprint boundary loops (there may be several independent loops if the Field Of View shape is complex)
      • directionAt

        protected abstract Vector3D directionAt​(double angle)
        Get boundary direction at angle.
        Parameters:
        angle - phase angle of the boundary direction
        Returns:
        boundary direction at phase angle in spacecraft frame