public class OneAxisEllipsoid extends Ellipsoid implements BodyShape
One-axis ellipsoids is a good approximate model for most planet-size and larger natural bodies. It is the equilibrium shape reached by a fluid body under its own gravity field when it rotates. The symmetry axis is the rotation or polar axis.
Constructor and Description |
---|
OneAxisEllipsoid(double ae,
double f,
Frame bodyFrame)
Simple constructor.
|
Modifier and Type | Method and Description |
---|---|
<T extends org.hipparchus.CalculusFieldElement<T>> |
azimuthBetweenPoints(FieldGeodeticPoint<T> origin,
FieldGeodeticPoint<T> destination)
Compute the azimuth angle from local north between the two points.
|
double |
azimuthBetweenPoints(GeodeticPoint origin,
GeodeticPoint destination)
Compute the azimuth angle from local north between the two points.
|
double |
geodeticToIsometricLatitude(double geodeticLatitude)
Compute the isometric latitude
corresponding to the provided latitude.
|
<T extends org.hipparchus.CalculusFieldElement<T>> |
geodeticToIsometricLatitude(T geodeticLatitude)
Compute the isometric latitude
corresponding to the provided latitude.
|
Frame |
getBodyFrame()
Get body frame related to body shape.
|
<T extends org.hipparchus.CalculusFieldElement<T>> |
getCartesianIntersectionPoint(org.hipparchus.geometry.euclidean.threed.FieldLine<T> line,
org.hipparchus.geometry.euclidean.threed.FieldVector3D<T> close,
Frame frame,
FieldAbsoluteDate<T> date)
Get the intersection point of a line with the surface of the body.
|
org.hipparchus.geometry.euclidean.threed.Vector3D |
getCartesianIntersectionPoint(org.hipparchus.geometry.euclidean.threed.Line line,
org.hipparchus.geometry.euclidean.threed.Vector3D close,
Frame frame,
AbsoluteDate date)
Get the intersection point of a line with the surface of the body.
|
double |
getEccentricity()
Get the first eccentricity of the ellipsoid: e = sqrt(f * (2.0 - f)).
|
double |
getEccentricitySquared()
Get the first eccentricity squared of the ellipsoid: e^2 = f * (2.0 - f).
|
double |
getEquatorialRadius()
Get the equatorial radius of the body.
|
double |
getFlattening()
Get the flattening of the body: f = (a-b)/a.
|
<T extends org.hipparchus.CalculusFieldElement<T>> |
getIntersectionPoint(org.hipparchus.geometry.euclidean.threed.FieldLine<T> line,
org.hipparchus.geometry.euclidean.threed.FieldVector3D<T> close,
Frame frame,
FieldAbsoluteDate<T> date)
Get the intersection point of a line with the surface of the body.
|
GeodeticPoint |
getIntersectionPoint(org.hipparchus.geometry.euclidean.threed.Line line,
org.hipparchus.geometry.euclidean.threed.Vector3D close,
Frame frame,
AbsoluteDate date)
Get the intersection point of a line with the surface of the body.
|
<T extends org.hipparchus.CalculusFieldElement<T>> |
lowestAltitudeIntermediate(org.hipparchus.geometry.euclidean.threed.FieldVector3D<T> endpoint1,
org.hipparchus.geometry.euclidean.threed.FieldVector3D<T> endpoint2)
Find intermediate point of lowest altitude along a line between two endpoints.
|
GeodeticPoint |
lowestAltitudeIntermediate(org.hipparchus.geometry.euclidean.threed.Vector3D endpoint1,
org.hipparchus.geometry.euclidean.threed.Vector3D endpoint2)
Find intermediate point of lowest altitude along a line between two endpoints.
|
TimeStampedPVCoordinates |
projectToGround(TimeStampedPVCoordinates pv,
Frame frame)
Project a moving point to the ground.
|
org.hipparchus.geometry.euclidean.threed.Vector3D |
projectToGround(org.hipparchus.geometry.euclidean.threed.Vector3D point,
AbsoluteDate date,
Frame frame)
Project a point to the ground.
|
void |
setAngularThreshold(double angularThreshold)
Set the angular convergence threshold.
|
<T extends org.hipparchus.CalculusFieldElement<T>> |
transform(FieldGeodeticPoint<T> point)
Transform a surface-relative point to a Cartesian point.
|
<T extends org.hipparchus.CalculusFieldElement<T>> |
transform(org.hipparchus.geometry.euclidean.threed.FieldVector3D<T> point,
Frame frame,
FieldAbsoluteDate<T> date)
Transform a Cartesian point to a surface-relative point.
|
org.hipparchus.geometry.euclidean.threed.Vector3D |
transform(GeodeticPoint point)
Transform a surface-relative point to a Cartesian point.
|
FieldGeodeticPoint<org.hipparchus.analysis.differentiation.DerivativeStructure> |
transform(PVCoordinates point,
Frame frame,
AbsoluteDate date)
Transform a Cartesian point to a surface-relative point.
|
GeodeticPoint |
transform(org.hipparchus.geometry.euclidean.threed.Vector3D point,
Frame frame,
AbsoluteDate date)
Transform a Cartesian point to a surface-relative point.
|
getA, getB, getC, getFrame, getPlaneSection, getPlaneSection, isInside, isInside, pointOnLimb, pointOnLimb
public OneAxisEllipsoid(double ae, double f, Frame bodyFrame)
Standard values for Earth models can be found in the Constants
class:
ae
- equatorial radiusf
- the flattening (f = (a-b)/a)bodyFrame
- body frame related to body shapeFramesFactory.getITRF(org.orekit.utils.IERSConventions, boolean)
public void setAngularThreshold(double angularThreshold)
The angular threshold is used both to identify points close to
the ellipse axes and as the convergence threshold used to
stop the iterations in the transform(Vector3D, Frame,
AbsoluteDate)
method.
If this method is not called, the default value is set to 10-12.
angularThreshold
- angular convergence threshold (rad)public double getEquatorialRadius()
public double getFlattening()
public double getEccentricitySquared()
public double getEccentricity()
public Frame getBodyFrame()
getBodyFrame
in interface BodyShape
public org.hipparchus.geometry.euclidean.threed.Vector3D getCartesianIntersectionPoint(org.hipparchus.geometry.euclidean.threed.Line line, org.hipparchus.geometry.euclidean.threed.Vector3D close, Frame frame, AbsoluteDate date)
A line may have several intersection points with a closed surface (we consider the one point case as a degenerated two points case). The close parameter is used to select which of these points should be returned. The selected point is the one that is closest to the close point.
line
- test line (may intersect the body or not)close
- point used for intersections selectionframe
- frame in which line is expresseddate
- date of the line in given framepublic GeodeticPoint getIntersectionPoint(org.hipparchus.geometry.euclidean.threed.Line line, org.hipparchus.geometry.euclidean.threed.Vector3D close, Frame frame, AbsoluteDate date)
A line may have several intersection points with a closed surface (we consider the one point case as a degenerated two points case). The close parameter is used to select which of these points should be returned. The selected point is the one that is closest to the close point.
getIntersectionPoint
in interface BodyShape
line
- test line (may intersect the body or not)close
- point used for intersections selectionframe
- frame in which line is expresseddate
- date of the line in given framepublic <T extends org.hipparchus.CalculusFieldElement<T>> org.hipparchus.geometry.euclidean.threed.FieldVector3D<T> getCartesianIntersectionPoint(org.hipparchus.geometry.euclidean.threed.FieldLine<T> line, org.hipparchus.geometry.euclidean.threed.FieldVector3D<T> close, Frame frame, FieldAbsoluteDate<T> date)
A line may have several intersection points with a closed surface (we consider the one point case as a degenerated two points case). The close parameter is used to select which of these points should be returned. The selected point is the one that is closest to the close point.
T
- type of the field elementsline
- test line (may intersect the body or not)close
- point used for intersections selectionframe
- frame in which line is expresseddate
- date of the line in given framepublic <T extends org.hipparchus.CalculusFieldElement<T>> FieldGeodeticPoint<T> getIntersectionPoint(org.hipparchus.geometry.euclidean.threed.FieldLine<T> line, org.hipparchus.geometry.euclidean.threed.FieldVector3D<T> close, Frame frame, FieldAbsoluteDate<T> date)
A line may have several intersection points with a closed surface (we consider the one point case as a degenerated two points case). The close parameter is used to select which of these points should be returned. The selected point is the one that is closest to the close point.
getIntersectionPoint
in interface BodyShape
T
- type of the field elementsline
- test line (may intersect the body or not)close
- point used for intersections selectionframe
- frame in which line is expresseddate
- date of the line in given framepublic org.hipparchus.geometry.euclidean.threed.Vector3D transform(GeodeticPoint point)
public <T extends org.hipparchus.CalculusFieldElement<T>> org.hipparchus.geometry.euclidean.threed.FieldVector3D<T> transform(FieldGeodeticPoint<T> point)
public org.hipparchus.geometry.euclidean.threed.Vector3D projectToGround(org.hipparchus.geometry.euclidean.threed.Vector3D point, AbsoluteDate date, Frame frame)
projectToGround
in interface BodyShape
point
- point to projectdate
- current dateframe
- frame in which moving point is expressedBodyShape.projectToGround(TimeStampedPVCoordinates, Frame)
public TimeStampedPVCoordinates projectToGround(TimeStampedPVCoordinates pv, Frame frame)
projectToGround
in interface BodyShape
pv
- moving pointframe
- frame in which moving point is expressedBodyShape.projectToGround(Vector3D, AbsoluteDate, Frame)
public GeodeticPoint transform(org.hipparchus.geometry.euclidean.threed.Vector3D point, Frame frame, AbsoluteDate date)
This method is based on Toshio Fukushima's algorithm which uses Halley's method. transformation from Cartesian to Geodetic Coordinates Accelerated by Halley's Method, Toshio Fukushima, Journal of Geodesy 9(12):689-693, February 2006
Some changes have been added to the original method:
In some rare cases (for example very flat ellipsoid, or points close to ellipsoid center), the loop
may fail to converge. As this seems to happen only in degenerate cases, a design choice was to return
an approximate point corresponding to last iteration. This point may be incorrect and fail to give the
initial point back if doing roundtrip by calling transform(GeodeticPoint)
. This design choice
was made to avoid NaNs appearing for example in inter-satellites visibility checks when two satellites
are almost on opposite sides of Earth. The intermediate points far within the Earth should not prevent
the detection algorithm to find visibility start/end.
public <T extends org.hipparchus.CalculusFieldElement<T>> FieldGeodeticPoint<T> transform(org.hipparchus.geometry.euclidean.threed.FieldVector3D<T> point, Frame frame, FieldAbsoluteDate<T> date)
This method is based on Toshio Fukushima's algorithm which uses Halley's method. transformation from Cartesian to Geodetic Coordinates Accelerated by Halley's Method, Toshio Fukushima, Journal of Geodesy 9(12):689-693, February 2006
Some changes have been added to the original method:
In some rare cases (for example very flat ellipsoid, or points close to ellipsoid center), the loop
may fail to converge. As this seems to happen only in degenerate cases, a design choice was to return
an approximate point corresponding to last iteration. This point may be incorrect and fail to give the
initial point back if doing roundtrip by calling transform(GeodeticPoint)
. This design choice
was made to avoid NaNs appearing for example in inter-satellites visibility checks when two satellites
are almost on opposite sides of Earth. The intermediate points far within the Earth should not prevent
the detection algorithm to find visibility start/end.
transform
in interface BodyShape
T
- type of the filed elementspoint
- Cartesian pointframe
- frame in which Cartesian point is expresseddate
- date of the computation (used for frames conversions)public FieldGeodeticPoint<org.hipparchus.analysis.differentiation.DerivativeStructure> transform(PVCoordinates point, Frame frame, AbsoluteDate date)
point
- Cartesian pointframe
- frame in which Cartesian point is expresseddate
- date of the computation (used for frames conversions)public double azimuthBetweenPoints(GeodeticPoint origin, GeodeticPoint destination)
origin
- the origin point, at which the azimuth angle will be computed (non-null
)destination
- the destination point, to which the angle is defined (non-null
)[0-2pi)
)public <T extends org.hipparchus.CalculusFieldElement<T>> T azimuthBetweenPoints(FieldGeodeticPoint<T> origin, FieldGeodeticPoint<T> destination)
T
- the type of field elementsorigin
- the origin point, at which the azimuth angle will be computed (non-null
)destination
- the destination point, to which the angle is defined (non-null
)[0-2pi)
)public double geodeticToIsometricLatitude(double geodeticLatitude)
geodeticLatitude
- the latitude (radians, within interval [-pi/2, +pi/2]
)public <T extends org.hipparchus.CalculusFieldElement<T>> T geodeticToIsometricLatitude(T geodeticLatitude)
T
- the type of field elementsgeodeticLatitude
- the latitude (radians, within interval [-pi/2, +pi/2]
)public GeodeticPoint lowestAltitudeIntermediate(org.hipparchus.geometry.euclidean.threed.Vector3D endpoint1, org.hipparchus.geometry.euclidean.threed.Vector3D endpoint2)
endpoint1
- first endpoint, in body frameendpoint2
- second endpoint, in body frameendpoint1
and endpoint2
.public <T extends org.hipparchus.CalculusFieldElement<T>> FieldGeodeticPoint<T> lowestAltitudeIntermediate(org.hipparchus.geometry.euclidean.threed.FieldVector3D<T> endpoint1, org.hipparchus.geometry.euclidean.threed.FieldVector3D<T> endpoint2)
T
- type of the field elementsendpoint1
- first endpoint, in body frameendpoint2
- second endpoint, in body frameendpoint1
and endpoint2
.Copyright © 2002-2023 CS GROUP. All rights reserved.