20 # pragma warning (disable: 4706)
23 double wgs84_a = 6378137, wgs84_f = 1/298.257223563;
25 static int assertEquals(
double x,
double y,
double d) {
28 printf(
"assertEquals fails: %.7g != %.7g +/- %.7g\n",
x,
y,
d);
32 const int ncases = 20;
33 double testcases[20][12] = {
34 {35.60777, -139.44815, 111.098748429560326,
35 -11.17491, -69.95921, 129.289270889708762,
36 8935244.5604818305, 80.50729714281974, 6273170.2055303837,
37 0.16606318447386067, 0.16479116945612937, 12841384694976.432},
38 {55.52454, 106.05087, 22.020059880982801,
39 77.03196, 197.18234, 109.112041110671519,
40 4105086.1713924406, 36.892740690445894, 3828869.3344387607,
41 0.80076349608092607, 0.80101006984201008, 61674961290615.615},
42 {-21.97856, 142.59065, -32.44456876433189,
43 41.84138, 98.56635, -41.84359951440466,
44 8394328.894657671, 75.62930491011522, 6161154.5773110616,
45 0.24816339233950381, 0.24930251203627892, -6637997720646.717},
46 {-66.99028, 112.2363, 173.73491240878403,
47 -12.70631, 285.90344, 2.512956620913668,
48 11150344.2312080241, 100.278634181155759, 6289939.5670446687,
49 -0.17199490274700385, -0.17722569526345708, -121287239862139.744},
50 {-17.42761, 173.34268, -159.033557661192928,
51 -15.84784, 5.93557, -20.787484651536988,
52 16076603.1631180673, 144.640108810286253, 3732902.1583877189,
53 -0.81273638700070476, -0.81299800519154474, 97825992354058.708},
54 {32.84994, 48.28919, 150.492927788121982,
55 -56.28556, 202.29132, 48.113449399816759,
56 16727068.9438164461, 150.565799985466607, 3147838.1910180939,
57 -0.87334918086923126, -0.86505036767110637, -72445258525585.010},
58 {6.96833, 52.74123, 92.581585386317712,
59 -7.39675, 206.17291, 90.721692165923907,
60 17102477.2496958388, 154.147366239113561, 2772035.6169917581,
61 -0.89991282520302447, -0.89986892177110739, -1311796973197.995},
62 {-50.56724, -16.30485, -105.439679907590164,
63 -33.56571, -94.97412, -47.348547835650331,
64 6455670.5118668696, 58.083719495371259, 5409150.7979815838,
65 0.53053508035997263, 0.52988722644436602, 41071447902810.047},
66 {-58.93002, -8.90775, 140.965397902500679,
67 -8.91104, 133.13503, 19.255429433416599,
68 11756066.0219864627, 105.755691241406877, 6151101.2270708536,
69 -0.26548622269867183, -0.27068483874510741, -86143460552774.735},
70 {-68.82867, -74.28391, 93.774347763114881,
71 -50.63005, -8.36685, 34.65564085411343,
72 3956936.926063544, 35.572254987389284, 3708890.9544062657,
73 0.81443963736383502, 0.81420859815358342, -41845309450093.787},
74 {-10.62672, -32.0898, -86.426713286747751,
75 5.883, -134.31681, -80.473780971034875,
76 11470869.3864563009, 103.387395634504061, 6184411.6622659713,
77 -0.23138683500430237, -0.23155097622286792, 4198803992123.548},
78 {-21.76221, 166.90563, 29.319421206936428,
79 48.72884, 213.97627, 43.508671946410168,
80 9098627.3986554915, 81.963476716121964, 6299240.9166992283,
81 0.13965943368590333, 0.14152969707656796, 10024709850277.476},
82 {-19.79938, -174.47484, 71.167275780171533,
83 -11.99349, -154.35109, 65.589099775199228,
84 2319004.8601169389, 20.896611684802389, 2267960.8703918325,
85 0.93427001867125849, 0.93424887135032789, -3935477535005.785},
86 {-11.95887, -116.94513, 92.712619830452549,
87 4.57352, 7.16501, 78.64960934409585,
88 13834722.5801401374, 124.688684161089762, 5228093.177931598,
89 -0.56879356755666463, -0.56918731952397221, -9919582785894.853},
90 {-87.85331, 85.66836, -65.120313040242748,
91 66.48646, 16.09921, -4.888658719272296,
92 17286615.3147144645, 155.58592449699137, 2635887.4729110181,
93 -0.90697975771398578, -0.91095608883042767, 42667211366919.534},
94 {1.74708, 128.32011, -101.584843631173858,
95 -11.16617, 11.87109, -86.325793296437476,
96 12942901.1241347408, 116.650512484301857, 5682744.8413270572,
97 -0.44857868222697644, -0.44824490340007729, 10763055294345.653},
98 {-25.72959, -144.90758, -153.647468693117198,
99 -57.70581, -269.17879, -48.343983158876487,
100 9413446.7452453107, 84.664533838404295, 6356176.6898881281,
101 0.09492245755254703, 0.09737058264766572, 74515122850712.444},
102 {-41.22777, 122.32875, 14.285113402275739,
103 -7.57291, 130.37946, 10.805303085187369,
104 3812686.035106021, 34.34330804743883, 3588703.8812128856,
105 0.82605222593217889, 0.82572158200920196, -2456961531057.857},
106 {11.01307, 138.25278, 79.43682622782374,
107 6.62726, 247.05981, 103.708090215522657,
108 11911190.819018408, 107.341669954114577, 6070904.722786735,
109 -0.29767608923657404, -0.29785143390252321, 17121631423099.696},
110 {-29.47124, 95.14681, -163.779130441688382,
111 -27.46601, -69.15955, -15.909335945554969,
112 13487015.8381145492, 121.294026715742277, 5481428.9945736388,
113 -0.51527225545373252, -0.51556587964721788, 104679964020340.318}};
115 static int testinverse() {
116 double lat1, lon1, azi1, lat2, lon2, azi2, s12, a12, m12, M12, M21, S12;
117 double azi1a, azi2a, s12a, a12a, m12a, M12a, M21a, S12a;
121 for (
i = 0;
i < ncases; ++
i) {
122 lat1 = testcases[
i][0]; lon1 = testcases[
i][1]; azi1 = testcases[
i][2];
123 lat2 = testcases[
i][3]; lon2 = testcases[
i][4]; azi2 = testcases[
i][5];
124 s12 = testcases[
i][6]; a12 = testcases[
i][7]; m12 = testcases[
i][8];
125 M12 = testcases[
i][9]; M21 = testcases[
i][10]; S12 = testcases[
i][11];
127 &m12a, &M12a, &M21a, &S12a);
128 result += assertEquals(azi1, azi1a, 1
e-13);
129 result += assertEquals(azi2, azi2a, 1
e-13);
130 result += assertEquals(s12, s12a, 1
e-8);
131 result += assertEquals(a12, a12a, 1
e-13);
132 result += assertEquals(m12, m12a, 1
e-8);
133 result += assertEquals(M12, M12a, 1
e-15);
134 result += assertEquals(M21, M21a, 1
e-15);
135 result += assertEquals(S12, S12a, 0.1);
140 static int testdirect() {
141 double lat1, lon1, azi1, lat2, lon2, azi2, s12, a12, m12, M12, M21, S12;
142 double lat2a, lon2a, azi2a, a12a, m12a, M12a, M21a, S12a;
147 for (
i = 0;
i < ncases; ++
i) {
148 lat1 = testcases[
i][0]; lon1 = testcases[
i][1]; azi1 = testcases[
i][2];
149 lat2 = testcases[
i][3]; lon2 = testcases[
i][4]; azi2 = testcases[
i][5];
150 s12 = testcases[
i][6]; a12 = testcases[
i][7]; m12 = testcases[
i][8];
151 M12 = testcases[
i][9]; M21 = testcases[
i][10]; S12 = testcases[
i][11];
153 &lat2a, &lon2a, &azi2a, 0,
154 &m12a, &M12a, &M21a, &S12a);
155 result += assertEquals(lat2, lat2a, 1
e-13);
156 result += assertEquals(lon2, lon2a, 1
e-13);
157 result += assertEquals(azi2, azi2a, 1
e-13);
158 result += assertEquals(a12, a12a, 1
e-13);
159 result += assertEquals(m12, m12a, 1
e-8);
160 result += assertEquals(M12, M12a, 1
e-15);
161 result += assertEquals(M21, M21a, 1
e-15);
162 result += assertEquals(S12, S12a, 0.1);
167 static int testarcdirect() {
168 double lat1, lon1, azi1, lat2, lon2, azi2, s12, a12, m12, M12, M21, S12;
169 double lat2a, lon2a, azi2a, s12a, m12a, M12a, M21a, S12a;
174 for (
i = 0;
i < ncases; ++
i) {
175 lat1 = testcases[
i][0]; lon1 = testcases[
i][1]; azi1 = testcases[
i][2];
176 lat2 = testcases[
i][3]; lon2 = testcases[
i][4]; azi2 = testcases[
i][5];
177 s12 = testcases[
i][6]; a12 = testcases[
i][7]; m12 = testcases[
i][8];
178 M12 = testcases[
i][9]; M21 = testcases[
i][10]; S12 = testcases[
i][11];
180 &lat2a, &lon2a, &azi2a, &s12a, &m12a, &M12a, &M21a, &S12a);
181 result += assertEquals(lat2, lat2a, 1
e-13);
182 result += assertEquals(lon2, lon2a, 1
e-13);
183 result += assertEquals(azi2, azi2a, 1
e-13);
184 result += assertEquals(s12, s12a, 1
e-8);
185 result += assertEquals(m12, m12a, 1
e-8);
186 result += assertEquals(M12, M12a, 1
e-15);
187 result += assertEquals(M21, M21a, 1
e-15);
188 result += assertEquals(S12, S12a, 0.1);
193 static int GeodSolve0() {
194 double azi1, azi2, s12;
198 geod_inverse(&
g, 40.6, -73.8, 49.01666667, 2.55, &s12, &azi1, &azi2);
199 result += assertEquals(azi1, 53.47022, 0.5
e-5);
200 result += assertEquals(azi2, 111.59367, 0.5
e-5);
201 result += assertEquals(s12, 5853226, 0.5);
205 static int GeodSolve1() {
206 double lat2, lon2, azi2;
210 geod_direct(&
g, 40.63972222, -73.77888889, 53.5, 5850e3,
211 &lat2, &lon2, &azi2);
212 result += assertEquals(lat2, 49.01467, 0.5
e-5);
213 result += assertEquals(lon2, 2.56106, 0.5
e-5);
214 result += assertEquals(azi2, 111.62947, 0.5
e-5);
218 static int GeodSolve2() {
220 double azi1, azi2, s12;
224 geod_inverse(&
g, 0.07476, 0, -0.07476, 180, &s12, &azi1, &azi2);
225 result += assertEquals(azi1, 90.00078, 0.5
e-5);
226 result += assertEquals(azi2, 90.00078, 0.5
e-5);
227 result += assertEquals(s12, 20106193, 0.5);
229 result += assertEquals(azi1, 90.00105, 0.5
e-5);
230 result += assertEquals(azi2, 90.00105, 0.5
e-5);
231 result += assertEquals(s12, 20106193, 0.5);
235 static int GeodSolve4() {
241 geod_inverse(&
g, 36.493349428792, 0, 36.49334942879201, .0000008,
243 result += assertEquals(s12, 0.072, 0.5
e-3);
247 static int GeodSolve5() {
249 double lat2, lon2, azi2;
253 geod_direct(&
g, 0.01777745589997, 30, 0, 10e6, &lat2, &lon2, &azi2);
254 result += assertEquals(lat2, 90, 0.5
e-5);
256 result += assertEquals(lon2, -150, 0.5
e-5);
259 result += assertEquals(lon2, 30, 0.5
e-5);
260 result += assertEquals(azi2, 0, 0.5
e-5);
265 static int GeodSolve6() {
273 -88.202499451857, 179.981022032992859592, &s12, 0, 0);
274 result += assertEquals(s12, 20003898.214, 0.5
e-3);
276 -89.262080389218, 179.992207982775375662, &s12, 0, 0);
277 result += assertEquals(s12, 20003925.854, 0.5
e-3);
279 -89.333123580032997687, 179.99295812360148422, &s12, 0, 0);
280 result += assertEquals(s12, 20003926.881, 0.5
e-3);
284 static int GeodSolve9() {
291 -56.320923501171, 179.664747671772880215, &s12, 0, 0);
292 result += assertEquals(s12, 19993558.287, 0.5
e-3);
296 static int GeodSolve10() {
304 -52.784459512563990912, 179.634407464943777557, &s12, 0, 0);
305 result += assertEquals(s12, 19991596.095, 0.5
e-3);
309 static int GeodSolve11() {
317 -48.52287673545898293, 179.599720456223079643, &s12, 0, 0);
318 result += assertEquals(s12, 19989144.774, 0.5
e-3);
322 static int GeodSolve12() {
326 double azi1, azi2, s12;
331 result += assertEquals(azi1, 120.27, 1
e-2);
332 result += assertEquals(azi2, 105.15, 1
e-2);
333 result += assertEquals(s12, 266.7, 1
e-1);
337 static int GeodSolve14() {
339 double azi1, azi2, s12, nan;
348 result += azi1 == azi1 ? 1 : 0;
349 result += azi2 == azi2 ? 1 : 0;
350 result += s12 == s12 ? 1 : 0;
354 static int GeodSolve15() {
362 0, 0, 0, 0, 0, 0, 0, &S12);
363 result += assertEquals(S12, 23700, 0.5);
367 static int GeodSolve17() {
369 double lat2, lon2, azi2;
376 &lat2, &lon2, &azi2, 0, 0, 0, 0, 0);
377 result += assertEquals(lat2, -39, 1);
378 result += assertEquals(lon2, -254, 1);
379 result += assertEquals(azi2, -170, 1);
381 geod_genposition(&
l, flags, 2e7, &lat2, &lon2, &azi2, 0, 0, 0, 0, 0);
382 result += assertEquals(lat2, -39, 1);
383 result += assertEquals(lon2, -254, 1);
384 result += assertEquals(azi2, -170, 1);
385 geod_direct(&
g, 40, -75, -10, 2e7, &lat2, &lon2, &azi2);
386 result += assertEquals(lat2, -39, 1);
387 result += assertEquals(lon2, 105, 1);
388 result += assertEquals(azi2, -170, 1);
390 result += assertEquals(lat2, -39, 1);
391 result += assertEquals(lon2, 105, 1);
392 result += assertEquals(azi2, -170, 1);
396 static int GeodSolve26() {
402 geod_geninverse(&
g, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, &S12);
403 result += assertEquals(S12, 49911046115.0, 0.5);
407 static int GeodSolve28() {
414 a12 =
geod_gendirect(&
g, 1, 2, 10, 0, 5e6, 0, 0, 0, 0, 0, 0, 0, 0);
415 result += assertEquals(a12, 48.55570690, 0.5
e-8);
419 static int GeodSolve33() {
423 double azi1, azi2, s12;
428 result += assertEquals(azi1, 90.00000, 0.5
e-5);
429 result += assertEquals(azi2, 90.00000, 0.5
e-5);
430 result += assertEquals(s12, 19926189, 0.5);
432 result += assertEquals(azi1, 55.96650, 0.5
e-5);
433 result += assertEquals(azi2, 124.03350, 0.5
e-5);
434 result += assertEquals(s12, 19980862, 0.5);
436 result += assertEquals(azi1, 0.00000, 0.5
e-5);
437 result += assertEquals(
fabs(azi2), 180.00000, 0.5
e-5);
438 result += assertEquals(s12, 20003931, 0.5);
440 result += assertEquals(azi1, 0.00000, 0.5
e-5);
441 result += assertEquals(
fabs(azi2), 180.00000, 0.5
e-5);
442 result += assertEquals(s12, 19893357, 0.5);
445 result += assertEquals(azi1, 90.00000, 0.5
e-5);
446 result += assertEquals(azi2, 90.00000, 0.5
e-5);
447 result += assertEquals(s12, 19994492, 0.5);
449 result += assertEquals(azi1, 0.00000, 0.5
e-5);
450 result += assertEquals(
fabs(azi2), 180.00000, 0.5
e-5);
451 result += assertEquals(s12, 20106193, 0.5);
453 result += assertEquals(azi1, 0.00000, 0.5
e-5);
454 result += assertEquals(
fabs(azi2), 180.00000, 0.5
e-5);
455 result += assertEquals(s12, 19994492, 0.5);
458 result += assertEquals(azi1, 90.00000, 0.5
e-5);
459 result += assertEquals(azi2, 90.00000, 0.5
e-5);
460 result += assertEquals(s12, 19994492, 0.5);
462 result += assertEquals(azi1, 90.00000, 0.5
e-5);
463 result += assertEquals(azi2, 90.00000, 0.5
e-5);
464 result += assertEquals(s12, 20106193, 0.5);
466 result += assertEquals(azi1, 33.02493, 0.5
e-5);
467 result += assertEquals(azi2, 146.97364, 0.5
e-5);
468 result += assertEquals(s12, 20082617, 0.5);
470 result += assertEquals(azi1, 0.00000, 0.5
e-5);
471 result += assertEquals(
fabs(azi2), 180.00000, 0.5
e-5);
472 result += assertEquals(s12, 20027270, 0.5);
477 static int GeodSolve55() {
480 double azi1, azi2, s12, nan;
489 result += azi1 == azi1 ? 1 : 0;
490 result += azi2 == azi2 ? 1 : 0;
491 result += s12 == s12 ? 1 : 0;
493 result += azi1 == azi1 ? 1 : 0;
494 result += azi2 == azi2 ? 1 : 0;
495 result += s12 == s12 ? 1 : 0;
499 static int GeodSolve59() {
501 double azi1, azi2, s12;
505 geod_inverse(&
g, 5, 0.00000000000001, 10, 180, &s12, &azi1, &azi2);
506 result += assertEquals(azi1, 0.000000000000035, 1.5
e-14);
507 result += assertEquals(azi2, 179.99999999999996, 1.5
e-14);
508 result += assertEquals(s12, 18345191.174332713, 2.5
e-9);
512 static int GeodSolve61() {
514 double lat2, lon2, azi2;
521 &lat2, &lon2, &azi2, 0, 0, 0, 0, 0);
522 result += assertEquals(lat2, 45.30632, 0.5
e-5);
523 result += assertEquals(lon2, -180, 0.5
e-5);
526 geod_genposition(&
l, flags, 1e7, &lat2, &lon2, &azi2, 0, 0, 0, 0, 0);
527 result += assertEquals(lat2, 45.30632, 0.5
e-5);
528 result += assertEquals(lon2, -180, 0.5
e-5);
533 static int GeodSolve65() {
537 double lat2, lon2, azi2, s12, a12, m12, M12, M21, S12;
545 &lat2, &lon2, &azi2, &s12, &m12, &M12, &M21, &S12);
546 result += assertEquals(lat2, -60.23169, 0.5
e-5);
547 result += assertEquals(lon2, -0.00000, 0.5
e-5);
548 result += assertEquals(
fabs(azi2), 180.00000, 0.5
e-5);
549 result += assertEquals(s12, 10000000, 0.5);
550 result += assertEquals(a12, 90.06544, 0.5
e-5);
551 result += assertEquals(m12, 6363636, 0.5);
552 result += assertEquals(M12, -0.0012834, 0.5
e-7);
553 result += assertEquals(M21, 0.0013749, 0.5
e-7);
554 result += assertEquals(S12, 0, 0.5);
556 &lat2, &lon2, &azi2, &s12, &m12, &M12, &M21, &S12);
557 result += assertEquals(lat2, -30.03547, 0.5
e-5);
558 result += assertEquals(lon2, -180.00000, 0.5
e-5);
559 result += assertEquals(azi2, -0.00000, 0.5
e-5);
560 result += assertEquals(s12, 20000000, 0.5);
561 result += assertEquals(a12, 179.96459, 0.5
e-5);
562 result += assertEquals(m12, 54342, 0.5);
563 result += assertEquals(M12, -1.0045592, 0.5
e-7);
564 result += assertEquals(M21, -0.9954339, 0.5
e-7);
565 result += assertEquals(S12, 127516405431022.0, 0.5);
569 static int GeodSolve67() {
572 double lat2, lon2, azi2;
579 geod_genposition(&
l, flags, 2e7, &lat2, &lon2, &azi2, 0, 0, 0, 0, 0);
580 result += assertEquals(lat2, 4.96445, 0.5
e-5);
581 result += assertEquals(lon2, -180.00000, 0.5
e-5);
582 result += assertEquals(azi2, -0.00000, 0.5
e-5);
583 geod_genposition(&
l, flags, 0.5 *
l.s13, &lat2, &lon2, &azi2, 0, 0, 0, 0, 0);
584 result += assertEquals(lat2, -87.52461, 0.5
e-5);
585 result += assertEquals(lon2, -0.00000, 0.5
e-5);
586 result += assertEquals(azi2, -180.00000, 0.5
e-5);
590 static int GeodSolve71() {
592 double lat2, lon2, azi2;
599 result += assertEquals(lat2, 30.92625, 0.5
e-5);
600 result += assertEquals(lon2, 37.54640, 0.5
e-5);
601 result += assertEquals(azi2, 55.43104, 0.5
e-5);
605 static int GeodSolve73() {
609 double lat2, lon2, azi2;
614 &lat2, &lon2, &azi2);
615 result += assertEquals(lat2, 81.04623, 0.5
e-5);
616 result += assertEquals(lon2, -170, 0.5
e-5);
617 result += assertEquals(azi2, 0, 0.5
e-5);
622 double points[][2],
int N,
623 double* perimeter,
double* area) {
627 for (
i = 0;
i <
N; ++
i)
633 double points[][2],
int N,
638 for (
i = 0;
i <
N; ++
i)
643 static int GeodSolve74() {
646 double a12, s12, azi1, azi2, m12, M12, M21, S12;
651 &s12, &azi1, &azi2, &m12, &M12, &M21, &S12);
652 result += assertEquals(azi1, 55.723110355, 5
e-9);
653 result += assertEquals(azi2, 55.723515675, 5
e-9);
654 result += assertEquals(s12, 39.527686385, 5
e-9);
655 result += assertEquals(a12, 0.000355495, 5
e-9);
656 result += assertEquals(m12, 39.527686385, 5
e-9);
657 result += assertEquals(M12, 0.999999995, 5
e-9);
658 result += assertEquals(M21, 0.999999995, 5
e-9);
659 result += assertEquals(S12, 286698586.30197, 5
e-4);
663 static int GeodSolve76() {
666 double azi1, azi2, s12;
670 geod_inverse(&
g, -(41+19/60.0), 174+49/60.0, 40+58/60.0, -(5+30/60.0),
672 result += assertEquals(azi1, 160.39137649664, 0.5
e-11);
673 result += assertEquals(azi2, 19.50042925176, 0.5
e-11);
674 result += assertEquals(s12, 19960543.857179, 0.5
e-6);
678 static int GeodSolve78() {
680 double azi1, azi2, s12;
684 geod_inverse(&
g, 27.2, 0.0, -27.1, 179.5, &s12, &azi1, &azi2);
685 result += assertEquals(azi1, 45.82468716758, 0.5
e-11);
686 result += assertEquals(azi2, 134.22776532670, 0.5
e-11);
687 result += assertEquals(s12, 19974354.765767, 0.5
e-6);
691 static int Planimeter0() {
693 double pa[4][2] = {{89, 0}, {89, 90}, {89, 180}, {89, 270}};
694 double pb[4][2] = {{-89, 0}, {-89, 90}, {-89, 180}, {-89, 270}};
695 double pc[4][2] = {{0, -1}, {-1, 0}, {0, 1}, {1, 0}};
696 double pd[3][2] = {{90, 0}, {0, 0}, {0, 90}};
698 double perimeter, area;
702 planimeter(&
g, pa, 4, &perimeter, &area);
703 result += assertEquals(perimeter, 631819.8745, 1
e-4);
704 result += assertEquals(area, 24952305678.0, 1);
706 planimeter(&
g, pb, 4, &perimeter, &area);
707 result += assertEquals(perimeter, 631819.8745, 1
e-4);
708 result += assertEquals(area, -24952305678.0, 1);
710 planimeter(&
g,
pc, 4, &perimeter, &area);
711 result += assertEquals(perimeter, 627598.2731, 1
e-4);
712 result += assertEquals(area, 24619419146.0, 1);
714 planimeter(&
g, pd, 3, &perimeter, &area);
715 result += assertEquals(perimeter, 30022685, 1);
716 result += assertEquals(area, 63758202715511.0, 1);
718 polylength(&
g, pd, 3, &perimeter);
719 result += assertEquals(perimeter, 20020719, 1);
724 static int Planimeter5() {
726 double points[3][2] = {{89, 0.1}, {89, 90.1}, {89, -179.9}};
728 double perimeter, area;
731 planimeter(&
g, points, 3, &perimeter, &area);
732 result += assertEquals(perimeter, 539297, 1);
733 result += assertEquals(area, 12476152838.5, 1);
737 static int Planimeter6() {
739 double pa[3][2] = {{9, -0.00000000000001}, {9, 180}, {9, 0}};
740 double pb[3][2] = {{9, 0.00000000000001}, {9, 0}, {9, 180}};
741 double pc[3][2] = {{9, 0.00000000000001}, {9, 180}, {9, 0}};
742 double pd[3][2] = {{9, -0.00000000000001}, {9, 0}, {9, 180}};
744 double perimeter, area;
748 planimeter(&
g, pa, 3, &perimeter, &area);
749 result += assertEquals(perimeter, 36026861, 1);
750 result += assertEquals(area, 0, 1);
751 planimeter(&
g, pb, 3, &perimeter, &area);
752 result += assertEquals(perimeter, 36026861, 1);
753 result += assertEquals(area, 0, 1);
754 planimeter(&
g,
pc, 3, &perimeter, &area);
755 result += assertEquals(perimeter, 36026861, 1);
756 result += assertEquals(area, 0, 1);
757 planimeter(&
g, pd, 3, &perimeter, &area);
758 result += assertEquals(perimeter, 36026861, 1);
759 result += assertEquals(area, 0, 1);
763 static int Planimeter12() {
765 double points[2][2] = {{66.562222222, 0}, {66.562222222, 180}};
767 double perimeter, area;
770 planimeter(&
g, points, 2, &perimeter, &area);
771 result += assertEquals(perimeter, 10465729, 1);
772 result += assertEquals(area, 0, 1);
776 static int Planimeter13() {
778 double points[6][2] = {{89,-360}, {89,-240}, {89,-120},
779 {89,0}, {89,120}, {89,240}};
781 double perimeter, area;
784 planimeter(&
g, points, 6, &perimeter, &area);
785 result += assertEquals(perimeter, 1160741, 1);
786 result += assertEquals(area, 32415230256.0, 1);
792 if ((
i = testinverse())) {++
n; printf(
"testinverse fail: %d\n",
i);}
793 if ((
i = testdirect())) {++
n; printf(
"testdirect fail: %d\n",
i);}
794 if ((
i = testarcdirect())) {++
n; printf(
"testarcdirect fail: %d\n",
i);}
795 if ((
i = GeodSolve0())) {++
n; printf(
"GeodSolve0 fail: %d\n",
i);}
796 if ((
i = GeodSolve1())) {++
n; printf(
"GeodSolve1 fail: %d\n",
i);}
797 if ((
i = GeodSolve2())) {++
n; printf(
"GeodSolve2 fail: %d\n",
i);}
798 if ((
i = GeodSolve4())) {++
n; printf(
"GeodSolve4 fail: %d\n",
i);}
799 if ((
i = GeodSolve5())) {++
n; printf(
"GeodSolve5 fail: %d\n",
i);}
800 if ((
i = GeodSolve6())) {++
n; printf(
"GeodSolve6 fail: %d\n",
i);}
801 if ((
i = GeodSolve9())) {++
n; printf(
"GeodSolve9 fail: %d\n",
i);}
802 if ((
i = GeodSolve10())) {++
n; printf(
"GeodSolve10 fail: %d\n",
i);}
803 if ((
i = GeodSolve11())) {++
n; printf(
"GeodSolve11 fail: %d\n",
i);}
804 if ((
i = GeodSolve12())) {++
n; printf(
"GeodSolve12 fail: %d\n",
i);}
805 if ((
i = GeodSolve14())) {++
n; printf(
"GeodSolve14 fail: %d\n",
i);}
806 if ((
i = GeodSolve15())) {++
n; printf(
"GeodSolve15 fail: %d\n",
i);}
807 if ((
i = GeodSolve17())) {++
n; printf(
"GeodSolve17 fail: %d\n",
i);}
808 if ((
i = GeodSolve26())) {++
n; printf(
"GeodSolve26 fail: %d\n",
i);}
809 if ((
i = GeodSolve28())) {++
n; printf(
"GeodSolve28 fail: %d\n",
i);}
810 if ((
i = GeodSolve33())) {++
n; printf(
"GeodSolve33 fail: %d\n",
i);}
811 if ((
i = GeodSolve55())) {++
n; printf(
"GeodSolve55 fail: %d\n",
i);}
812 if ((
i = GeodSolve59())) {++
n; printf(
"GeodSolve59 fail: %d\n",
i);}
813 if ((
i = GeodSolve61())) {++
n; printf(
"GeodSolve61 fail: %d\n",
i);}
814 if ((
i = GeodSolve65())) {++
n; printf(
"GeodSolve65 fail: %d\n",
i);}
815 if ((
i = GeodSolve67())) {++
n; printf(
"GeodSolve67 fail: %d\n",
i);}
816 if ((
i = GeodSolve71())) {++
n; printf(
"GeodSolve71 fail: %d\n",
i);}
817 if ((
i = GeodSolve73())) {++
n; printf(
"GeodSolve73 fail: %d\n",
i);}
818 if ((
i = GeodSolve74())) {++
n; printf(
"GeodSolve74 fail: %d\n",
i);}
819 if ((
i = GeodSolve76())) {++
n; printf(
"GeodSolve76 fail: %d\n",
i);}
820 if ((
i = GeodSolve78())) {++
n; printf(
"GeodSolve78 fail: %d\n",
i);}
821 if ((
i = Planimeter0())) {++
n; printf(
"Planimeter0 fail: %d\n",
i);}
822 if ((
i = Planimeter5())) {++
n; printf(
"Planimeter5 fail: %d\n",
i);}
823 if ((
i = Planimeter6())) {++
n; printf(
"Planimeter6 fail: %d\n",
i);}
824 if ((
i = Planimeter12())) {++
n; printf(
"Planimeter12 fail: %d\n",
i);}
825 if ((
i = Planimeter13())) {++
n; printf(
"Planimeter13 fail: %d\n",
i);}