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