@@ -12,21 +12,26 @@ public static class ReverseGeostationaryProjection
1212{
1313 private const double RadiusPolarSquared = RadiusPolar * RadiusPolar ;
1414 private const double RadiusEquatorSquared = RadiusEquator * RadiusEquator ;
15+
16+ // Pre-computed constant to avoid division in hot path
17+ private const double RadiusRatio = RadiusEquatorSquared / RadiusPolarSquared ;
1518
16- [ MethodImpl ( MethodImplOptions . AggressiveOptimization ) ]
19+ [ MethodImpl ( MethodImplOptions . AggressiveOptimization | MethodImplOptions . AggressiveInlining ) ]
1720 public static VerticalScanningCalculations VerticalScanningCalculations ( double scanningY , double satelliteHeight )
1821 {
19- var calculations = new VerticalScanningCalculations
22+ var cosY = Cos ( scanningY ) ;
23+ var sinY = Sin ( scanningY ) ;
24+ var adjustedHeight = satelliteHeight + RadiusEquator ;
25+
26+ // Calculate directly instead of multiple property assignments
27+ return new VerticalScanningCalculations
2028 {
21- CosY = Cos ( scanningY ) ,
22- SinY = Sin ( scanningY ) ,
23- SatelliteHeight = satelliteHeight + RadiusEquator
29+ CosY = cosY ,
30+ SinY = sinY ,
31+ SatelliteHeight = adjustedHeight ,
32+ C = adjustedHeight * adjustedHeight - RadiusEquatorSquared ,
33+ T = cosY * cosY + RadiusRatio * sinY * sinY
2434 } ;
25-
26- calculations . C = calculations . SatelliteHeight * calculations . SatelliteHeight - RadiusEquatorSquared ;
27- calculations . T = calculations . CosY * calculations . CosY + RadiusEquatorSquared / RadiusPolarSquared * calculations . SinY * calculations . SinY ;
28-
29- return calculations ;
3035 }
3136
3237 /// <summary>
@@ -41,7 +46,8 @@ public static VerticalScanningCalculations VerticalScanningCalculations(double s
4146 /// <param name="definition">satellite definition</param>
4247 /// <param name="latitude">calculated latitude in radians</param>
4348 /// <param name="longitude">calculated longitude in radians</param>
44- public static void ToLatitudeLongitude ( double scanningX , double scanningY , double satelliteLongitude , double satelliteHeight , out double latitude , out double longitude )
49+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
50+ public static void ToLatitudeLongitude ( double scanningX , double scanningY , double satelliteLongitude , double satelliteHeight , out double latitude , out double longitude )
4551 {
4652 var verticalCalculations = VerticalScanningCalculations ( scanningY , satelliteHeight ) ;
4753 ToLatitudeLongitude ( scanningX , verticalCalculations , satelliteLongitude , out latitude , out longitude ) ;
@@ -55,31 +61,42 @@ public static void ToLatitudeLongitude(double scanningX, double scanningY, doubl
5561 /// <param name="satelliteLongitude">satellite longitude</param>
5662 /// <param name="latitude">calculated latitude in radians</param>
5763 /// <param name="longitude">calculated longitude in radians</param>
58- [ MethodImpl ( MethodImplOptions . AggressiveOptimization ) ]
64+ [ MethodImpl ( MethodImplOptions . AggressiveOptimization | MethodImplOptions . AggressiveInlining ) ]
5965 public static void ToLatitudeLongitude (
60- double scanningX , VerticalScanningCalculations verticalScanningCalculations , double satelliteLongitude , out double latitude , out double longitude )
66+ double scanningX , VerticalScanningCalculations verticalScanningCalculations , double satelliteLongitude , out double latitude , out double longitude )
6167 {
6268 var satelliteHeight = verticalScanningCalculations . SatelliteHeight ;
6369
70+ // Pre-compute trigonometric values
6471 var cosX = Cos ( scanningX ) ;
6572 var sinX = Sin ( scanningX ) ;
73+ var cosXSquared = cosX * cosX ;
6674
6775 var cosY = verticalScanningCalculations . CosY ;
6876 var sinY = verticalScanningCalculations . SinY ;
6977 var t = verticalScanningCalculations . T ;
7078 var c = verticalScanningCalculations . C ;
7179
72- var a = sinX * sinX + cosX * cosX * t ;
80+ // Calculate quadratic formula components
81+ var a = sinX * sinX + cosXSquared * t ;
7382 var b = - 2 * satelliteHeight * cosX * cosY ;
83+ var discr = b * b - 4 * a * c ;
84+
85+ // Inline sqrt calculation for better performance
86+ var rs = ( - b - Sqrt ( discr ) ) / ( 2 * a ) ;
7487
75- var rs = ( - b - Sqrt ( b * b - 4 * a * c ) ) / ( 2 * a ) ;
76-
88+ // Pre-compute these values once as they're used multiple times
7789 var sx = rs * cosX * cosY ;
7890 var sy = - rs * sinX ;
7991 var sz = rs * cosX * sinY ;
80-
81- latitude = Atan ( RadiusEquatorSquared / RadiusPolarSquared * ( sz / Sqrt ( ( satelliteHeight - sx ) * ( satelliteHeight - sx ) + sy * sy ) ) ) ;
82- longitude = ( satelliteLongitude - Atan ( sy / ( satelliteHeight - sx ) ) ) . NormaliseLongitude ( ) ;
92+
93+ // Calculate distance term once
94+ var satMinusSx = satelliteHeight - sx ;
95+ var distSqr = satMinusSx * satMinusSx + sy * sy ;
96+
97+ // Calculate latitude and longitude
98+ latitude = Atan ( RadiusRatio * ( sz / Sqrt ( distSqr ) ) ) ;
99+ longitude = ( satelliteLongitude - Atan ( sy / satMinusSx ) ) . NormaliseLongitude ( ) ;
83100 }
84101}
85102
0 commit comments