1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.frames;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.analysis.differentiation.FieldUnivariateDerivative1;
21 import org.hipparchus.analysis.differentiation.FieldUnivariateDerivative2;
22 import org.hipparchus.analysis.differentiation.UnivariateDerivative1;
23 import org.hipparchus.analysis.differentiation.UnivariateDerivative1Field;
24 import org.hipparchus.analysis.differentiation.UnivariateDerivative2;
25 import org.hipparchus.analysis.differentiation.UnivariateDerivative2Field;
26 import org.hipparchus.geometry.euclidean.threed.FieldRotation;
27 import org.hipparchus.util.Binary64;
28 import org.hipparchus.util.Binary64Field;
29 import org.orekit.time.AbsoluteDate;
30 import org.orekit.time.FieldAbsoluteDate;
31 import org.orekit.utils.AngularCoordinates;
32 import org.orekit.utils.FieldAngularCoordinates;
33
34
35
36
37
38
39 interface FieldBasedTransformProvider extends TransformProvider {
40
41
42 @Override
43 default Transform getTransform(final AbsoluteDate date) {
44
45
46 final UnivariateDerivative2Field field = UnivariateDerivative2Field.getInstance();
47 final UnivariateDerivative2 dt = new UnivariateDerivative2(0, 1, 0);
48 final FieldAbsoluteDate<UnivariateDerivative2> ud2Date =
49 new FieldAbsoluteDate<>(field, date).shiftedBy(dt);
50
51
52 return new Transform(date, new AngularCoordinates(getRotation(ud2Date)));
53
54 }
55
56
57 @Override
58 default KinematicTransform getKinematicTransform(final AbsoluteDate date) {
59
60
61 final UnivariateDerivative1Field field = UnivariateDerivative1Field.getInstance();
62 final UnivariateDerivative1 dt = new UnivariateDerivative1(0, 1);
63 final FieldAbsoluteDate<UnivariateDerivative1> ud1Date =
64 new FieldAbsoluteDate<>(field, date).shiftedBy(dt);
65 final AngularCoordinates derivatives = new AngularCoordinates(getRotation(ud1Date));
66
67
68 return KinematicTransform.of(date, derivatives.getRotation(), derivatives.getRotationRate());
69
70 }
71
72
73 @Override
74 default StaticTransform getStaticTransform(final AbsoluteDate date) {
75 final FieldAbsoluteDate<Binary64> fieldDate = new FieldAbsoluteDate<>(Binary64Field.getInstance(), date);
76 return StaticTransform.of(date, getRotation(fieldDate).toRotation());
77 }
78
79
80 @Override
81 default <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
82
83
84 final FieldRotation<T> rotation = getRotation(date);
85
86
87 final FieldAbsoluteDate<FieldUnivariateDerivative2<T>> fud2Date = date.toFUD2Field();
88 final FieldAngularCoordinates<T> derivatives = new FieldAngularCoordinates<>(getRotation(fud2Date));
89
90
91 return new FieldTransform<>(date,
92 new FieldAngularCoordinates<>(rotation,
93 derivatives.getRotationRate(),
94 derivatives.getRotationAcceleration()));
95
96 }
97
98
99 @Override
100 default <T extends CalculusFieldElement<T>> FieldKinematicTransform<T> getKinematicTransform(final FieldAbsoluteDate<T> date) {
101
102
103 final FieldRotation<T> rotation = getRotation(date);
104
105
106 final FieldAbsoluteDate<FieldUnivariateDerivative1<T>> fud1Date = date.toFUD1Field();
107 final FieldAngularCoordinates<T> derivatives = new FieldAngularCoordinates<>(getRotation(fud1Date));
108
109
110 return FieldKinematicTransform.of(date, rotation, derivatives.getRotationRate());
111
112 }
113
114
115 @Override
116 default <T extends CalculusFieldElement<T>> FieldStaticTransform<T> getStaticTransform(final FieldAbsoluteDate<T> date) {
117 return FieldStaticTransform.of(date, getRotation(date));
118 }
119
120
121
122
123
124
125 <T extends CalculusFieldElement<T>> FieldRotation<T> getRotation(FieldAbsoluteDate<T> date);
126
127 }