1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.events;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.analysis.differentiation.FieldUnivariateDerivative1;
21 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22 import org.orekit.propagation.FieldSpacecraftState;
23 import org.orekit.propagation.events.handlers.FieldEventHandler;
24 import org.orekit.time.FieldAbsoluteDate;
25 import org.orekit.utils.ExtendedPositionProvider;
26 import org.orekit.utils.FieldPVCoordinates;
27
28
29
30
31
32
33 public class FieldExtremumAngularSeparationDetector<T extends CalculusFieldElement<T>>
34 extends FieldAbstractDetector<FieldExtremumAngularSeparationDetector<T>, T> {
35
36
37 private final ExtendedPositionProvider beacon;
38
39
40 private final ExtendedPositionProvider observer;
41
42
43
44
45
46
47
48
49 public FieldExtremumAngularSeparationDetector(final FieldEventDetectionSettings<T> detectionSettings,
50 final FieldEventHandler<T> handler,
51 final ExtendedPositionProvider beacon,
52 final ExtendedPositionProvider observer) {
53 super(detectionSettings, handler);
54 this.beacon = beacon;
55 this.observer = observer;
56 }
57
58
59 @Override
60 protected FieldExtremumAngularSeparationDetector<T> create(final FieldEventDetectionSettings<T> detectionSettings,
61 final FieldEventHandler<T> newHandler) {
62 return new FieldExtremumAngularSeparationDetector<>(detectionSettings, newHandler, beacon, observer);
63 }
64
65
66
67
68 public ExtendedPositionProvider getBeacon() {
69 return beacon;
70 }
71
72
73
74
75 public ExtendedPositionProvider getObserver() {
76 return observer;
77 }
78
79 @Override
80 public T g(final FieldSpacecraftState<T> s) {
81 final FieldPVCoordinates<FieldUnivariateDerivative1<T>> pv = s.getPVCoordinates().toUnivariateDerivative1PV();
82 final FieldAbsoluteDate<FieldUnivariateDerivative1<T>> fieldDate = s.getDate().toFUD1Field();
83 final FieldVector3D<FieldUnivariateDerivative1<T>> bP = beacon.getPosition(fieldDate, s.getFrame());
84 final FieldVector3D<FieldUnivariateDerivative1<T>> oP = observer.getPosition(fieldDate, s.getFrame());
85 final FieldUnivariateDerivative1<T> separation = FieldVector3D.angle(pv.getPosition().subtract(oP), bP.subtract(oP));
86 return separation.getFirstDerivative();
87 }
88
89 }