GeographicLib: Geodesic.hpp Source File (original) (raw)
21# define GEOGRAPHICLIB_GEODESIC_ORDER \
22 (GEOGRAPHICLIB_PRECISION == 2 ? 6 : \
23 (GEOGRAPHICLIB_PRECISION == 1 ? 3 : \
24 (GEOGRAPHICLIB_PRECISION == 3 ? 7 : 8)))
176 private:
185 static const int nA3x_ = nA3_;
187 static const int nC3x_ = (nC3_ * (nC3_ - 1)) / 2;
189 static const int nC4x_ = (nC4_ * (nC4_ + 1)) / 2;
190
191
193 static const unsigned maxit1_ = 20;
194 unsigned maxit2_;
195 real tiny_, tol0_, tol1_, tol2_, tolb_, xthresh_;
196
197 static constexpr unsigned CAP_NONE = 0U;
198 static constexpr unsigned CAP_C1 = 1U<<0;
199 static constexpr unsigned CAP_C1p = 1U<<1;
200 static constexpr unsigned CAP_C2 = 1U<<2;
201 static constexpr unsigned CAP_C3 = 1U<<3;
202 static constexpr unsigned CAP_C4 = 1U<<4;
203 static constexpr unsigned CAP_ALL = 0x1FU;
204 static constexpr unsigned CAP_MASK = CAP_ALL;
205 static constexpr unsigned OUT_ALL = 0x7F80U;
206 static constexpr unsigned OUT_MASK = 0xFF80U;
207
208 static real SinCosSeries(bool sinp,
209 real sinx, real cosx, const real c[], int n);
210 static real Astroid(real x, real y);
211
212 real _a, _f;
213 bool _exact;
214 real _f1, _e2, _ep2, _n, _b, _c2, _etol2;
215 real _aA3x[nA3x_], _cC3x[nC3x_], _cC4x[nC4x_];
217
218 void Lengths(real eps, real sig12,
219 real ssig1, real csig1, real dn1,
220 real ssig2, real csig2, real dn2,
221 real cbet1, real cbet2, unsigned outmask,
222 real& s12s, real& m12a, real& m0,
223 real& M12, real& M21, real Ca[]) const;
224 real InverseStart(real sbet1, real cbet1, real dn1,
225 real sbet2, real cbet2, real dn2,
226 real lam12, real slam12, real clam12,
227 real& salp1, real& calp1,
228 real& salp2, real& calp2, real& dnm,
229 real Ca[]) const;
230 real Lambda12(real sbet1, real cbet1, real dn1,
231 real sbet2, real cbet2, real dn2,
232 real salp1, real calp1, real slam120, real clam120,
233 real& salp2, real& calp2, real& sig12,
234 real& ssig1, real& csig1, real& ssig2, real& csig2,
235 real& eps, real& domg12,
236 bool diffp, real& dlam12, real Ca[]) const;
237 real GenInverse(real lat1, real lon1, real lat2, real lon2,
238 unsigned outmask, real& s12,
239 real& salp1, real& calp1, real& salp2, real& calp2,
240 real& m12, real& M12, real& M21, real& S12) const;
241
242
243
244 static real A1m1f(real eps);
245 static void C1f(real eps, real c[]);
246 static void C1pf(real eps, real c[]);
247 static real A2m1f(real eps);
248 static void C2f(real eps, real c[]);
249
250 void A3coeff();
251 real A3f(real eps) const;
252 void C3coeff();
253 void C3f(real eps, real c[]) const;
254 void C4coeff();
255 void C4f(real k2, real c[]) const;
256 public:
257
258
259
260
261
262
263
264
265
267
268
269
270
271 NONE = 0U,
272
273
274
275
276
277 LATITUDE = 1U<<7 | CAP_NONE,
278
279
280
281
282 LONGITUDE = 1U<<8 | CAP_C3,
283
284
285
286
287
288
289 AZIMUTH = 1U<<9 | CAP_NONE,
290
291
292
293
294 DISTANCE = 1U<<10 | CAP_C1,
295
296
297
298
299
300 STANDARD = LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
301
302
303
304
305
306 DISTANCE_IN = 1U<<11 | CAP_C1 | CAP_C1p,
307
308
309
310
311 REDUCEDLENGTH = 1U<<12 | CAP_C1 | CAP_C2,
312
313
314
315
316 GEODESICSCALE = 1U<<13 | CAP_C1 | CAP_C2,
317
318
319
320
321 AREA = 1U<<14 | CAP_C4,
322
323
324
325
326 LONG_UNROLL = 1U<<15,
327
328
329
330
331
332 ALL = OUT_ALL| CAP_ALL,
333 };
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
395 real& lat2, real& lon2, real& azi2,
396 real& m12, real& M12, real& M21, real& S12)
397 const {
398 real t;
399 return GenDirect(lat1, lon1, azi1, false, s12,
400 LATITUDE | LONGITUDE | AZIMUTH |
401 REDUCEDLENGTH | GEODESICSCALE | AREA,
402 lat2, lon2, azi2, t, m12, M12, M21, S12);
403 }
404
405
406
407
409 real& lat2, real& lon2)
410 const {
411 real t;
412 return GenDirect(lat1, lon1, azi1, false, s12,
413 LATITUDE | LONGITUDE,
414 lat2, lon2, t, t, t, t, t, t);
415 }
416
417
418
419
421 real& lat2, real& lon2, real& azi2)
422 const {
423 real t;
424 return GenDirect(lat1, lon1, azi1, false, s12,
425 LATITUDE | LONGITUDE | AZIMUTH,
426 lat2, lon2, azi2, t, t, t, t, t);
427 }
428
429
430
431
433 real& lat2, real& lon2, real& azi2, real& m12)
434 const {
435 real t;
436 return GenDirect(lat1, lon1, azi1, false, s12,
437 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
438 lat2, lon2, azi2, t, m12, t, t, t);
439 }
440
441
442
443
445 real& lat2, real& lon2, real& azi2,
446 real& M12, real& M21)
447 const {
448 real t;
449 return GenDirect(lat1, lon1, azi1, false, s12,
450 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
451 lat2, lon2, azi2, t, t, M12, M21, t);
452 }
453
454
455
456
458 real& lat2, real& lon2, real& azi2,
459 real& m12, real& M12, real& M21)
460 const {
461 real t;
462 return GenDirect(lat1, lon1, azi1, false, s12,
463 LATITUDE | LONGITUDE | AZIMUTH |
464 REDUCEDLENGTH | GEODESICSCALE,
465 lat2, lon2, azi2, t, m12, M12, M21, t);
466 }
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506 void ArcDirect(real lat1, real lon1, real azi1, real a12,
507 real& lat2, real& lon2, real& azi2, real& s12,
508 real& m12, real& M12, real& M21, real& S12)
509 const {
510 GenDirect(lat1, lon1, azi1, true, a12,
511 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
512 REDUCEDLENGTH | GEODESICSCALE | AREA,
513 lat2, lon2, azi2, s12, m12, M12, M21, S12);
514 }
515
516
517
518
519 void ArcDirect(real lat1, real lon1, real azi1, real a12,
520 real& lat2, real& lon2) const {
521 real t;
522 GenDirect(lat1, lon1, azi1, true, a12,
523 LATITUDE | LONGITUDE,
524 lat2, lon2, t, t, t, t, t, t);
525 }
526
527
528
529
530 void ArcDirect(real lat1, real lon1, real azi1, real a12,
531 real& lat2, real& lon2, real& azi2) const {
532 real t;
533 GenDirect(lat1, lon1, azi1, true, a12,
534 LATITUDE | LONGITUDE | AZIMUTH,
535 lat2, lon2, azi2, t, t, t, t, t);
536 }
537
538
539
540
541 void ArcDirect(real lat1, real lon1, real azi1, real a12,
542 real& lat2, real& lon2, real& azi2, real& s12)
543 const {
544 real t;
545 GenDirect(lat1, lon1, azi1, true, a12,
546 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
547 lat2, lon2, azi2, s12, t, t, t, t);
548 }
549
550
551
552
553 void ArcDirect(real lat1, real lon1, real azi1, real a12,
554 real& lat2, real& lon2, real& azi2,
555 real& s12, real& m12) const {
556 real t;
557 GenDirect(lat1, lon1, azi1, true, a12,
558 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
559 REDUCEDLENGTH,
560 lat2, lon2, azi2, s12, m12, t, t, t);
561 }
562
563
564
565
566 void ArcDirect(real lat1, real lon1, real azi1, real a12,
567 real& lat2, real& lon2, real& azi2, real& s12,
568 real& M12, real& M21) const {
569 real t;
570 GenDirect(lat1, lon1, azi1, true, a12,
571 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
572 GEODESICSCALE,
573 lat2, lon2, azi2, s12, t, M12, M21, t);
574 }
575
576
577
578
579 void ArcDirect(real lat1, real lon1, real azi1, real a12,
580 real& lat2, real& lon2, real& azi2, real& s12,
581 real& m12, real& M12, real& M21) const {
582 real t;
583 GenDirect(lat1, lon1, azi1, true, a12,
584 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
585 REDUCEDLENGTH | GEODESICSCALE,
586 lat2, lon2, azi2, s12, m12, M12, M21, t);
587 }
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
645 bool arcmode, real s12_a12, unsigned outmask,
648 real& S12) const;
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
690 real& s12, real& azi1, real& azi2, real& m12,
691 real& M12, real& M21, real& S12) const {
692 return GenInverse(lat1, lon1, lat2, lon2,
693 DISTANCE | AZIMUTH |
694 REDUCEDLENGTH | GEODESICSCALE | AREA,
695 s12, azi1, azi2, m12, M12, M21, S12);
696 }
697
698
699
700
702 real& s12) const {
703 real t;
704 return GenInverse(lat1, lon1, lat2, lon2,
705 DISTANCE,
706 s12, t, t, t, t, t, t);
707 }
708
709
710
711
713 real& azi1, real& azi2) const {
714 real t;
715 return GenInverse(lat1, lon1, lat2, lon2,
716 AZIMUTH,
717 t, azi1, azi2, t, t, t, t);
718 }
719
720
721
722
724 real& s12, real& azi1, real& azi2)
725 const {
726 real t;
727 return GenInverse(lat1, lon1, lat2, lon2,
728 DISTANCE | AZIMUTH,
729 s12, azi1, azi2, t, t, t, t);
730 }
731
732
733
734
736 real& s12, real& azi1, real& azi2, real& m12)
737 const {
738 real t;
739 return GenInverse(lat1, lon1, lat2, lon2,
740 DISTANCE | AZIMUTH | REDUCEDLENGTH,
741 s12, azi1, azi2, m12, t, t, t);
742 }
743
744
745
746
748 real& s12, real& azi1, real& azi2,
749 real& M12, real& M21) const {
750 real t;
751 return GenInverse(lat1, lon1, lat2, lon2,
752 DISTANCE | AZIMUTH | GEODESICSCALE,
753 s12, azi1, azi2, t, M12, M21, t);
754 }
755
756
757
758
760 real& s12, real& azi1, real& azi2, real& m12,
761 real& M12, real& M21) const {
762 real t;
763 return GenInverse(lat1, lon1, lat2, lon2,
764 DISTANCE | AZIMUTH |
765 REDUCEDLENGTH | GEODESICSCALE,
766 s12, azi1, azi2, m12, M12, M21, t);
767 }
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
807 unsigned outmask,
810
811
812
813
814
815
816
817
818
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857 GeodesicLine Line(real lat1, real lon1, real azi1, unsigned caps = ALL)
858 const;
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878 GeodesicLine InverseLine(real lat1, real lon1, real lat2, real lon2,
879 unsigned caps = ALL) const;
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901 GeodesicLine DirectLine(real lat1, real lon1, real azi1, real s12,
902 unsigned caps = ALL) const;
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924 GeodesicLine ArcDirectLine(real lat1, real lon1, real azi1, real a12,
925 unsigned caps = ALL) const;
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950 GeodesicLine GenDirectLine(real lat1, real lon1, real azi1,
951 bool arcmode, real s12_a12,
952 unsigned caps = ALL) const;
953
954
955
956
957
958
959
960
961
962
964
965
966
967
968
970
971
972
973
974
975 bool Exact() const { return _exact; }
976
977
978
979
980
981
982
984 { return 4 * Math::pi() * _c2; }
985
986
987
988
989
990
991 static const Geodesic& WGS84();
992
993 };