1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.models.earth.ionosphere.nequick;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.util.FastMath;
21 import org.orekit.bodies.FieldGeodeticPoint;
22
23
24
25
26
27 class FieldSegment<T extends CalculusFieldElement<T>> {
28
29
30 private static final double THRESHOLD = 1.0e-3;
31
32
33 private final FieldRay<T> ray;
34
35
36 private final T y;
37
38
39 private final T g;
40
41
42 private final T deltaN;
43
44
45 private final int nbPoints;
46
47
48
49
50
51
52
53
54
55 FieldSegment(final int n, final FieldRay<T> ray, final T s1, final T s2) {
56
57 this.ray = ray;
58
59
60 deltaN = s2.subtract(s1).divide(n);
61
62
63 g = deltaN.multiply(0.5773502691896);
64
65
66 y = s1.add(deltaN.subtract(g).multiply(0.5));
67
68 nbPoints = 2 * n;
69
70 }
71
72
73
74
75
76
77 public FieldGeodeticPoint<T> getPoint(final int index) {
78
79 final int p = index / 2;
80 final T s = y.add(deltaN.multiply(p)).add(g.multiply(index % 2));
81
82
83 final T height = FastMath.sqrt(s.multiply(s).add(ray.getRadius().multiply(ray.getRadius()))).
84 subtract(NeQuickModel.RE);
85
86 if (ray.getRadius().getReal() < THRESHOLD) {
87
88 return new FieldGeodeticPoint<>(ray.getLatitude(), ray.getLongitude(), height);
89 } else {
90
91 final T tanDs = s.divide(ray.getRadius());
92 final T cosDs = FastMath.sqrt(tanDs.multiply(tanDs).add(1.0)).reciprocal();
93 final T sinDs = tanDs.multiply(cosDs);
94
95
96 final T sinLatS =
97 ray.getScLat().sin().multiply(cosDs).add(ray.getScLat().cos().multiply(sinDs).multiply(ray.getCosineAz()));
98 final T cosLatS = FastMath.sqrt(sinLatS.multiply(sinLatS).negate().add(1.0));
99
100
101 final T sinLonS = sinDs.multiply(ray.getSineAz()).multiply(ray.getScLat().cos());
102 final T cosLonS = cosDs.subtract(ray.getScLat().sin().multiply(sinLatS));
103
104 return new FieldGeodeticPoint<>(FastMath.atan2(sinLatS, cosLatS),
105 FastMath.atan2(sinLonS, cosLonS).add(ray.getLongitude()),
106 height);
107
108 }
109 }
110
111
112
113
114
115
116
117
118 public int getNbPoints() {
119 return nbPoints;
120 }
121
122
123
124
125
126
127 public T getInterval() {
128 return deltaN;
129 }
130
131 }