@@ -571,63 +571,69 @@ public GeoPoint surfacePointOnBearing(
571571
572572 double lat = from .getLatitude ();
573573 double lon = from .getLongitude ();
574- double sinα1 = Math .sin (bearing );
575- double cosα1 = Math .cos (bearing );
574+ double sinalpha1 = Math .sin (bearing );
575+ double cosalpha1 = Math .cos (bearing );
576576
577577 double tanU1 = (1.0 - scaledFlattening ) * Math .tan (lat );
578578 double cosU1 = 1.0 / Math .sqrt ((1.0 + tanU1 * tanU1 ));
579579 double sinU1 = tanU1 * cosU1 ;
580580
581- double σ1 = Math .atan2 (tanU1 , cosα1 );
582- double sinα = cosU1 * sinα1 ;
583- double cosSqα = 1.0 - sinα * sinα ;
584- double uSq = cosSqα * squareRatio ;
581+ double sigma1 = Math .atan2 (tanU1 , cosalpha1 );
582+ double sinalpha = cosU1 * sinalpha1 ;
583+ double cosSqalpha = 1.0 - sinalpha * sinalpha ;
584+ double uSq = cosSqalpha * squareRatio ;
585585 double A = 1.0 + uSq / 16384.0 * (4096.0 + uSq * (-768.0 + uSq * (320.0 - 175.0 * uSq )));
586586 double B = uSq / 1024.0 * (256.0 + uSq * (-128.0 + uSq * (74.0 - 47.0 * uSq )));
587587
588- double cos2σM ;
589- double sinσ ;
590- double cosσ ;
591- double Δσ ;
588+ double cos2sigmaM ;
589+ double sinsigma ;
590+ double cossigma ;
591+ double deltasigma ;
592592
593- double σ = dist / (zScaling * inverseScale * A );
594- double σʹ ;
593+ double sigma = dist / (zScaling * inverseScale * A );
594+ double sigmaprime ;
595595 double iterations = 0 ;
596596 do {
597- cos2σM = Math .cos (2.0 * σ1 + σ );
598- sinσ = Math .sin (σ );
599- cosσ = Math .cos (σ );
600- Δσ =
597+ cos2sigmaM = Math .cos (2.0 * sigma1 + sigma );
598+ sinsigma = Math .sin (sigma );
599+ cossigma = Math .cos (sigma );
600+ deltasigma =
601601 B
602- * sinσ
603- * (cos2σM
602+ * sinsigma
603+ * (cos2sigmaM
604604 + B
605605 / 4.0
606- * (cosσ * (-1.0 + 2.0 * cos2σM * cos2σM )
606+ * (cossigma * (-1.0 + 2.0 * cos2sigmaM * cos2sigmaM )
607607 - B
608608 / 6.0
609- * cos2σM
610- * (-3.0 + 4.0 * sinσ * sinσ )
611- * (-3.0 + 4.0 * cos2σM * cos2σM )));
612- σʹ = σ ;
613- σ = dist / (zScaling * inverseScale * A ) + Δσ ;
614- } while (Math .abs (σ - σʹ ) >= Vector .MINIMUM_RESOLUTION && ++iterations < 100 );
615- double x = sinU1 * sinσ - cosU1 * cosσ * cosα1 ;
616- double φ2 =
609+ * cos2sigmaM
610+ * (-3.0 + 4.0 * sinsigma * sinsigma )
611+ * (-3.0 + 4.0 * cos2sigmaM * cos2sigmaM )));
612+ sigmaprime = sigma ;
613+ sigma = dist / (zScaling * inverseScale * A ) + deltasigma ;
614+ } while (Math .abs (sigma - sigmaprime ) >= Vector .MINIMUM_RESOLUTION && ++iterations < 100 );
615+ double x = sinU1 * sinsigma - cosU1 * cossigma * cosalpha1 ;
616+ double phi2 =
617617 Math .atan2 (
618- sinU1 * cosσ + cosU1 * sinσ * cosα1 ,
619- (1.0 - scaledFlattening ) * Math .sqrt (sinα * sinα + x * x ));
620- double λ = Math .atan2 (sinσ * sinα1 , cosU1 * cosσ - sinU1 * sinσ * cosα1 );
621- double C = scaledFlattening / 16.0 * cosSqα * (4.0 + scaledFlattening * (4.0 - 3.0 * cosSqα ));
618+ sinU1 * cossigma + cosU1 * sinsigma * cosalpha1 ,
619+ (1.0 - scaledFlattening ) * Math .sqrt (sinalpha * sinalpha + x * x ));
620+ double lambda =
621+ Math .atan2 (sinsigma * sinalpha1 , cosU1 * cossigma - sinU1 * sinsigma * cosalpha1 );
622+ double C =
623+ scaledFlattening / 16.0 * cosSqalpha * (4.0 + scaledFlattening * (4.0 - 3.0 * cosSqalpha ));
622624 double L =
623- λ
625+ lambda
624626 - (1.0 - C )
625627 * scaledFlattening
626- * sinα
627- * (σ + C * sinσ * (cos2σM + C * cosσ * (-1.0 + 2.0 * cos2σM * cos2σM )));
628- double λ2 = (lon + L + 3.0 * Math .PI ) % (2.0 * Math .PI ) - Math .PI ; // normalise to -180..+180
629-
630- return new GeoPoint (this , φ2 , λ2 );
628+ * sinalpha
629+ * (sigma
630+ + C
631+ * sinsigma
632+ * (cos2sigmaM + C * cossigma * (-1.0 + 2.0 * cos2sigmaM * cos2sigmaM )));
633+ double lambda2 =
634+ (lon + L + 3.0 * Math .PI ) % (2.0 * Math .PI ) - Math .PI ; // normalise to -180..+180
635+
636+ return new GeoPoint (this , phi2 , lambda2 );
631637 }
632638
633639 /**
0 commit comments