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 final Frame frame;
36
37
38 private final CelestialBody primaryBody;
39
40
41 private final CelestialBody secondaryBody;
42
43
44
45
46
47
48 TwoBodiesBaryTransformProvider(final CelestialBody primaryBody, final CelestialBody secondaryBody) {
49 this.primaryBody = primaryBody;
50 this.secondaryBody = secondaryBody;
51 this.frame = primaryBody.getInertiallyOrientedFrame();
52 }
53
54
55 @Override
56 public Transform getTransform(final AbsoluteDate date) {
57 final PVCoordinates pv21 = secondaryBody.getPVCoordinates(date, frame);
58 final double massRatio = secondaryBody.getGM() / (primaryBody.getGM() + secondaryBody.getGM());
59 final Vector3D translation = pv21.getPosition().scalarMultiply(massRatio).negate();
60 return new Transform(date, translation);
61 }
62
63
64 @Override
65 public <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
66 final FieldPVCoordinates<T> pv21 = secondaryBody.getPVCoordinates(date, frame);
67 final double massRatio = secondaryBody.getGM() / (primaryBody.getGM() + secondaryBody.getGM());
68 final FieldVector3D<T> translation = pv21.getPosition().scalarMultiply(massRatio).negate();
69 return new FieldTransform<>(date, translation);
70 }
71 }