@@ -210,21 +210,21 @@ public sealed class Geodesic
210
210
/**
211
211
* The order of the expansions used by Geodesic.
212
212
**********************************************************************/
213
- internal static readonly int GEOGRAPHICLIB_GEODESIC_ORDER = 6 ;
214
-
215
- internal static readonly int nA1_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
216
- internal static readonly int nC1_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
217
- internal static readonly int nC1p_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
218
- internal static readonly int nA2_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
219
- internal static readonly int nC2_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
220
- internal static readonly int nA3_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
221
- internal static readonly int nA3x_ = nA3_ ;
222
- internal static readonly int nC3_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
223
- internal static readonly int nC3x_ = ( nC3_ * ( nC3_ - 1 ) ) / 2 ;
224
- internal static readonly int nC4_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
225
- internal static readonly int nC4x_ = ( nC4_ * ( nC4_ + 1 ) ) / 2 ;
226
- private static readonly int maxit1_ = 20 ;
227
- private static readonly int maxit2_ = maxit1_ + GeoMath . Digits + 10 ;
213
+ internal const int GEOGRAPHICLIB_GEODESIC_ORDER = 6 ;
214
+
215
+ internal const int nA1_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
216
+ internal const int nC1_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
217
+ internal const int nC1p_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
218
+ internal const int nA2_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
219
+ internal const int nC2_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
220
+ internal const int nA3_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
221
+ internal const int nA3x_ = nA3_ ;
222
+ internal const int nC3_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
223
+ internal const int nC3x_ = ( nC3_ * ( nC3_ - 1 ) ) / 2 ;
224
+ internal const int nC4_ = GEOGRAPHICLIB_GEODESIC_ORDER ;
225
+ internal const int nC4x_ = ( nC4_ * ( nC4_ + 1 ) ) / 2 ;
226
+ private const int maxit1_ = 20 ;
227
+ private const int maxit2_ = maxit1_ + GeoMath . Digits + 10 ;
228
228
229
229
// Underflow guard. We require
230
230
// tiny_ * epsilon() > 0
@@ -638,22 +638,18 @@ public GeodesicData Inverse(double lat1, double lon1,
638
638
639
639
internal struct InverseData
640
640
{
641
- internal GeodesicData g ;
642
- internal double salp1 , calp1 , salp2 , calp2 ;
641
+ private GeodesicData _g ;
643
642
644
- [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
645
- private void Init ( )
646
- {
647
- g = new GeodesicData ( ) ;
648
- salp1 = calp1 = salp2 = calp2 = Double . NaN ;
649
- }
643
+ internal GeodesicData Geodesic => _g ;
644
+ internal double salp1 , calp1 , salp2 , calp2 ;
650
645
651
646
internal static InverseData NaN
652
647
{
653
648
get
654
649
{
655
650
var self = new InverseData ( ) ;
656
- self . Init ( ) ;
651
+ self . _g = GeodesicData . NaN ;
652
+ self . salp1 = self . calp1 = self . salp2 = self . calp2 = Double . NaN ;
657
653
return self ;
658
654
}
659
655
}
@@ -663,11 +659,11 @@ private InverseData InverseInt(double lat1, double lon1,
663
659
double lat2 , double lon2 , int outmask )
664
660
{
665
661
InverseData result = InverseData . NaN ;
666
- GeodesicData r = result . g ;
667
662
// Compute longitude difference (AngDiff does this carefully). Result is
668
663
// in [-180, 180] but -180 is only for west-going geodesics. 180 is for
669
664
// east-going and meridional geodesics.
670
- r . lat1 = lat1 = GeoMath . LatFix ( lat1 ) ; r . lat2 = lat2 = GeoMath . LatFix ( lat2 ) ;
665
+ result . Geodesic . lat1 = lat1 = GeoMath . LatFix ( lat1 ) ;
666
+ result . Geodesic . lat2 = lat2 = GeoMath . LatFix ( lat2 ) ;
671
667
// If really close to the equator, treat as on equator.
672
668
lat1 = GeoMath . AngRound ( lat1 ) ;
673
669
lat2 = GeoMath . AngRound ( lat2 ) ;
@@ -678,11 +674,13 @@ private InverseData InverseInt(double lat1, double lon1,
678
674
}
679
675
if ( ( outmask & GeodesicMask . LONG_UNROLL ) != 0 )
680
676
{
681
- r . lon1 = lon1 ; r . lon2 = ( lon1 + lon12 ) + lon12s ;
677
+ result . Geodesic . lon1 = lon1 ;
678
+ result . Geodesic . lon2 = ( lon1 + lon12 ) + lon12s ;
682
679
}
683
680
else
684
681
{
685
- r . lon1 = GeoMath . AngNormalize ( lon1 ) ; r . lon2 = GeoMath . AngNormalize ( lon2 ) ;
682
+ result . Geodesic . lon1 = GeoMath . AngNormalize ( lon1 ) ;
683
+ result . Geodesic . lon2 = GeoMath . AngNormalize ( lon2 ) ;
686
684
}
687
685
// Make longitude difference positive.
688
686
int lonsign = lon12 >= 0 ? 1 : - 1 ;
@@ -798,7 +796,8 @@ private InverseData InverseInt(double lat1, double lon1,
798
796
s12x = v . s12b ; m12x = v . m12b ;
799
797
if ( ( outmask & GeodesicMask . GEODESICSCALE ) != 0 )
800
798
{
801
- r . M12 = v . M12 ; r . M21 = v . M21 ;
799
+ result . Geodesic . M12 = v . M12 ;
800
+ result . Geodesic . M21 = v . M21 ;
802
801
}
803
802
}
804
803
// Add the check for sig12 since zero length geodesics might yield m12 <
@@ -835,7 +834,7 @@ private InverseData InverseInt(double lat1, double lon1,
835
834
sig12 = omg12 = lam12 / _f1 ;
836
835
m12x = _b * Math . Sin ( sig12 ) ;
837
836
if ( ( outmask & GeodesicMask . GEODESICSCALE ) != 0 )
838
- r . M12 = r . M21 = Math . Cos ( sig12 ) ;
837
+ result . Geodesic . M12 = result . Geodesic . M21 = Math . Cos ( sig12 ) ;
839
838
a12 = lon12 / _f1 ;
840
839
841
840
}
@@ -864,7 +863,7 @@ private InverseData InverseInt(double lat1, double lon1,
864
863
s12x = sig12 * _b * dnm ;
865
864
m12x = GeoMath . Sq ( dnm ) * _b * Math . Sin ( sig12 / dnm ) ;
866
865
if ( ( outmask & GeodesicMask . GEODESICSCALE ) != 0 )
867
- r . M12 = r . M21 = Math . Cos ( sig12 / dnm ) ;
866
+ result . Geodesic . M12 = result . Geodesic . M21 = Math . Cos ( sig12 / dnm ) ;
868
867
a12 = GeoMath . ToDegrees ( sig12 ) ;
869
868
omg12 = lam12 / ( _f1 * dnm ) ;
870
869
}
@@ -966,7 +965,8 @@ private InverseData InverseInt(double lat1, double lon1,
966
965
s12x = v . s12b ; m12x = v . m12b ;
967
966
if ( ( outmask & GeodesicMask . GEODESICSCALE ) != 0 )
968
967
{
969
- r . M12 = v . M12 ; r . M21 = v . M21 ;
968
+ result . Geodesic . M12 = v . M12 ;
969
+ result . Geodesic . M21 = v . M21 ;
970
970
}
971
971
}
972
972
m12x *= _b ;
@@ -983,10 +983,10 @@ private InverseData InverseInt(double lat1, double lon1,
983
983
}
984
984
985
985
if ( ( outmask & GeodesicMask . DISTANCE ) != 0 )
986
- r . s12 = 0 + s12x ; // Convert -0 to 0
986
+ result . Geodesic . s12 = 0 + s12x ; // Convert -0 to 0
987
987
988
988
if ( ( outmask & GeodesicMask . REDUCEDLENGTH ) != 0 )
989
- r . m12 = 0 + m12x ; // Convert -0 to 0
989
+ result . Geodesic . m12 = 0 + m12x ; // Convert -0 to 0
990
990
991
991
if ( ( outmask & GeodesicMask . AREA ) != 0 )
992
992
{
@@ -1015,14 +1015,13 @@ private InverseData InverseInt(double lat1, double lon1,
1015
1015
}
1016
1016
double [ ] C4a = new double [ nC4_ ] ;
1017
1017
C4f ( eps , C4a ) ;
1018
- double
1019
- B41 = SinCosSeries ( false , ssig1 , csig1 , C4a ) ,
1018
+ double B41 = SinCosSeries ( false , ssig1 , csig1 , C4a ) ,
1020
1019
B42 = SinCosSeries ( false , ssig2 , csig2 , C4a ) ;
1021
- r . S12 = A4 * ( B42 - B41 ) ;
1020
+ result . Geodesic . S12 = A4 * ( B42 - B41 ) ;
1022
1021
}
1023
1022
else
1024
1023
// Avoid problems with indeterminate sig1, sig2 on equator
1025
- r . S12 = 0 ;
1024
+ result . Geodesic . S12 = 0 ;
1026
1025
1027
1026
if ( ! meridian && somg12 > 1 )
1028
1027
{
@@ -1058,10 +1057,10 @@ private InverseData InverseInt(double lat1, double lon1,
1058
1057
}
1059
1058
alp12 = Math . Atan2 ( salp12 , calp12 ) ;
1060
1059
}
1061
- r . S12 += _c2 * alp12 ;
1062
- r . S12 *= swapp * lonsign * latsign ;
1060
+ result . Geodesic . S12 += _c2 * alp12 ;
1061
+ result . Geodesic . S12 *= swapp * lonsign * latsign ;
1063
1062
// Convert -0 to 0
1064
- r . S12 += 0 ;
1063
+ result . Geodesic . S12 += 0 ;
1065
1064
}
1066
1065
1067
1066
// Convert calp, salp to azimuth accounting for lonsign, swapp, latsign.
@@ -1070,16 +1069,22 @@ private InverseData InverseInt(double lat1, double lon1,
1070
1069
{ double t = salp1 ; salp1 = salp2 ; salp2 = t ; }
1071
1070
{ double t = calp1 ; calp1 = calp2 ; calp2 = t ; }
1072
1071
if ( ( outmask & GeodesicMask . GEODESICSCALE ) != 0 )
1073
- { double t = r . M12 ; r . M12 = r . M21 ; r . M21 = t ; }
1072
+ {
1073
+ double t = result . Geodesic . M12 ;
1074
+ result . Geodesic . M12 = result . Geodesic . M21 ;
1075
+ result . Geodesic . M21 = t ;
1076
+ }
1074
1077
}
1075
1078
1076
1079
salp1 *= swapp * lonsign ; calp1 *= swapp * latsign ;
1077
1080
salp2 *= swapp * lonsign ; calp2 *= swapp * latsign ;
1078
1081
1079
1082
// Returned value in [0, 180]
1080
- r . a12 = a12 ;
1081
- result . salp1 = salp1 ; result . calp1 = calp1 ;
1082
- result . salp2 = salp2 ; result . calp2 = calp2 ;
1083
+ result . Geodesic . a12 = a12 ;
1084
+ result . salp1 = salp1 ;
1085
+ result . calp1 = calp1 ;
1086
+ result . salp2 = salp2 ;
1087
+ result . calp2 = calp2 ;
1083
1088
return result ;
1084
1089
}
1085
1090
@@ -1130,7 +1135,7 @@ public GeodesicData Inverse(double lat1, double lon1,
1130
1135
{
1131
1136
outmask &= GeodesicMask . OUT_MASK ;
1132
1137
InverseData result = InverseInt ( lat1 , lon1 , lat2 , lon2 , outmask ) ;
1133
- GeodesicData r = result . g ;
1138
+ GeodesicData r = result . Geodesic ;
1134
1139
if ( ( outmask & GeodesicMask . AZIMUTH ) != 0 )
1135
1140
{
1136
1141
r . azi1 = GeoMath . Atan2d ( result . salp1 , result . calp1 ) ;
@@ -1186,7 +1191,7 @@ public GeodesicLine InverseLine(double lat1, double lon1,
1186
1191
{
1187
1192
InverseData result = InverseInt ( lat1 , lon1 , lat2 , lon2 , 0 ) ;
1188
1193
double salp1 = result . salp1 , calp1 = result . calp1 ,
1189
- azi1 = GeoMath . Atan2d ( salp1 , calp1 ) , a12 = result . g . a12 ;
1194
+ azi1 = GeoMath . Atan2d ( salp1 , calp1 ) , a12 = result . Geodesic . a12 ;
1190
1195
// Ensure that a12 can be converted to a distance
1191
1196
if ( ( caps & ( GeodesicMask . OUT_MASK & GeodesicMask . DISTANCE_IN ) ) != 0 )
1192
1197
caps |= GeodesicMask . DISTANCE ;
0 commit comments