public static void ToScanningAngle(LatitudeCalculations latitudeCalculations, double longitude, SatelliteDefinition definition, out double scanningX, out double scanningY) { var satelliteLongitude = definition.Longitude; var satelliteHeight = definition.Height + RadiusEquator; var sx = satelliteHeight - latitudeCalculations.RcCosLatitude * Cos(longitude - satelliteLongitude); var sy = -latitudeCalculations.RcCosLatitude * Sin(longitude - satelliteLongitude); var sy2 = sy * sy; // Check if geodetic angle is visible from satellite if (satelliteHeight * (satelliteHeight - sx) < sy2 + latitudeCalculations.RadiusRatioSz2) { scanningX = scanningY = double.NaN; return; } // Calculate (x,y) scanning angle scanningX = Asin(-sy / Sqrt(sx * sx + sy2 + latitudeCalculations.Sz2)); scanningY = Atan(latitudeCalculations.Sz / sx); }
public static LatitudeCalculations LatitudeCalculations(double latitude) { var geocentricLatitude = Atan(RadiusPolarSquared / RadiusEquatorSquared * Tan(latitude)); var cosLatitude = Cos(geocentricLatitude); var sinLatitude = Sin(geocentricLatitude); var rc = RadiusPolar / Sqrt(1 - Eccentricity * Eccentricity * cosLatitude * cosLatitude); var sz = rc * sinLatitude; var calculations = new LatitudeCalculations { CosLatitude = cosLatitude, Rc = rc, Sz = sz, Sz2 = sz * sz }; calculations.RcCosLatitude = calculations.Rc * calculations.CosLatitude; calculations.RadiusRatioSz2 = RadiusEquatorSquared / RadiusPolarSquared * calculations.Sz2; return(calculations); }