13
13
namespace GeographicLib
14
14
{
15
15
16
- /**
17
- * Gnomonic projection.
16
+ /*
18
17
* <p>
19
18
* <i>Note: Gnomonic.java has been ported to Java from its C++ equivalent
20
19
* Gnomonic.cpp, authored by C. F. F. Karney and licensed under MIT/X11
@@ -136,25 +135,24 @@ namespace GeographicLib
136
135
* </pre>
137
136
*/
138
137
138
+ /// <summary>
139
+ /// Gnomonic projection.
140
+ /// </summary>
139
141
public readonly struct Gnomonic
140
142
{
141
143
private static readonly double eps_ = 0.01 * Math . Sqrt ( GeoMath . Epsilon ) ;
142
144
private const int numit_ = 10 ;
143
145
144
- private readonly Geodesic _earth ;
145
- private readonly double _a , _f ;
146
+ public Geodesic Earth { get ; }
146
147
147
- /**
148
- * Constructor for Gnomonic.
149
- * <p>
150
- * @param earth the {@link Geodesic} object to use for geodesic
151
- * calculations.
152
- */
148
+ /// <summary>
149
+ /// Constructor for Gnomonic.
150
+ /// </summary>
151
+ /// <param name="earth">earth the <see cref="GeographicLib.Geodesic"/> object to use for geodesic calculations
152
+ /// </param>
153
153
public Gnomonic ( Geodesic earth )
154
154
{
155
- _earth = earth ;
156
- _a = _earth . MajorRadius ;
157
- _f = _earth . Flattening ;
155
+ this . Earth = earth ;
158
156
}
159
157
160
158
/**
@@ -181,23 +179,22 @@ public Gnomonic(Geodesic earth)
181
179
*/
182
180
public GnomonicData Forward ( double lat0 , double lon0 , double lat , double lon )
183
181
{
184
- GeodesicData inv =
185
- _earth . Inverse ( lat0 , lon0 , lat , lon ,
186
- GeodesicMask . AZIMUTH | GeodesicMask . GEODESICSCALE |
187
- GeodesicMask . REDUCEDLENGTH ) ;
188
- GnomonicData fwd =
189
- new GnomonicData ( lat0 , lon0 , lat , lon , Double . NaN , Double . NaN ,
190
- inv . azi2 , inv . M12 ) ;
182
+ GeodesicData inv = Earth . Inverse (
183
+ lat0 , lon0 , lat , lon ,
184
+ GeodesicMask . AZIMUTH | GeodesicMask . GEODESICSCALE | GeodesicMask . REDUCEDLENGTH ) ;
191
185
192
186
if ( inv . M12 > 0 )
193
187
{
194
- double rho = inv . m12 / inv . M12 ;
195
- Pair p = GeoMath . Sincosd ( inv . azi1 ) ;
196
- fwd . x = rho * p . First ;
197
- fwd . y = rho * p . Second ;
188
+ var rho = inv . m12 / inv . M12 ;
189
+ var p = GeoMath . Sincosd ( inv . azi1 ) ;
190
+ var x = rho * p . First ;
191
+ var y = rho * p . Second ;
192
+ return new GnomonicData ( lat0 , lon0 , lat , lon , x , y , inv . azi2 , inv . M12 ) ;
193
+ }
194
+ else
195
+ {
196
+ return new GnomonicData ( lat0 , lon0 , lat , lon , Double . NaN , Double . NaN , inv . azi2 , inv . M12 ) ;
198
197
}
199
-
200
- return fwd ;
201
198
}
202
199
203
200
/**
@@ -226,20 +223,19 @@ public GnomonicData Forward(double lat0, double lon0, double lat, double lon)
226
223
*/
227
224
public GnomonicData Reverse ( double lat0 , double lon0 , double x , double y )
228
225
{
229
- GnomonicData rev =
230
- new GnomonicData ( lat0 , lon0 , Double . NaN , Double . NaN , x , y , Double . NaN ,
231
- Double . NaN ) ;
232
226
233
- double azi0 = GeoMath . Atan2d ( x , y ) ;
234
- double rho = GeoMath . Hypot ( x , y ) ;
235
- double s = _a * Math . Atan ( rho / _a ) ;
236
- bool little = rho <= _a ;
227
+ var azi0 = GeoMath . Atan2d ( x , y ) ;
228
+ var rho = GeoMath . Hypot ( x , y ) ;
229
+ var s = this . MajorRadius * Math . Atan ( rho / this . MajorRadius ) ;
230
+ var little = rho <= this . MajorRadius ;
237
231
238
232
if ( ! little )
233
+ {
239
234
rho = 1 / rho ;
235
+ }
240
236
241
- GeodesicLine line =
242
- _earth . Line ( lat0 , lon0 , azi0 , GeodesicMask . LATITUDE
237
+ var line =
238
+ Earth . Line ( lat0 , lon0 , azi0 , GeodesicMask . LATITUDE
243
239
| GeodesicMask . LONGITUDE | GeodesicMask . AZIMUTH
244
240
| GeodesicMask . DISTANCE_IN | GeodesicMask . REDUCEDLENGTH
245
241
| GeodesicMask . GEODESICSCALE ) ;
@@ -249,46 +245,48 @@ public GnomonicData Reverse(double lat0, double lon0, double x, double y)
249
245
250
246
while ( count -- > 0 )
251
247
{
252
- pos =
253
- line . Position ( s , GeodesicMask . LONGITUDE | GeodesicMask . LATITUDE
248
+ pos = line . Position ( s ,
249
+ GeodesicMask . LONGITUDE | GeodesicMask . LATITUDE
254
250
| GeodesicMask . AZIMUTH | GeodesicMask . DISTANCE_IN
255
251
| GeodesicMask . REDUCEDLENGTH
256
252
| GeodesicMask . GEODESICSCALE ) ;
257
253
258
254
if ( trip > 0 )
255
+ {
259
256
break ;
257
+ }
260
258
261
- double ds =
262
- little ? ( ( pos . m12 / pos . M12 ) - rho ) * pos . M12 * pos . M12
263
- : ( rho - ( pos . M12 / pos . m12 ) ) * pos . m12 * pos . m12 ;
259
+ double ds = little ? ( ( pos . m12 / pos . M12 ) - rho ) * pos . M12 * pos . M12
260
+ : ( rho - ( pos . M12 / pos . m12 ) ) * pos . m12 * pos . m12 ;
264
261
s -= ds ;
265
262
266
- if ( Math . Abs ( ds ) <= eps_ * _a )
263
+ if ( Math . Abs ( ds ) <= eps_ * this . MajorRadius )
264
+ {
267
265
trip ++ ;
266
+ }
268
267
}
269
268
270
269
if ( trip == 0 )
271
- return rev ;
272
-
273
- rev . lat = pos . lat2 ;
274
- rev . lon = pos . lon2 ;
275
- rev . azi = pos . azi2 ;
276
- rev . rk = pos . M12 ;
277
-
278
- return rev ;
270
+ {
271
+ return new GnomonicData ( lat0 , lon0 , Double . NaN , Double . NaN , x , y , Double . NaN , Double . NaN ) ;
272
+ }
273
+ else
274
+ {
275
+ return new GnomonicData ( lat0 , lon0 , pos . lat2 , pos . lon2 , x , y , pos . azi2 , pos . M12 ) ;
276
+ }
279
277
}
280
278
281
279
/**
282
280
* @return <i>a</i> the equatorial radius of the ellipsoid (meters). This is
283
281
* the value inherited from the Geodesic object used in the constructor.
284
282
**********************************************************************/
285
- public double MajorRadius => _a ;
283
+ public double MajorRadius => this . Earth . MajorRadius ;
286
284
287
285
/**
288
286
* @return <i>f</i> the flattening of the ellipsoid. This is
289
287
* the value inherited from the Geodesic object used in the constructor.
290
288
**********************************************************************/
291
- public double Flattening => _f ;
289
+ public double Flattening => this . Earth . Flattening ;
292
290
}
293
291
294
292
}
0 commit comments