]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/geometry/test/formulas/inverse.cpp
4 // Copyright (c) 2016-2019 Oracle and/or its affiliates.
6 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
8 // Copyright (c) 2018 Adeel Ahmad, Islamabad, Pakistan.
10 // Contributed and/or modified by Adeel Ahmad, as part of Google Summer of Code 2018 program
12 // Use, modification and distribution is subject to the Boost Software License,
13 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
14 // http://www.boost.org/LICENSE_1_0.txt)
19 #include "test_formula.hpp"
20 #include "inverse_cases.hpp"
22 #include <boost/geometry/formulas/vincenty_inverse.hpp>
23 #include <boost/geometry/formulas/thomas_inverse.hpp>
24 #include <boost/geometry/formulas/andoyer_inverse.hpp>
26 #include <boost/geometry/srs/spheroid.hpp>
28 template <typename Result
>
29 void check_inverse(std::string
const& name
,
30 Result
const& results
,
31 bg::formula::result_inverse
<double> const& result
,
32 expected_result
const& expected
,
33 expected_result
const& reference
,
34 double reference_error
)
37 ss
<< "(" << results
.p1
.lon
<< " " << results
.p1
.lat
<< ")->(" << results
.p2
.lon
<< " " << results
.p2
.lat
<< ")";
39 check_one(name
+ "_d " + ss
.str(),
40 result
.distance
, expected
.distance
, reference
.distance
, reference_error
);
41 check_one(name
+ "_a " + ss
.str(),
42 result
.azimuth
, expected
.azimuth
, reference
.azimuth
, reference_error
, true);
43 check_one(name
+ "_ra " + ss
.str(),
44 result
.reverse_azimuth
, expected
.reverse_azimuth
, reference
.reverse_azimuth
, reference_error
, true);
45 check_one(name
+ "_rl " + ss
.str(),
46 result
.reduced_length
, expected
.reduced_length
, reference
.reduced_length
, reference_error
);
47 check_one(name
+ "_gs " + ss
.str(),
48 result
.geodesic_scale
, expected
.geodesic_scale
, reference
.geodesic_scale
, reference_error
);
51 void test_all(expected_results
const& results
)
53 double const d2r
= bg::math::d2r
<double>();
54 double const r2d
= bg::math::r2d
<double>();
56 double lon1r
= results
.p1
.lon
* d2r
;
57 double lat1r
= results
.p1
.lat
* d2r
;
58 double lon2r
= results
.p2
.lon
* d2r
;
59 double lat2r
= results
.p2
.lat
* d2r
;
62 bg::srs::spheroid
<double> spheroid(6378137.0, 6356752.3142451793);
64 bg::formula::result_inverse
<double> result_v
, result_t
, result_a
;
66 typedef bg::formula::vincenty_inverse
<double, true, true, true, true, true> vi_t
;
67 result_v
= vi_t::apply(lon1r
, lat1r
, lon2r
, lat2r
, spheroid
);
68 result_v
.azimuth
*= r2d
;
69 result_v
.reverse_azimuth
*= r2d
;
70 check_inverse("vincenty", results
, result_v
, results
.vincenty
, results
.reference
, 0.0000001);
72 typedef bg::formula::thomas_inverse
<double, true, true, true, true, true> th_t
;
73 result_t
= th_t::apply(lon1r
, lat1r
, lon2r
, lat2r
, spheroid
);
74 result_t
.azimuth
*= r2d
;
75 result_t
.reverse_azimuth
*= r2d
;
76 check_inverse("thomas", results
, result_t
, results
.thomas
, results
.reference
, 0.00001);
78 typedef bg::formula::andoyer_inverse
<double, true, true, true, true, true> an_t
;
79 result_a
= an_t::apply(lon1r
, lat1r
, lon2r
, lat2r
, spheroid
);
80 result_a
.azimuth
*= r2d
;
81 result_a
.reverse_azimuth
*= r2d
;
82 check_inverse("andoyer", results
, result_a
, results
.andoyer
, results
.reference
, 0.001);
85 int test_main(int, char*[])
87 for (size_t i
= 0; i
< expected_size
; ++i
)
89 test_all(expected
[i
]);