GeographicLib: GeodesicExact.hpp Source File (original) (raw)

86 private:

89 friend class Geodesic;

90

91 GeodesicExact() {};

92

93 static const unsigned maxit1_ = 20;

94 unsigned maxit2_;

95 real tiny_, tol0_, tol1_, tol2_, tolb_, xthresh_;

96

97 static constexpr unsigned CAP_NONE = 0U;

98 static constexpr unsigned CAP_E = 1U<<0;

99

100 static constexpr unsigned CAP_D = 1U<<2;

101 static constexpr unsigned CAP_H = 1U<<3;

102 static constexpr unsigned CAP_C4 = 1U<<4;

103 static constexpr unsigned CAP_ALL = 0x1FU;

104 static constexpr unsigned CAP_MASK = CAP_ALL;

105 static constexpr unsigned OUT_ALL = 0x7F80U;

106 static constexpr unsigned OUT_MASK = 0xFF80U;

107

109

110 real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2;

111 int _nC4;

112 DST _fft;

113

118 real cbet1, real cbet2, unsigned outmask,

133 real& domg12, bool diffp, real& dlam12) const;

135 unsigned outmask, real& s12,

138

139 class I4Integrand {

140 private:

141 real X, tX, tdX, sX, sX1, sXX1, asinhsX, _k2;

142 static real asinhsqrt(real x);

145

147 public:

148 I4Integrand(real ep2, real k2);

149 real operator()(real sig) const;

150 };

151

152 public:

153

154

155

156

157

158

159

160

161

162

164

165

166

167

168 NONE = 0U,

169

170

171

172

173

174 LATITUDE = 1U<<7 | CAP_NONE,

175

176

177

178

179 LONGITUDE = 1U<<8 | CAP_H,

180

181

182

183

184

185

186 AZIMUTH = 1U<<9 | CAP_NONE,

187

188

189

190

191 DISTANCE = 1U<<10 | CAP_E,

192

193

194

195

196

197

198 STANDARD = LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,

199

200

201

202

203

204 DISTANCE_IN = 1U<<11 | CAP_E,

205

206

207

208

209 REDUCEDLENGTH = 1U<<12 | CAP_D,

210

211

212

213

214 GEODESICSCALE = 1U<<13 | CAP_D,

215

216

217

218

219 AREA = 1U<<14 | CAP_C4,

220

221

222

223

224 LONG_UNROLL = 1U<<15,

225

226

227

228

229

230 ALL = OUT_ALL| CAP_ALL,

231 };

232

233

234

235

236

237

238

239

240

241

242

243

244

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

287 real& lat2, real& lon2, real& azi2,

288 real& m12, real& M12, real& M21, real& S12)

289 const {

290 real t;

291 return GenDirect(lat1, lon1, azi1, false, s12,

292 LATITUDE | LONGITUDE | AZIMUTH |

293 REDUCEDLENGTH | GEODESICSCALE | AREA,

294 lat2, lon2, azi2, t, m12, M12, M21, S12);

295 }

296

297

298

299

301 real& lat2, real& lon2)

302 const {

303 real t;

304 return GenDirect(lat1, lon1, azi1, false, s12,

305 LATITUDE | LONGITUDE,

306 lat2, lon2, t, t, t, t, t, t);

307 }

308

309

310

311

313 real& lat2, real& lon2, real& azi2)

314 const {

315 real t;

316 return GenDirect(lat1, lon1, azi1, false, s12,

317 LATITUDE | LONGITUDE | AZIMUTH,

318 lat2, lon2, azi2, t, t, t, t, t);

319 }

320

321

322

323

325 real& lat2, real& lon2, real& azi2, real& m12)

326 const {

327 real t;

328 return GenDirect(lat1, lon1, azi1, false, s12,

329 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,

330 lat2, lon2, azi2, t, m12, t, t, t);

331 }

332

333

334

335

337 real& lat2, real& lon2, real& azi2,

338 real& M12, real& M21)

339 const {

340 real t;

341 return GenDirect(lat1, lon1, azi1, false, s12,

342 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,

343 lat2, lon2, azi2, t, t, M12, M21, t);

344 }

345

346

347

348

350 real& lat2, real& lon2, real& azi2,

351 real& m12, real& M12, real& M21)

