Class SmoothFieldOfView
- java.lang.Object
-
- org.orekit.geometry.fov.AbstractFieldOfView
-
- org.orekit.geometry.fov.SmoothFieldOfView
-
- All Implemented Interfaces:
FieldOfView
- Direct Known Subclasses:
CircularFieldOfView
,EllipticalFieldOfView
public abstract class SmoothFieldOfView extends AbstractFieldOfView
Class representing a spacecraft sensor Field Of View with shape defined by a smooth single loop.- Since:
- 10.1
- Author:
- Luc Maisonobe
-
-
Constructor Summary
Constructors Modifier Constructor Description protected
SmoothFieldOfView(Vector3D center, Vector3D primaryMeridian, double margin)
Build a new instance.
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected abstract Vector3D
directionAt(double angle)
Get boundary direction at angle.Vector3D
getCenter()
Get the direction of the FOV center, in spacecraft frame.List<List<GeodeticPoint>>
getFootprint(Transform fovToBody, OneAxisEllipsoid body, double angularStep)
Get the footprint of the Field Of View on ground.Vector3D
getX()
Get the X axis defining FoV boundary.Vector3D
getY()
Get the Y axis defining FoV boundary.Vector3D
getZ()
Get the Z axis defining FoV boundary.-
Methods inherited from class org.orekit.geometry.fov.AbstractFieldOfView
getMargin
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.orekit.geometry.fov.FieldOfView
offsetFromBoundary, projectToBoundary
-
-
-
-
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 frameprimaryMeridian
- vector defining the (+Xsmooth, Zsmooth) half-plane (it is allowed to haveprimaryMeridian
not orthogonal tocenter
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 aSpacecraftState
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 onangularStep
- 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
-
-