1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.frames;
18
19 import java.io.Serializable;
20
21 import org.hipparchus.CalculusFieldElement;
22 import org.hipparchus.geometry.euclidean.threed.FieldRotation;
23 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
24 import org.hipparchus.geometry.euclidean.threed.Rotation;
25 import org.hipparchus.geometry.euclidean.threed.RotationConvention;
26 import org.hipparchus.geometry.euclidean.threed.Vector3D;
27 import org.orekit.annotation.DefaultDataContext;
28 import org.orekit.data.DataContext;
29 import org.orekit.errors.OrekitException;
30 import org.orekit.errors.OrekitInternalError;
31 import org.orekit.time.AbsoluteDate;
32 import org.orekit.time.FieldAbsoluteDate;
33 import org.orekit.time.TimeScalarFunction;
34 import org.orekit.time.TimeScales;
35 import org.orekit.utils.IERSConventions;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 public class EclipticProvider implements TransformProvider {
53
54
55 private static final long serialVersionUID = 20140516L;
56
57
58 private final IERSConventions conventions;
59
60
61 private final transient TimeScalarFunction obliquity;
62
63
64
65
66
67
68
69
70
71 @DefaultDataContext
72 public EclipticProvider(final IERSConventions conventions) {
73 this(conventions, DataContext.getDefault().getTimeScales());
74 }
75
76
77
78
79
80
81
82 public EclipticProvider(final IERSConventions conventions,
83 final TimeScales timeScales) {
84 this.conventions = conventions;
85 this.obliquity = conventions.getMeanObliquityFunction(timeScales);
86 }
87
88 @Override
89 public Transform getTransform(final AbsoluteDate date) {
90
91 final double epsA = obliquity.value(date);
92 return new Transform(date, new Rotation(Vector3D.MINUS_I, epsA, RotationConvention.VECTOR_OPERATOR));
93 }
94
95 @Override
96 public <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
97
98 final T epsA = obliquity.value(date);
99 return new FieldTransform<>(date, new FieldRotation<>(FieldVector3D.getMinusI(date.getField()),
100 epsA,
101 RotationConvention.VECTOR_OPERATOR));
102 }
103
104
105
106
107
108
109
110 @DefaultDataContext
111 private Object writeReplace() {
112 return new DataTransferObject(conventions);
113 }
114
115
116 @DefaultDataContext
117 private static class DataTransferObject implements Serializable {
118
119
120 private static final long serialVersionUID = 20140516L;
121
122
123 private final IERSConventions conventions;
124
125
126
127
128 DataTransferObject(final IERSConventions conventions) {
129 this.conventions = conventions;
130 }
131
132
133
134
135 private Object readResolve() {
136 try {
137
138 return new EclipticProvider(conventions);
139 } catch (OrekitException oe) {
140 throw new OrekitInternalError(oe);
141 }
142 }
143
144 }
145
146 }