352 const {

353 real t;

354 return GenDirect(lat1, lon1, azi1, false, s12,

355 LATITUDE | LONGITUDE | AZIMUTH |

356 REDUCEDLENGTH | GEODESICSCALE,

357 lat2, lon2, azi2, t, m12, M12, M21, t);

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

394

395

396

397

398 void ArcDirect(real lat1, real lon1, real azi1, real a12,

399 real& lat2, real& lon2, real& azi2, real& s12,

400 real& m12, real& M12, real& M21, real& S12)

401 const {

402 GenDirect(lat1, lon1, azi1, true, a12,

403 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |

404 REDUCEDLENGTH | GEODESICSCALE | AREA,

405 lat2, lon2, azi2, s12, m12, M12, M21, S12);

406 }

407

408

409

410

411 void ArcDirect(real lat1, real lon1, real azi1, real a12,

412 real& lat2, real& lon2) const {

413 real t;

414 GenDirect(lat1, lon1, azi1, true, a12,

415 LATITUDE | LONGITUDE,

416 lat2, lon2, t, t, t, t, t, t);

417 }

418

419

420

421

422 void ArcDirect(real lat1, real lon1, real azi1, real a12,

423 real& lat2, real& lon2, real& azi2) const {

424 real t;

425 GenDirect(lat1, lon1, azi1, true, a12,

426 LATITUDE | LONGITUDE | AZIMUTH,

427 lat2, lon2, azi2, t, t, t, t, t);

428 }

429

430

431

432

433 void ArcDirect(real lat1, real lon1, real azi1, real a12,

434 real& lat2, real& lon2, real& azi2, real& s12)

435 const {

436 real t;

437 GenDirect(lat1, lon1, azi1, true, a12,

438 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,

439 lat2, lon2, azi2, s12, t, t, t, t);

440 }

441

442

443

444

445 void ArcDirect(real lat1, real lon1, real azi1, real a12,

446 real& lat2, real& lon2, real& azi2,

447 real& s12, real& m12) const {

448 real t;

449 GenDirect(lat1, lon1, azi1, true, a12,

450 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |

451 REDUCEDLENGTH,

452 lat2, lon2, azi2, s12, m12, t, t, t);

453 }

454

455

456

457

458 void ArcDirect(real lat1, real lon1, real azi1, real a12,

459 real& lat2, real& lon2, real& azi2, real& s12,

460 real& M12, real& M21) const {

461 real t;

462 GenDirect(lat1, lon1, azi1, true, a12,

463 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |

464 GEODESICSCALE,

465 lat2, lon2, azi2, s12, t, M12, M21, t);

466 }

467

468

469

470

471 void ArcDirect(real lat1, real lon1, real azi1, real a12,

472 real& lat2, real& lon2, real& azi2, real& s12,

473 real& m12, real& M12, real& M21) const {

474 real t;

475 GenDirect(lat1, lon1, azi1, true, a12,

476 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |

477 REDUCEDLENGTH | GEODESICSCALE,

478 lat2, lon2, azi2, s12, m12, M12, M21, t);

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

507

508

509

510

511

512

513

514

515

516

517

518

519

520

521

522

523

524

525

526

527

528

529

530

531

532

533

534

535

537 bool arcmode, real s12_a12, unsigned outmask,

540 real& S12) const;

541

542

543

544

545

546

547

548

549

550

551

552

553

554

555

556

557

558

559

560

561

562

563

564

565

566

567

568

569

570

571

572

573

574

575

576

578 real& s12, real& azi1, real& azi2, real& m12,

579 real& M12, real& M21, real& S12) const {

580 return GenInverse(lat1, lon1, lat2, lon2,

581 DISTANCE | AZIMUTH |

582 REDUCEDLENGTH | GEODESICSCALE | AREA,

583 s12, azi1, azi2, m12, M12, M21, S12);

584 }

585

586

587

588

590 real& s12) const {

591 real t;

592 return GenInverse(lat1, lon1, lat2, lon2,

593 DISTANCE,

594 s12, t, t, t, t, t, t);

595 }

596

597

598

599

601 real& azi1, real& azi2) const {

602 real t;

603 return GenInverse(lat1, lon1, lat2, lon2,

604 AZIMUTH,

605 t, azi1, azi2, t, t, t, t);

606 }

607

608

609

610

612 real& s12, real& azi1, real& azi2)

613 const {

614 real t;

615 return GenInverse(lat1, lon1, lat2, lon2,

616 DISTANCE | AZIMUTH,

617 s12, azi1, azi2, t, t, t, t);

618 }

619

620

621

622

624 real& s12, real& azi1, real& azi2, real& m12)

625 const {

626 real t;

627 return GenInverse(lat1, lon1, lat2, lon2,

628 DISTANCE | AZIMUTH | REDUCEDLENGTH,

629 s12, azi1, azi2, m12, t, t, t);

630 }

631

632

633

634

636 real& s12, real& azi1, real& azi2,

637 real& M12, real& M21) const {

638 real t;

639 return GenInverse(lat1, lon1, lat2, lon2,

640 DISTANCE | AZIMUTH | GEODESICSCALE,

641 s12, azi1, azi2, t, M12, M21, t);

642 }

643

644

645

646

648 real& s12, real& azi1, real& azi2, real& m12,

649 real& M12, real& M21) const {

650 real t;

651 return GenInverse(lat1, lon1, lat2, lon2,

652 DISTANCE | AZIMUTH |

653 REDUCEDLENGTH | GEODESICSCALE,

654 s12, azi1, azi2, m12, M12, M21, t);

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

689

690

691

692

693

695 unsigned outmask,

698

699

700

701

702

703

704

705

706

708

709

710

711

712

713

714

715

716

717

718

719

720

721

722

723

724

725

726

727

728

729

730

731

732

733

734

735

736

737

738

739

740

741

742

743

744

745

747 unsigned caps = ALL) const;

748

749

750

751

752

753

754

755

756

757

758

759

760

761

762

763

764

765

766

767 GeodesicLineExact InverseLine(real lat1, real lon1, real lat2, real lon2,

768 unsigned caps = ALL) const;

769

770

771

772

773

774

775

776

777

778

779

780

781

782

783

784

785

786

787

788

789

790 GeodesicLineExact DirectLine(real lat1, real lon1, real azi1, real s12,

791 unsigned caps = ALL) const;

792

793

794

795

796

797

798

799

800

801

802

803

804

805

806

807

808

809

810

811

812

813 GeodesicLineExact ArcDirectLine(real lat1, real lon1, real azi1, real a12,

814 unsigned caps = ALL) const;

815

816

817

818

819

820

821

822

823

824

825

826

827

828

829

830

831

832

833

834

835

836

837

838

840 bool arcmode, real s12_a12,

841 unsigned caps = ALL) const;

842

843

844

845

846

847

848

849

850

851

853

854

855

856

857

859

860

861

862

863

864

865

867 { return 4 * Math::pi() * _c2; }

868

869

870

871

872

873

875

876 };