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 };