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.geometry.euclidean.threed.FieldVector3D;
21 import org.hipparchus.geometry.euclidean.threed.Vector3D;
22 import org.orekit.bodies.CelestialBody;
23 import org.orekit.time.AbsoluteDate;
24 import org.orekit.time.FieldAbsoluteDate;
25 import org.orekit.utils.FieldPVCoordinates;
26 import org.orekit.utils.PVCoordinates;
27
28
29
30
31
32 class TwoBodiesBaryTransformProvider implements TransformProvider {
33
34
35 private static final long serialVersionUID = 20190726L;
36
37
38 private final Frame frame;
39
40
41 private final CelestialBody primaryBody;
42
43
44 private final CelestialBody secondaryBody;
45
46
47
48
49
50
51 TwoBodiesBaryTransformProvider(final CelestialBody primaryBody, final CelestialBody secondaryBody) {
52 this.primaryBody = primaryBody;
53 this.secondaryBody = secondaryBody;
54 this.frame = primaryBody.getInertiallyOrientedFrame();
55 }
56
57
58 @Override
59 public Transform getTransform(final AbsoluteDate date) {
60 final PVCoordinates pv21 = secondaryBody.getPVCoordinates(date, frame);
61 final double massRatio = secondaryBody.getGM() / (primaryBody.getGM() + secondaryBody.getGM());
62 final Vector3D translation = pv21.getPosition().scalarMultiply(massRatio).negate();
63 return new Transform(date, translation);
64 }
65
66
67 @Override
68 public <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
69 final FieldPVCoordinates<T> pv21 = secondaryBody.getPVCoordinates(date, frame);
70 final double massRatio = secondaryBody.getGM() / (primaryBody.getGM() + secondaryBody.getGM());
71 final FieldVector3D<T> translation = pv21.getPosition().scalarMultiply(massRatio).negate();
72 return new FieldTransform<>(date, translation);
73 }
74 }