1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.orekit.utils;
19
20 import org.hipparchus.CalculusFieldElement;
21 import org.hipparchus.Field;
22 import org.hipparchus.analysis.differentiation.FieldUnivariateDerivative2;
23 import org.hipparchus.analysis.differentiation.UnivariateDerivative1;
24 import org.hipparchus.analysis.differentiation.UnivariateDerivative1Field;
25 import org.hipparchus.analysis.differentiation.UnivariateDerivative2;
26 import org.hipparchus.analysis.differentiation.UnivariateDerivative2Field;
27 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
28 import org.hipparchus.geometry.euclidean.threed.Vector3D;
29 import org.orekit.frames.Frame;
30 import org.orekit.time.AbsoluteDate;
31 import org.orekit.time.FieldAbsoluteDate;
32
33
34
35
36
37
38
39 public interface ExtendedPositionProvider extends PVCoordinatesProvider {
40
41
42
43
44
45
46
47 <T extends CalculusFieldElement<T>> FieldVector3D<T> getPosition(FieldAbsoluteDate<T> date, Frame frame);
48
49
50 @Override
51 default Vector3D getVelocity(final AbsoluteDate date, final Frame frame) {
52 final UnivariateDerivative1Field ud1Field = UnivariateDerivative1Field.getInstance();
53 final UnivariateDerivative1 ud1Shift = new UnivariateDerivative1(0., 1.);
54 final FieldAbsoluteDate<UnivariateDerivative1> fieldDate = new FieldAbsoluteDate<>(ud1Field, date).shiftedBy(ud1Shift);
55 final FieldVector3D<UnivariateDerivative1> ud1Position = getPosition(fieldDate, frame);
56 return new Vector3D(ud1Position.getX().getFirstDerivative(), ud1Position.getY().getFirstDerivative(),
57 ud1Position.getZ().getFirstDerivative());
58 }
59
60
61 @Override
62 default TimeStampedPVCoordinates getPVCoordinates(final AbsoluteDate date, final Frame frame) {
63 final UnivariateDerivative2Field ud2Field = UnivariateDerivative2Field.getInstance();
64 final UnivariateDerivative2 ud2Shift = new UnivariateDerivative2(0., 1., 0.);
65 final FieldAbsoluteDate<UnivariateDerivative2> fieldDate = new FieldAbsoluteDate<>(ud2Field, date).shiftedBy(ud2Shift);
66 final FieldVector3D<UnivariateDerivative2> ud2Position = getPosition(fieldDate, frame);
67 final Vector3D position = ud2Position.toVector3D();
68 final Vector3D velocity = new Vector3D(ud2Position.getX().getFirstDerivative(), ud2Position.getY().getFirstDerivative(),
69 ud2Position.getZ().getFirstDerivative());
70 final Vector3D acceleration = new Vector3D(ud2Position.getX().getSecondDerivative(), ud2Position.getY().getSecondDerivative(),
71 ud2Position.getZ().getSecondDerivative());
72 return new TimeStampedPVCoordinates(date, new PVCoordinates(position, velocity, acceleration));
73 }
74
75
76
77
78
79
80
81 default <T extends CalculusFieldElement<T>> TimeStampedFieldPVCoordinates<T> getPVCoordinates(final FieldAbsoluteDate<T> date,
82 final Frame frame) {
83 final FieldAbsoluteDate<FieldUnivariateDerivative2<T>> fud2Date = date.toFUD2Field();
84 final FieldVector3D<FieldUnivariateDerivative2<T>> fud2Position = getPosition(fud2Date, frame);
85 final FieldVector3D<T> position = new FieldVector3D<>(fud2Position.getX().getValue(), fud2Position.getY().getValue(),
86 fud2Position.getZ().getValue());
87 final FieldVector3D<T> velocity = new FieldVector3D<>(fud2Position.getX().getFirstDerivative(), fud2Position.getY().getFirstDerivative(),
88 fud2Position.getZ().getFirstDerivative());
89 final FieldVector3D<T> acceleration = new FieldVector3D<>(fud2Position.getX().getSecondDerivative(), fud2Position.getY().getSecondDerivative(),
90 fud2Position.getZ().getSecondDerivative());
91 return new TimeStampedFieldPVCoordinates<>(date, position, velocity, acceleration);
92 }
93
94
95
96
97
98
99 default <T extends CalculusFieldElement<T>> FieldPVCoordinatesProvider<T> toFieldPVCoordinatesProvider(final Field<T> field) {
100 return new FieldPVCoordinatesProvider<T>() {
101
102 @Override
103 public FieldVector3D<T> getPosition(final FieldAbsoluteDate<T> date, final Frame frame) {
104 return ExtendedPositionProvider.this.getPosition(date, frame);
105 }
106
107 @Override
108 public TimeStampedFieldPVCoordinates<T> getPVCoordinates(final FieldAbsoluteDate<T> date,
109 final Frame frame) {
110 return ExtendedPositionProvider.this.getPVCoordinates(date, frame);
111 }
112 };
113 }
114
115
116
117
118
119
120
121 @Deprecated
122 default ExtendedPVCoordinatesProvider toExtendedPVCoordinatesProvider() {
123 return ExtendedPositionProvider.this::getPVCoordinates;
124 }
125 }