GeoTessCPP  2.6.1
Software to facilitate storage and retrieval of 3D information about the Earth.
All Classes Namespaces Files Functions Variables Typedefs Friends Macros
GeoTessUtils.h
Go to the documentation of this file.
1 //- ****************************************************************************
2 //-
3 //- Copyright 2009 Sandia Corporation. Under the terms of Contract
4 //- DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
5 //- retains certain rights in this software.
6 //-
7 //- BSD Open Source License.
8 //- All rights reserved.
9 //-
10 //- Redistribution and use in source and binary forms, with or without
11 //- modification, are permitted provided that the following conditions are met:
12 //-
13 //- * Redistributions of source code must retain the above copyright notice,
14 //- this list of conditions and the following disclaimer.
15 //- * Redistributions in binary form must reproduce the above copyright
16 //- notice, this list of conditions and the following disclaimer in the
17 //- documentation and/or other materials provided with the distribution.
18 //- * Neither the name of Sandia National Laboratories nor the names of its
19 //- contributors may be used to endorse or promote products derived from
20 //- this software without specific prior written permission.
21 //-
22 //- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 //- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 //- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 //- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
26 //- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 //- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 //- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 //- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 //- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 //- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 //- POSSIBILITY OF SUCH DAMAGE.
33 //-
34 //- ****************************************************************************
35 
36 #ifndef GEOTESSUTILS_OBJECT_H
37 #define GEOTESSUTILS_OBJECT_H
38 
39 // **** _SYSTEM INCLUDES_ ******************************************************
40 
41 #include <iostream>
42 #include <fstream>
43 #include <vector>
44 #include <map>
45 #include <string>
46 
47 // use standard library objects
48 using namespace std;
49 
50 // **** _LOCAL INCLUDES_ *******************************************************
51 
52 #include "CPPUtils.h"
53 
54 // **** _BEGIN GEOTESS NAMESPACE_ **********************************************
55 
56 namespace geotess
57 {
58 
59 // **** _FORWARD REFERENCES_ ***************************************************
60 
61 // **** _CLASS DEFINITION_ *****************************************************
62 
70 {
71 private:
72 
73  /*
74  * Private copy constructor. Not used.
75  */
76  GeoTessUtils(const GeoTessUtils& gtu) { }
77 
78  /*
79  * Private assignment operator. Not used.
80  */
81  GeoTessUtils& operator=(const GeoTessUtils& gtu) { return *this; }
82 
83 public:
84 
95  static bool approximateLatitudes;
96 
101 
105  virtual ~GeoTessUtils() { }
106 
111  static string class_name()
112  { return "GeoTessUtils"; }
113 
118  virtual int class_size() const
119  { return (int) sizeof(GeoTessUtils); }
120 
125  static string getVersion() { return "2.6.1"; }
126 
134  static double dot(const double* const v0, const double* const v1)
135  { return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2]; }
136 
146  static double scalarTripleProduct(const double* const v0,
147  const double* const v1, const double* const v2)
148  {
149  return v0[0] * v1[1] * v2[2] + v1[0] * v2[1] * v0[2]
150  + v2[0] * v0[1] * v1[2] - v2[0] * v1[1] * v0[2]
151  - v0[0] * v2[1] * v1[2] - v1[0] * v0[1] * v2[2];
152  }
153 
161  static double getGeocentricLat(const double& lat);
162 
170  static double getGeographicLat(const double& lat);
171 
173 
182  static double getGeoCentricLatitude(const double& lat) { return getGeocentricLat(lat); }
183 
192  static double getGeoGraphicLatitude(const double& lat) { return getGeographicLat(lat); }
193 
195 
200  static string getLatLonString(const double* const v);
201 
206  static string getLonLatString(const double* const v);
207 
208 
223  static double azimuthDegrees(const double* const v1, const double* const v2,
224  double errorValue);
225 
240  static double azimuth(const double* const v1, const double* const v2,
241  double errorValue);
242 
257 static void rotate(const double* const x, const double* const p, double a,
258  double* const z);
259 
282  static double** getGreatCircle(const double* const v0,
283  const double* const v1);
284 
307  static void getGreatCircle(const double* const v0, const double* const v1,
308  double** const gc);
309 
334  static double** getGreatCircle(const double* const v, double azimuth);
335 
360  static void getGreatCircle(const double* const v, double azimuth,
361  double** const gc);
362 
375  static int getGreatCirclePoints(double* ptA, double* ptB,
376  const double& delta, const bool& onCenters);
377 
391  static double getGreatCirclePoints(double* ptA, double* ptB,
392  const int& npoints, const bool& onCenters, double** points);
393 
410  static double getGreatCirclePoints(double* ptA, double* ptB,
411  const double& delta, const bool& onCenters, double** points,
412  int& npoints);
413 
420  static double length(const double* const u)
421  {
422  double l = u[0] * u[0] + u[1] * u[1] + u[2] * u[2];
423  return l > 0 ? sqrt(l) : 0.;
424  }
425 
438  static void getTransform(const double* const u, const double* const v,
439  double** const t);
440 
456  static void transform(const double* x,
457  double const* const * const t, double* const g)
458  {
459  g[0] = x[0] * t[0][0] + x[1] * t[0][1] + x[2] * t[0][2];
460  g[1] = x[0] * t[1][0] + x[1] * t[1][1] + x[2] * t[1][2];
461  g[2] = x[0] * t[2][0] + x[1] * t[2][1] + x[2] * t[2][2];
462  }
463 
469  static void readString(string& s, ifstream& ifs)
470  {
471  int sze;
472  ifs >> sze;
473  char* c = new char[sze];
474  ifs.read(c, sze);
475  s = c;
476  delete[] c;
477  }
478 
484  static void writeString(ofstream& ofs, const string& s)
485  {
486  ofs << s.length();
487  ofs.write(s.c_str(), s.length());
488  }
489 
497  static double angle(const double* const v0,
498  const double* const v1)
499  {
500  double dot = v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2];
501  if (dot >= 1.0)
502  return 0.0;
503  if (dot <= -1.0)
504  return PI;
505  return acos(dot);
506  }
507 
515  static double angleDegrees(const double* const v0,
516  const double* const v1)
517  {
518  double dot = v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2];
519  if (dot >= 1.)
520  return 0.;
521  if (dot <= -1.)
522  return 180.;
523  return CPPUtils::toDegrees(acos(dot));
524  }
525 
537  static double getDistance3D(const double* const v0, double r0,
538  const double* const v1, double r1)
539  {
540  double v[3] = { v0[0] * r0 - v1[0] * r1, v0[1] * r0 - v1[1] * r1, v0[2] * r0
541  - v1[2] * r1 };
542  return length(v);
543  }
544 
553  static double getEarthRadius(const double* const v)
554  { return EARTH_A / sqrt(1. + EARTH_E / (1 - EARTH_E) * v[2] * v[2]); }
555 
563  static double getLat(const double* const v)
564  { return getGeographicLat(asin(v[2])); }
565 
572  static double getLon(const double* const v)
573  { return atan2(v[1], v[0]); }
574 
582  static double getLatDegrees(const double* const v)
583  {
584  // the constant 0.9933 is (1-e*e) where e is the eccentricity of the
585  // earth as defined by the WGS84 ellipsoid.
586  return CPPUtils::toDegrees(atan(tan(asin(v[2])) / 0.9933056199770992));
587  }
588 
595  static double getLonDegrees(const double* const v)
596  { return CPPUtils::toDegrees(atan2(v[1], v[0])); }
597 
610  static double* getVectorDegrees(const double& lat,
611  const double& lon)
612  { return getVector(CPPUtils::toRadians(lat), CPPUtils::toRadians(lon)); }
613 
625  static double* getVectorDegrees(const double& lat,
626  const double& lon, double* v)
627  { return getVector(CPPUtils::toRadians(lat), CPPUtils::toRadians(lon), v); }
628 
641  static double* getVector(const double& lat, const double& lon)
642  {
643  double* v = new double[3];
644  getVector(lat, lon, v);
645  return v;
646  }
647 
659  static double* getVector(const double& lat, const double& lon, double* v)
660  {
661  // convert lat from geographic to geocentric latitude.
662  double temp = getGeocentricLat(lat);
663 
664  // z component of v is sin of geocentric latitude.
665  v[2] = sin(temp);
666 
667  // set lat = to cos of geocentric latitude
668  temp = cos(temp);
669 
670  // compute x and y components of v
671  v[0] = temp * cos(lon);
672  v[1] = temp * sin(lon);
673 
674  return v;
675  }
676 
685  static void normalizeFast(double* const u)
686  {
687  double len = u[0] * u[0] + u[1] * u[1] + u[2] * u[2];
688  len = sqrt(len);
689  u[0] /= len;
690  u[1] /= len;
691  u[2] /= len;
692  }
693 
701  static double normalize(double* const u)
702  {
703  double len = u[0] * u[0] + u[1] * u[1] + u[2] * u[2];
704  if (len > 0.)
705  {
706  len = sqrt(len);
707  u[0] /= len;
708  u[1] /= len;
709  u[2] /= len;
710  }
711  else
712  {
713  len = u[0] = u[1] = u[2] = 0.0;
714  }
715  return len;
716  }
717 
728  static void cross(const double* const v1, const double* const v2,
729  double* const rslt)
730  {
731  rslt[0] = v1[1] * v2[2] - v1[2] * v2[1];
732  rslt[1] = v1[2] * v2[0] - v1[0] * v2[2];
733  rslt[2] = v1[0] * v2[1] - v1[1] * v2[0];
734  }
735 
746  static double* crossNormal(const double* const u,
747  const double* const v)
748  {
749  double* w = new double[3];
750  w[0] = u[1] * v[2] - u[2] * v[1];
751  w[1] = u[2] * v[0] - u[0] * v[2];
752  w[2] = u[0] * v[1] - u[1] * v[0];
753  normalize(w);
754  return w;
755  }
756 
769  static double crossNormal(const double* const u,
770  const double* const v, double* const w)
771  {
772  w[0] = u[1] * v[2] - u[2] * v[1];
773  w[1] = u[2] * v[0] - u[0] * v[2];
774  w[2] = u[0] * v[1] - u[1] * v[0];
775  return normalize(w);
776  }
777 
790  static double crossNorth(const double* const u, double* const w)
791  {
792  double len = u[0] * u[0] + u[1] * u[1];
793  if (len <= 0.)
794  {
795  len = w[0] = w[1] = w[2] = 0.;
796  }
797  else
798  {
799  len = sqrt(len);
800  w[0] = u[1] / len;
801  w[1] = -u[0] / len;
802  w[2] = 0.;
803  }
804  return len;
805  }
806 
822  static bool vectorTripleProduct(const double* const v0,
823  const double* const v1, const double* const v2, double* const rslt)
824  {
825  // set q = v0 cross v1
826  double q0 = v0[1] * v1[2] - v0[2] * v1[1];
827  double q1 = v0[2] * v1[0] - v0[0] * v1[2];
828  double q2 = v0[0] * v1[1] - v0[1] * v1[0];
829 
830  // set w = q cross v2
831  double w0 = q1 * v2[2] - q2 * v2[1];
832  double w1 = q2 * v2[0] - q0 * v2[2];
833  double w2 = q0 * v2[1] - q1 * v2[0];
834 
835  // set rslt = w
836  rslt[0] = w0;
837  rslt[1] = w1;
838  rslt[2] = w2;
839 
840  // normalize rslt to unit length. if the length
841  // of v1 or v2 is zero or they are nearly parallel then
842  // rslt will = {0,0,0} and the function will return false;
843  return normalize(rslt) != 0.;
844  }
845 
856  static bool vectorTripleProductNorthPole(const double* const u,
857  double* const w)
858  {
859  w[0] = -u[0] * u[2];
860  w[1] = -u[1] * u[2];
861  w[2] = u[1] * u[1] + u[0] * u[0];
862  return normalize(w) != 0.;
863  }
864 
875  static void circumCenter(const double* const v0,
876  const double* const v1, const double* const v2, double* const vs)
877  {
878  vs[0] = v0[1] * (v2[2] - v1[2]) + v2[1] * (v1[2] - v0[2]) + v1[1] * (v0[2] - v2[2]);
879  vs[1] = v0[2] * (v2[0] - v1[0]) + v2[2] * (v1[0] - v0[0]) + v1[2] * (v0[0] - v2[0]);
880  vs[2] = v0[0] * (v2[1] - v1[1]) + v2[0] * (v1[1] - v0[1]) + v1[0] * (v0[1] - v2[1]);
881  double len = vs[0] * vs[0] + vs[1] * vs[1] + vs[2] * vs[2];
882  len = sqrt(len);
883  vs[0] /= len;
884  vs[1] /= len;
885  vs[2] /= len;
886  }
887 
900  static void circumCenterPlus(const double* const v0,
901  const double* const v1, const double* const v2, double* const vs)
902  {
903  vs[0] = v0[1] * (v2[2] - v1[2]) + v2[1] * (v1[2] - v0[2]) + v1[1] * (v0[2] - v2[2]);
904  vs[1] = v0[2] * (v2[0] - v1[0]) + v2[2] * (v1[0] - v0[0]) + v1[2] * (v0[0] - v2[0]);
905  vs[2] = v0[0] * (v2[1] - v1[1]) + v2[0] * (v1[1] - v0[1]) + v1[0] * (v0[1] - v2[1]);
906  double len = vs[0] * vs[0] + vs[1] * vs[1] + vs[2] * vs[2];
907  len = sqrt(len);
908  vs[0] /= len;
909  vs[1] /= len;
910  vs[2] /= len;
911  vs[3] = dot(vs, v0);
912  }
913 
929  static double* circumCenterPlus(const double* const v0,
930  const double* const v1, const double* const v2)
931  {
932  double* vs = new double[4];
933  vs[0] = v0[1] * (v2[2] - v1[2]) + v2[1] * (v1[2] - v0[2]) + v1[1] * (v0[2] - v2[2]);
934  vs[1] = v0[2] * (v2[0] - v1[0]) + v2[2] * (v1[0] - v0[0]) + v1[2] * (v0[0] - v2[0]);
935  vs[2] = v0[0] * (v2[1] - v1[1]) + v2[0] * (v1[1] - v0[1]) + v1[0] * (v0[1] - v2[1]);
936  double len = vs[0] * vs[0] + vs[1] * vs[1] + vs[2] * vs[2];
937  len = sqrt(len);
938  vs[0] /= len;
939  vs[1] /= len;
940  vs[2] /= len;
941  vs[3] = dot(vs, v0);
942  return vs;
943  }
944 
959  static void circumCenterPlus(double const* const * const t, double* const vs)
960  { circumCenterPlus(t[0], t[1], t[2], vs); }
961 
977  static bool moveDistAz(const double* const w, double distance,
978  double azimuth, double* const u)
979  {
980  double n[3] = { 0.0, 0.0, 0.0 };
981  if (moveNorth(w, distance, n))
982  {
983  rotate(n, w, azimuth, u);
984  return true;
985  }
986  u[0] = w[0];
987  u[1] = w[1];
988  u[2] = w[2];
989  return false;
990  }
991 
1005  static void move(const double* const w, const double* const vtp,
1006  double a, double* const u)
1007  {
1008  double cosa = cos(a);
1009  double sina = sin(a);
1010  u[0] = cosa * w[0] + sina * vtp[0];
1011  u[1] = cosa * w[1] + sina * vtp[1];
1012  u[2] = cosa * w[2] + sina * vtp[2];
1013  }
1014 
1029  static bool moveNorth(const double* const x, double distance,
1030  double* const z)
1031  {
1032  double vtp[3] = { 0.0, 0.0, 0.0 };
1033  if (vectorTripleProductNorthPole(x, vtp))
1034  {
1035  move(x, vtp, distance, z);
1036  return true;
1037  }
1038 
1039  z[0] = x[0];
1040  z[1] = x[1];
1041  z[2] = x[2];
1042  return false;
1043  }
1044 
1052  static bool isPole(const double* const u)
1053  {
1054  return (u[0] * u[0] + u[1] * u[1]) < 1.0e-15;
1055  }
1056 
1066  static bool parallel(const double* const u, const double* const v)
1067  {
1068  return 1.0 - abs(u[0] * v[0] + u[1] * v[1] + u[2] * v[2]) < 2.0e-15;
1069  }
1070 
1087  static double* getGreatCirclePoint(
1088  double const* const * const greatCircle, double distance)
1089  {
1090  double* v = new double[3];
1091  getGreatCirclePoint(greatCircle, distance, v);
1092  return v;
1093  }
1094 
1112  static void getGreatCirclePoint(
1113  double const* const * const greatCircle, double distance,
1114  double* const v)
1115  {
1116  double cosa = cos(distance);
1117  double sina = sin(distance);
1118  v[0] = cosa * greatCircle[0][0] + sina * greatCircle[1][0];
1119  v[1] = cosa * greatCircle[0][1] + sina * greatCircle[1][1];
1120  v[2] = cosa * greatCircle[0][2] + sina * greatCircle[1][2];
1121  }
1122 
1129  static double getTriangleArea(const double* const v0,
1130  const double* const v1, const double* const v2)
1131  {
1132  double v10[3] = { v1[0] - v0[0], v1[1] - v0[1], v1[2] - v0[2] };
1133  double v20[3] = { v2[0] - v0[0], v2[1] - v0[1], v2[2] - v0[2] };
1134  double u[3] = { v10[1] * v20[2] - v10[2] * v20[1], v10[2] * v20[0]
1135  - v10[0] * v20[2], v10[0] * v20[1] - v10[1] * v20[0] };
1136  return sqrt(u[0] * u[0] + u[1] * u[1] + u[2] * u[2]) / 2.;
1137  }
1138 
1148  static double getTriangleArea(const double* const v0,
1149  const double* const v1, const double* const v2, double* work1, double* work2, double* work3)
1150  {
1151  work1[0] = v1[0] - v0[0];
1152  work1[1] = v1[1] - v0[1];
1153  work1[2] = v1[2] - v0[2];
1154 
1155  work2[0] = v2[0] - v0[0];
1156  work2[1] = v2[1] - v0[1];
1157  work2[2] = v2[2] - v0[2];
1158 
1159  work3[0] = work1[1] * work2[2] - work1[2] * work2[1];
1160  work3[1] = work1[2] * work2[0] - work1[0] * work2[2];
1161  work3[2] = work1[0] * work2[1] - work1[1] * work2[0];
1162 
1163  return sqrt(work3[0] * work3[0] + work3[1] * work3[1] + work3[2] * work3[2]) / 2.;
1164  }
1165 
1173  static double* center(double const * const * const v, int n)
1174  {
1175  double* x = new double[3];
1176  x[0] = x[1] = x[2] = 0.0;
1177  if (n == 0)
1178  return x;
1179 
1180  for (int i = 0; i < n; ++i)
1181  {
1182  x[0] += v[i][0];
1183  x[1] += v[i][1];
1184  x[2] += v[i][2];
1185  }
1186  normalize(x);
1187  return x;
1188  }
1189 
1197  static void center(vector<double*> v, double* x)
1198  {
1199  x[0] = x[1] = x[2] = 0.0;
1200 
1201  for (size_t i = 0; i < v.size(); ++i)
1202  {
1203  x[0] += v[i][0];
1204  x[1] += v[i][1];
1205  x[2] += v[i][2];
1206  }
1207  normalize(x);
1208  }
1209 };
1210 // end class GeoTessUtils
1211 
1212 // **** _INLINE FUNCTION IMPLEMENTATIONS_ **************************************
1213 
1214 // conversion from geocentric to geographic latitude, in radians.
1215 static const double geographic[] = {
1216 -1.5707963267948966,
1217 -1.5707963267948966, -1.5677489031921250, -1.5647014788238576, -1.5616540529246252,
1218 -1.5586066247290158, -1.5555591934716986, -1.5525117583874544, -1.5494643187112020,
1219 -1.5464168736780266, -1.5433694225232062, -1.5403219644822410, -1.5372744987908793,
1220 -1.5342270246851464, -1.5311795414013718, -1.5281320481762162, -1.5250845442467005,
1221 -1.5220370288502316, -1.5189895012246317, -1.5159419606081646, -1.5128944062395640,
1222 -1.5098468373580602, -1.5067992532034090, -1.5037516530159180, -1.5007040360364745,
1223 -1.4976564015065728, -1.4946087486683413, -1.4915610767645720, -1.4885133850387440,
1224 -1.4854656727350555, -1.4824179390984470, -1.4793701833746320, -1.4763224048101213,
1225 -1.4732746026522530, -1.4702267761492180, -1.4671789245500877, -1.4641310471048419,
1226 -1.4610831430643942, -1.4580352116806217, -1.4549872522063898, -1.4519392638955806,
1227 -1.4488912460031191, -1.4458431977850015, -1.4427951184983205, -1.4397470074012940,
1228 -1.4366988637532907, -1.4336506868148570, -1.4306024758477454, -1.4275542301149386,
1229 -1.4245059488806797, -1.4214576314104954, -1.4184092769712255, -1.4153608848310480,
1230 -1.4123124542595058, -1.4092639845275337, -1.4062154749074850, -1.4031669246731584,
1231 -1.4001183330998220, -1.3970696994642429, -1.3940210230447112, -1.3909723031210681,
1232 -1.3879235389747300, -1.3848747298887172, -1.3818258751476769, -1.3787769740379130,
1233 -1.3757280258474085, -1.3726790298658542, -1.3696299853846736, -1.3665808916970477,
1234 -1.3635317480979430, -1.3604825538841352, -1.3574333083542363, -1.3543840108087190,
1235 -1.3513346605499443, -1.3482852568821840, -1.3452357991116488, -1.3421862865465124,
1236 -1.3391367184969374, -1.3360870942751000, -1.3330374131952152, -1.3299876745735633,
1237 -1.3269378777285121, -1.3238880219805456, -1.3208381066522850, -1.3177881310685170,
1238 -1.3147380945562173, -1.3116879964445736, -1.3086378360650126, -1.3055876127512245,
1239 -1.3025373258391855, -1.2994869746671844, -1.2964365585758457, -1.2933860769081540,
1240 -1.2903355290094787, -1.2872849142275975, -1.2842342319127213, -1.2811834814175174,
1241 -1.2781326620971334, -1.2750817733092212, -1.2720308144139612, -1.2689797847740851,
1242 -1.2659286837548998, -1.2628775107243113, -1.2598262650528476, -1.2567749461136817,
1243 -1.2537235532826554, -1.2506720859383025, -1.2476205434618720, -1.2445689252373493,
1244 -1.2415172306514815, -1.2384654590937990, -1.2354136099566380, -1.2323616826351630,
1245 -1.2293096765273912, -1.2262575910342110, -1.2232054255594090, -1.2201531795096878,
1246 -1.2171008522946918, -1.2140484433270270, -1.2109959520222835, -1.2079433777990571,
1247 -1.2048907200789720, -1.2018379782867012, -1.1987851518499886, -1.1957322401996706,
1248 -1.1926792427696968, -1.1896261589971520, -1.1865729883222764, -1.1835197301884879,
1249 -1.1804663840424017, -1.1774129493338514, -1.1743594255159102, -1.1713058120449116,
1250 -1.1682521083804690, -1.1651983139854960, -1.1621444283262286, -1.1590904508722426,
1251 -1.1560363810964758, -1.1529822184752465, -1.1499279624882743, -1.1468736126186994,
1252 -1.1438191683531016, -1.1407646291815210, -1.1377099945974760, -1.1346552640979840,
1253 -1.1316004371835788, -1.1285455133583318, -1.1254904921298676, -1.1224353730093866,
1254 -1.1193801555116805, -1.1163248391551530, -1.1132694234618365, -1.1102139079574118,
1255 -1.1071582921712249, -1.1041025756363059, -1.1010467578893872, -1.0979908384709198,
1256 -1.0949348169250928, -1.0918786927998494, -1.0888224656469052, -1.0857661350217649,
1257 -1.0827097004837398, -1.0796531615959652, -1.0765965179254158, -1.0735397690429236,
1258 -1.0704829145231949, -1.0674259539448256, -1.0643688868903185, -1.0613117129460985,
1259 -1.0582544317025300, -1.0551970427539317, -1.0521395456985925, -1.0490819401387883,
1260 -1.0460242256807961, -1.0429664019349100, -1.0399084685154565, -1.0368504250408095,
1261 -1.0337922711334060, -1.0307340064197588, -1.0276756305304735, -1.0246171431002629,
1262 -1.0215585437679590, -1.0184998321765302, -1.0154410079730933, -1.0123820708089293,
1263 -1.0093230203394952, -1.0062638562244390, -1.0032045781276135, -1.0001451857170887,
1264 -0.9970856786651652, -0.9940260566483880, -0.9909663193475587, -0.9879064664477488,
1265 -0.9848464976383120, -0.9817864126128968, -0.9787262110694590, -0.9756658927102736,
1266 -0.9726054572419468, -0.9695449043754286, -0.9664842338260234, -0.9634234453134026,
1267 -0.9603625385616154, -0.9573015132991002, -0.9542403692586956, -0.9511791061776521,
1268 -0.9481177237976417, -0.9450562218647695, -0.9419946001295835, -0.9389328583470855,
1269 -0.9358709962767409, -0.9328090136824890, -0.9297469103327525, -0.9266846860004473,
1270 -0.9236223404629921, -0.9205598735023176, -0.9174972849048763, -0.9144345744616503,
1271 -0.9113717419681617, -0.9083087872244800, -0.9052457100352315, -0.9021825102096069,
1272 -0.8991191875613709, -0.8960557419088682, -0.8929921730750334, -0.8899284808873974,
1273 -0.8868646651780957, -0.8838007257838750, -0.8807366625461014, -0.8776724753107666,
1274 -0.8746081639284953, -0.8715437282545516, -0.8684791681488458, -0.8654144834759410,
1275 -0.8623496741050579, -0.8592847399100833, -0.8562196807695732, -0.8531544965667609,
1276 -0.8500891871895607, -0.8470237525305747, -0.8439581924870967, -0.8408925069611178,
1277 -0.8378266958593319, -0.8347607590931386, -0.8316946965786500, -0.8286285082366928,
1278 -0.8255621939928134, -0.8224957537772827, -0.8194291875250981, -0.8163624951759885,
1279 -0.8132956766744170, -0.8102287319695851, -0.8071616610154342, -0.8040944637706497,
1280 -0.8010271401986641, -0.7979596902676580, -0.7948921139505637, -0.7918244112250671,
1281 -0.7887565820736097, -0.7856886264833902, -0.7826205444463665, -0.7795523359592570,
1282 -0.7764840010235420, -0.7734155396454647, -0.7703469518360321, -0.7672782376110162,
1283 -0.7642093969909539, -0.7611404300011481, -0.7580713366716669, -0.7550021170373452,
1284 -0.7519327711377832, -0.7488632990173464, -0.7457937007251657, -0.7427239763151360,
1285 -0.7396541258459155, -0.7365841493809252, -0.7335140469883469, -0.7304438187411222,
1286 -0.7273734647169510, -0.7243029849982892, -0.7212323796723475, -0.7181616488310889,
1287 -0.7150907925712262, -0.7120198109942198, -0.7089487042062748, -0.7058774723183379,
1288 -0.7028061154460953, -0.6997346337099688, -0.6966630272351121, -0.6935912961514075,
1289 -0.6905194405934625, -0.6874474607006055, -0.6843753566168813, -0.6813031284910476,
1290 -0.6782307764765696, -0.6751583007316160, -0.6720857014190538, -0.6690129787064436,
1291 -0.6659401327660337, -0.6628671637747551, -0.6597940719142159, -0.6567208573706956,
1292 -0.6536475203351388, -0.6505740610031495, -0.6475004795749841, -0.6444267762555459,
1293 -0.6413529512543770, -0.6382790047856527, -0.6352049370681742, -0.6321307483253605,
1294 -0.6290564387852420, -0.6259820086804524, -0.6229074582482208, -0.6198327877303641,
1295 -0.6167579973732786, -0.6136830874279318, -0.6106080581498534, -0.6075329097991277,
1296 -0.6044576426403837, -0.6013822569427861, -0.5983067529800269, -0.5952311310303151,
1297 -0.5921553913763675, -0.5890795343053987, -0.5860035601091116, -0.5829274690836870,
1298 -0.5798512615297728, -0.5767749377524746, -0.5736984980613438, -0.5706219427703677,
1299 -0.5675452721979585, -0.5644684866669408, -0.5613915865045422, -0.5583145720423796,
1300 -0.5552374436164493, -0.5521602015671145, -0.5490828462390925, -0.5460053779814434,
1301 -0.5429277971475571, -0.5398501040951412, -0.5367722991862070, -0.5336943827870587,
1302 -0.5306163552682779, -0.5275382170047123, -0.5244599683754603, -0.5213816097638592,
1303 -0.5183031415574704, -0.5152245641480652, -0.5121458779316114, -0.5090670833082580,
1304 -0.5059881806823221, -0.5029091704622723, -0.4998300530607160, -0.4967508288943822,
1305 -0.4936714983841087, -0.4905920619548242, -0.4875125200355348, -0.4844328730593077,
1306 -0.4813531214632545, -0.4782732656885168, -0.4751933061802482, -0.4721132433875999,
1307 -0.4690330777637020, -0.4659528097656490, -0.4628724398544813, -0.4597919684951693,
1308 -0.4567113961565957, -0.4536307233115377, -0.4505499504366511, -0.4474690780124505,
1309 -0.4443881065232937, -0.4413070364573617, -0.4382258683066425, -0.4351446025669108,
1310 -0.4320632397377119, -0.4289817803223404, -0.4259002248278240, -0.4228185737649034,
1311 -0.4197368276480125, -0.4166549869952609, -0.4135730523284130, -0.4104910241728699,
1312 -0.4074089030576480, -0.4043266895153610, -0.4012443840821984, -0.3981619872979068,
1313 -0.3950794997057681, -0.3919969218525802, -0.3889142542886367, -0.3858314975677045,
1314 -0.3827486522470051, -0.3796657188871915, -0.3765826980523292, -0.3734995903098728,
1315 -0.3704163962306467, -0.3673331163888213, -0.3642497513618933, -0.3611663017306622,
1316 -0.3580827680792097, -0.3549991509948770, -0.3519154510682416, -0.3488316688930969,
1317 -0.3457478050664276, -0.3426638601883887, -0.3395798348622813, -0.3364957296945312,
1318 -0.3334115452946638, -0.3303272822752831, -0.3272429412520464, -0.3241585228436426,
1319 -0.3210740276717675, -0.3179894563610997, -0.3149048095392786, -0.3118200878368778,
1320 -0.3087352918873839, -0.3056504223271693, -0.3025654797954709, -0.2994804649343629,
1321 -0.2963953783887339, -0.2933102208062620, -0.2902249928373890, -0.2871396951352969,
1322 -0.2840543283558812, -0.2809688931577279, -0.2778833902020855, -0.2747978201528420,
1323 -0.2717121836764979, -0.2686264814421417, -0.2655407141214227, -0.2624548823885265,
1324 -0.2593689869201489, -0.2562830283954686, -0.2531970074961227, -0.2501109249061789,
1325 -0.2470247813121108, -0.2439385774027693, -0.2408523138693584, -0.2377659914054063,
1326 -0.2346796107067404, -0.2315931724714588, -0.2285066773999049, -0.2254201261946395,
1327 -0.2223335195604130, -0.2192468582041398, -0.2161601428348690, -0.2130733741637589,
1328 -0.2099865529040473, -0.2068996797710264, -0.2038127554820124, -0.2007257807563200,
1329 -0.1976387563152328, -0.1945516828819765, -0.1914645611816903, -0.1883773919413984,
1330 -0.1852901758899828, -0.1822029137581537, -0.1791156062784226, -0.1760282541850719,
1331 -0.1729408582141288, -0.1698534191033340, -0.1667659375921156, -0.1636784144215582,
1332 -0.1605908503343753, -0.1575032460748804, -0.1544156023889568, -0.1513279200240304,
1333 -0.1482401997290386, -0.1451524422544033, -0.1420646483519993, -0.1389768187751272,
1334 -0.1358889542784822, -0.1328010556181263, -0.1297131235514570, -0.1266251588371797,
1335 -0.1235371622352770, -0.1204491345069784, -0.1173610764147325, -0.1142729887221751,
1336 -0.1111848721941013, -0.1080967275964339, -0.1050085556961953, -0.1019203572614753,
1337 -0.0988321330614037, -0.0957438838661177, -0.0926556104467337, -0.0895673135753164,
1338 -0.0864789940248483, -0.0833906525692003, -0.0803022899831004, -0.0772139070421047,
1339 -0.0741255045225655, -0.0710370832016027, -0.0679486438570714, -0.0648601872675336,
1340 -0.0617717142122262, -0.0586832254710305, -0.0555947218244430, -0.0525062040535433,
1341 -0.0494176729399648, -0.0463291292658628, -0.0432405738138854, -0.0401520073671412,
1342 -0.0370634307091703, -0.0339748446239121, -0.0308862498956756, -0.0277976473091088,
1343 -0.0247090376491666, -0.0216204217010820, -0.0185318002503333, -0.0154431740826154,
1344 -0.0123545439838071, -0.0092659107399420, -0.0061772751371762, -0.0030886379617588,
1345 0.0000000000000000, 0.0030886379617588, 0.0061772751371762, 0.0092659107399420,
1346 0.0123545439838071, 0.0154431740826154, 0.0185318002503333, 0.0216204217010820,
1347 0.0247090376491666, 0.0277976473091088, 0.0308862498956756, 0.0339748446239121,
1348 0.0370634307091703, 0.0401520073671412, 0.0432405738138854, 0.0463291292658628,
1349 0.0494176729399648, 0.0525062040535433, 0.0555947218244430, 0.0586832254710305,
1350 0.0617717142122262, 0.0648601872675336, 0.0679486438570714, 0.0710370832016027,
1351 0.0741255045225655, 0.0772139070421047, 0.0803022899831004, 0.0833906525692003,
1352 0.0864789940248483, 0.0895673135753164, 0.0926556104467337, 0.0957438838661177,
1353 0.0988321330614037, 0.1019203572614753, 0.1050085556961953, 0.1080967275964339,
1354 0.1111848721941013, 0.1142729887221751, 0.1173610764147325, 0.1204491345069784,
1355 0.1235371622352770, 0.1266251588371797, 0.1297131235514570, 0.1328010556181263,
1356 0.1358889542784822, 0.1389768187751272, 0.1420646483519993, 0.1451524422544033,
1357 0.1482401997290386, 0.1513279200240304, 0.1544156023889568, 0.1575032460748804,
1358 0.1605908503343753, 0.1636784144215582, 0.1667659375921156, 0.1698534191033340,
1359 0.1729408582141288, 0.1760282541850719, 0.1791156062784226, 0.1822029137581537,
1360 0.1852901758899828, 0.1883773919413984, 0.1914645611816903, 0.1945516828819765,
1361 0.1976387563152328, 0.2007257807563200, 0.2038127554820124, 0.2068996797710264,
1362 0.2099865529040473, 0.2130733741637589, 0.2161601428348690, 0.2192468582041398,
1363 0.2223335195604130, 0.2254201261946395, 0.2285066773999049, 0.2315931724714588,
1364 0.2346796107067404, 0.2377659914054063, 0.2408523138693584, 0.2439385774027693,
1365 0.2470247813121108, 0.2501109249061789, 0.2531970074961227, 0.2562830283954686,
1366 0.2593689869201489, 0.2624548823885265, 0.2655407141214227, 0.2686264814421417,
1367 0.2717121836764979, 0.2747978201528420, 0.2778833902020855, 0.2809688931577279,
1368 0.2840543283558812, 0.2871396951352969, 0.2902249928373890, 0.2933102208062620,
1369 0.2963953783887339, 0.2994804649343629, 0.3025654797954709, 0.3056504223271693,
1370 0.3087352918873839, 0.3118200878368778, 0.3149048095392786, 0.3179894563610997,
1371 0.3210740276717675, 0.3241585228436426, 0.3272429412520464, 0.3303272822752831,
1372 0.3334115452946638, 0.3364957296945312, 0.3395798348622813, 0.3426638601883887,
1373 0.3457478050664276, 0.3488316688930969, 0.3519154510682416, 0.3549991509948770,
1374 0.3580827680792097, 0.3611663017306622, 0.3642497513618933, 0.3673331163888213,
1375 0.3704163962306467, 0.3734995903098728, 0.3765826980523292, 0.3796657188871915,
1376 0.3827486522470051, 0.3858314975677045, 0.3889142542886367, 0.3919969218525802,
1377 0.3950794997057681, 0.3981619872979068, 0.4012443840821984, 0.4043266895153610,
1378 0.4074089030576480, 0.4104910241728699, 0.4135730523284130, 0.4166549869952609,
1379 0.4197368276480125, 0.4228185737649034, 0.4259002248278240, 0.4289817803223404,
1380 0.4320632397377117, 0.4351446025669111, 0.4382258683066425, 0.4413070364573617,
1381 0.4443881065232935, 0.4474690780124507, 0.4505499504366511, 0.4536307233115377,
1382 0.4567113961565955, 0.4597919684951695, 0.4628724398544813, 0.4659528097656488,
1383 0.4690330777637022, 0.4721132433875999, 0.4751933061802482, 0.4782732656885166,
1384 0.4813531214632548, 0.4844328730593077, 0.4875125200355348, 0.4905920619548240,
1385 0.4936714983841087, 0.4967508288943822, 0.4998300530607158, 0.5029091704622726,
1386 0.5059881806823221, 0.5090670833082580, 0.5121458779316113, 0.5152245641480654,
1387 0.5183031415574704, 0.5213816097638592, 0.5244599683754600, 0.5275382170047123,
1388 0.5306163552682779, 0.5336943827870585, 0.5367722991862072, 0.5398501040951412,
1389 0.5429277971475571, 0.5460053779814433, 0.5490828462390928, 0.5521602015671145,
1390 0.5552374436164493, 0.5583145720423793, 0.5613915865045422, 0.5644684866669408,
1391 0.5675452721979584, 0.5706219427703679, 0.5736984980613438, 0.5767749377524745,
1392 0.5798512615297726, 0.5829274690836871, 0.5860035601091116, 0.5890795343053986,
1393 0.5921553913763673, 0.5952311310303152, 0.5983067529800269, 0.6013822569427860,
1394 0.6044576426403839, 0.6075329097991278, 0.6106080581498534, 0.6136830874279315,
1395 0.6167579973732787, 0.6198327877303641, 0.6229074582482207, 0.6259820086804526,
1396 0.6290564387852421, 0.6321307483253605, 0.6352049370681740, 0.6382790047856529,
1397 0.6413529512543770, 0.6444267762555458, 0.6475004795749840, 0.6505740610031496,
1398 0.6536475203351388, 0.6567208573706955, 0.6597940719142161, 0.6628671637747552,
1399 0.6659401327660337, 0.6690129787064435, 0.6720857014190540, 0.6751583007316160,
1400 0.6782307764765694, 0.6813031284910472, 0.6843753566168814, 0.6874474607006055,
1401 0.6905194405934625, 0.6935912961514077, 0.6966630272351122, 0.6997346337099688,
1402 0.7028061154460952, 0.7058774723183380, 0.7089487042062748, 0.7120198109942197,
1403 0.7150907925712261, 0.7181616488310891, 0.7212323796723475, 0.7243029849982890,
1404 0.7273734647169512, 0.7304438187411223, 0.7335140469883469, 0.7365841493809251,
1405 0.7396541258459156, 0.7427239763151360, 0.7457937007251656, 0.7488632990173463,
1406 0.7519327711377833, 0.7550021170373452, 0.7580713366716668, 0.7611404300011482,
1407 0.7642093969909540, 0.7672782376110162, 0.7703469518360320, 0.7734155396454648,
1408 0.7764840010235420, 0.7795523359592569, 0.7826205444463663, 0.7856886264833903,
1409 0.7887565820736097, 0.7918244112250670, 0.7948921139505639, 0.7979596902676581,
1410 0.8010271401986641, 0.8040944637706496, 0.8071616610154343, 0.8102287319695851,
1411 0.8132956766744170, 0.8163624951759882, 0.8194291875250982, 0.8224957537772827,
1412 0.8255621939928133, 0.8286285082366929, 0.8316946965786500, 0.8347607590931386,
1413 0.8378266958593317, 0.8408925069611180, 0.8439581924870967, 0.8470237525305746,
1414 0.8500891871895606, 0.8531544965667610, 0.8562196807695732, 0.8592847399100831,
1415 0.8623496741050583, 0.8654144834759411, 0.8684791681488458, 0.8715437282545514,
1416 0.8746081639284954, 0.8776724753107666, 0.8807366625461013, 0.8838007257838747,
1417 0.8868646651780958, 0.8899284808873974, 0.8929921730750333, 0.8960557419088684,
1418 0.8991191875613709, 0.9021825102096069, 0.9052457100352312, 0.9083087872244802,
1419 0.9113717419681617, 0.9144345744616502, 0.9174972849048760, 0.9205598735023178,
1420 0.9236223404629921, 0.9266846860004472, 0.9297469103327527, 0.9328090136824891,
1421 0.9358709962767409, 0.9389328583470853, 0.9419946001295836, 0.9450562218647695,
1422 0.9481177237976417, 0.9511791061776519, 0.9542403692586957, 0.9573015132991002,
1423 0.9603625385616152, 0.9634234453134028, 0.9664842338260234, 0.9695449043754285,
1424 0.9726054572419467, 0.9756658927102736, 0.9787262110694590, 0.9817864126128968,
1425 0.9848464976383122, 0.9879064664477489, 0.9909663193475587, 0.9940260566483880,
1426 0.9970856786651654, 1.0001451857170889, 1.0032045781276135, 1.0062638562244390,
1427 1.0093230203394952, 1.0123820708089293, 1.0154410079730933, 1.0184998321765304,
1428 1.0215585437679590, 1.0246171431002629, 1.0276756305304735, 1.0307340064197590,
1429 1.0337922711334060, 1.0368504250408095, 1.0399084685154563, 1.0429664019349100,
1430 1.0460242256807961, 1.0490819401387883, 1.0521395456985927, 1.0551970427539317,
1431 1.0582544317025300, 1.0613117129460985, 1.0643688868903185, 1.0674259539448256,
1432 1.0704829145231949, 1.0735397690429234, 1.0765965179254158, 1.0796531615959652,
1433 1.0827097004837398, 1.0857661350217650, 1.0888224656469052, 1.0918786927998494,
1434 1.0949348169250925, 1.0979908384709200, 1.1010467578893872, 1.1041025756363059,
1435 1.1071582921712246, 1.1102139079574118, 1.1132694234618365, 1.1163248391551530,
1436 1.1193801555116807, 1.1224353730093866, 1.1254904921298676, 1.1285455133583315,
1437 1.1316004371835790, 1.1346552640979840, 1.1377099945974760, 1.1407646291815206,
1438 1.1438191683531016, 1.1468736126186994, 1.1499279624882743, 1.1529822184752467,
1439 1.1560363810964758, 1.1590904508722426, 1.1621444283262283, 1.1651983139854962,
1440 1.1682521083804690, 1.1713058120449116, 1.1743594255159100, 1.1774129493338514,
1441 1.1804663840424017, 1.1835197301884879, 1.1865729883222769, 1.1896261589971520,
1442 1.1926792427696968, 1.1957322401996704, 1.1987851518499888, 1.2018379782867012,
1443 1.2048907200789720, 1.2079433777990570, 1.2109959520222835, 1.2140484433270270,
1444 1.2171008522946918, 1.2201531795096880, 1.2232054255594090, 1.2262575910342110,
1445 1.2293096765273910, 1.2323616826351633, 1.2354136099566380, 1.2384654590937990,
1446 1.2415172306514812, 1.2445689252373493, 1.2476205434618720, 1.2506720859383025,
1447 1.2537235532826556, 1.2567749461136817, 1.2598262650528476, 1.2628775107243113,
1448 1.2659286837549000, 1.2689797847740851, 1.2720308144139612, 1.2750817733092210,
1449 1.2781326620971334, 1.2811834814175174, 1.2842342319127213, 1.2872849142275977,
1450 1.2903355290094787, 1.2933860769081540, 1.2964365585758455, 1.2994869746671847,
1451 1.3025373258391855, 1.3055876127512245, 1.3086378360650124, 1.3116879964445736,
1452 1.3147380945562173, 1.3177881310685170, 1.3208381066522852, 1.3238880219805456,
1453 1.3269378777285121, 1.3299876745735630, 1.3330374131952154, 1.3360870942751000,
1454 1.3391367184969374, 1.3421862865465122, 1.3452357991116488, 1.3482852568821840,
1455 1.3513346605499441, 1.3543840108087193, 1.3574333083542363, 1.3604825538841352,
1456 1.3635317480979428, 1.3665808916970479, 1.3696299853846736, 1.3726790298658542,
1457 1.3757280258474083, 1.3787769740379130, 1.3818258751476769, 1.3848747298887170,
1458 1.3879235389747302, 1.3909723031210681, 1.3940210230447112, 1.3970696994642426,
1459 1.4001183330998221, 1.4031669246731584, 1.4062154749074850, 1.4092639845275339,
1460 1.4123124542595058, 1.4153608848310480, 1.4184092769712255, 1.4214576314104956,
1461 1.4245059488806797, 1.4275542301149386, 1.4306024758477451, 1.4336506868148573,
1462 1.4366988637532907, 1.4397470074012940, 1.4427951184983208, 1.4458431977850015,
1463 1.4488912460031191, 1.4519392638955804, 1.4549872522063900, 1.4580352116806217,
1464 1.4610831430643942, 1.4641310471048417, 1.4671789245500880, 1.4702267761492180,
1465 1.4732746026522530, 1.4763224048101216, 1.4793701833746320, 1.4824179390984470,
1466 1.4854656727350553, 1.4885133850387442, 1.4915610767645720, 1.4946087486683413,
1467 1.4976564015065725, 1.5007040360364747, 1.5037516530159180, 1.5067992532034090,
1468 1.5098468373580605, 1.5128944062395640, 1.5159419606081646, 1.5189895012246315,
1469 1.5220370288502318, 1.5250845442467005, 1.5281320481762162, 1.5311795414013716,
1470 1.5342270246851466, 1.5372744987908793, 1.5403219644822408, 1.5433694225232064,
1471 1.5464168736780266, 1.5494643187112020, 1.5525117583874541, 1.5555591934716988,
1472 1.5586066247290158, 1.5616540529246252, 1.5647014788238574, 1.5677489031921252,
1473 1.5707963267948966, 1.5707963267948966 };
1474 
1475 // conversion from geographic to geocentric latitude, in radians.
1476 
1477 static const double geocentric[] = {
1478 -1.5707963267948966,
1479 -1.5707963267948966, -1.5677076888331378, -1.5646190516577203, -1.5615304160549546,
1480 -1.5584417828110895, -1.5553531527122813, -1.5522645265445634, -1.5491759050938145,
1481 -1.5460872891457300, -1.5429986794857877, -1.5399100768992209, -1.5368214821709845,
1482 -1.5337328960857262, -1.5306443194277555, -1.5275557529810110, -1.5244671975290338,
1483 -1.5213786538549317, -1.5182901227413532, -1.5152016049704535, -1.5121131013238660,
1484 -1.5090246125826705, -1.5059361395273627, -1.5028476829378250, -1.4997592435932938,
1485 -1.4966708222723310, -1.4935824197527918, -1.4904940368117963, -1.4874056742256963,
1486 -1.4843173327700483, -1.4812290132195800, -1.4781407163481628, -1.4750524429287788,
1487 -1.4719641937334929, -1.4688759695334213, -1.4657877710987013, -1.4626995991984626,
1488 -1.4596114546007952, -1.4565233380727216, -1.4534352503801642, -1.4503471922879183,
1489 -1.4472591645596196, -1.4441711679577170, -1.4410832032434395, -1.4379952711767703,
1490 -1.4349073725164143, -1.4318195080197693, -1.4287316784428974, -1.4256438845404933,
1491 -1.4225561270658580, -1.4194684067708663, -1.4163807244059399, -1.4132930807200161,
1492 -1.4102054764605212, -1.4071179123733384, -1.4040303892027810, -1.4009429076915625,
1493 -1.3978554685807678, -1.3947680726098246, -1.3916807205164740, -1.3885934130367428,
1494 -1.3855061509049138, -1.3824189348534980, -1.3793317656132063, -1.3762446439129201,
1495 -1.3731575704796637, -1.3700705460385765, -1.3669835713128842, -1.3638966470238703,
1496 -1.3608097738908493, -1.3577229526311376, -1.3546361839600276, -1.3515494685907568,
1497 -1.3484628072344835, -1.3453762006002570, -1.3422896493949916, -1.3392031543234377,
1498 -1.3361167160881562, -1.3330303353894903, -1.3299440129255382, -1.3268577493921272,
1499 -1.3237715454827859, -1.3206854018887175, -1.3175993192987738, -1.3145132983994277,
1500 -1.3114273398747476, -1.3083414444063700, -1.3052556126734738, -1.3021698453527548,
1501 -1.2990841431183986, -1.2959985066420545, -1.2929129365928111, -1.2898274336371687,
1502 -1.2867419984390154, -1.2836566316595996, -1.2805713339575073, -1.2774861059886347,
1503 -1.2744009484061627, -1.2713158618605336, -1.2682308469994257, -1.2651459044677273,
1504 -1.2620610349075128, -1.2589762389580188, -1.2558915172556180, -1.2528068704337967,
1505 -1.2497222991231292, -1.2466378039512538, -1.2435533855428500, -1.2404690445196138,
1506 -1.2373847815002328, -1.2343005971003653, -1.2312164919326152, -1.2281324666065077,
1507 -1.2250485217284690, -1.2219646579017995, -1.2188808757266550, -1.2157971758000197,
1508 -1.2127135587156865, -1.2096300250642344, -1.2065465754330034, -1.2034632104060754,
1509 -1.2003799305642500, -1.1972967364850238, -1.1942136287425673, -1.1911306079077050,
1510 -1.1880476745478916, -1.1849648292271922, -1.1818820725062600, -1.1787994049423160,
1511 -1.1757168270891285, -1.1726343394969900, -1.1695519427126981, -1.1664696372795356,
1512 -1.1633874237372486, -1.1603053026220267, -1.1572232744664834, -1.1541413397996356,
1513 -1.1510594991468840, -1.1479777530299930, -1.1448961019670723, -1.1418145464725562,
1514 -1.1387330870571848, -1.1356517242279858, -1.1325704584882540, -1.1294892903375349,
1515 -1.1264082202716028, -1.1233272487824462, -1.1202463763582455, -1.1171656034833588,
1516 -1.1140849306383010, -1.1110043582997270, -1.1079238869404153, -1.1048435170292479,
1517 -1.1017632490311946, -1.0986830834072967, -1.0956030206146483, -1.0925230611063799,
1518 -1.0894432053316420, -1.0863634537355888, -1.0832838067593618, -1.0802042648400725,
1519 -1.0771248284107880, -1.0740454979005143, -1.0709662737341807, -1.0678871563326242,
1520 -1.0648081461125745, -1.0617292434866386, -1.0586504488632850, -1.0555717626468313,
1521 -1.0524931852374262, -1.0494147170310375, -1.0463363584194363, -1.0432581097901843,
1522 -1.0401799715266187, -1.0371019440078382, -1.0340240276086896, -1.0309462226997554,
1523 -1.0278685296473395, -1.0247909488134530, -1.0217134805558040, -1.0186361252277820,
1524 -1.0155588831784472, -1.0124817547525171, -1.0094047402903543, -1.0063278401279556,
1525 -1.0032510545969382, -1.0001743840245287, -0.9970978287335528, -0.9940213890424220,
1526 -0.9909450652651237, -0.9878688577112096, -0.9847927666857850, -0.9817167924894978,
1527 -0.9786409354185291, -0.9755651957645814, -0.9724895738148697, -0.9694140698521104,
1528 -0.9663386841545130, -0.9632634169957689, -0.9601882686450431, -0.9571132393669648,
1529 -0.9540383294216180, -0.9509635390645325, -0.9478888685466756, -0.9448143181144442,
1530 -0.9417398880096545, -0.9386655784695360, -0.9355913897267224, -0.9325173220092438,
1531 -0.9294433755405196, -0.9263695505393507, -0.9232958472199123, -0.9202222657917470,
1532 -0.9171488064597577, -0.9140754694242008, -0.9110022548806807, -0.9079291630201415,
1533 -0.9048561940288629, -0.9017833480884530, -0.8987106253758427, -0.8956380260632806,
1534 -0.8925655503183270, -0.8894931983038491, -0.8864209701780152, -0.8833488660942911,
1535 -0.8802768862014340, -0.8772050306434891, -0.8741332995597845, -0.8710616930849278,
1536 -0.8679902113488013, -0.8649188544765588, -0.8618476225886219, -0.8587765158006768,
1537 -0.8557055342236701, -0.8526346779638075, -0.8495639471225490, -0.8464933417966074,
1538 -0.8434228620779456, -0.8403525080537744, -0.8372822798065497, -0.8342121774139714,
1539 -0.8311422009489811, -0.8280723504797606, -0.8250026260697307, -0.8219330277775502,
1540 -0.8188635556571134, -0.8157942097575512, -0.8127249901232296, -0.8096558967937485,
1541 -0.8065869298039426, -0.8035180891838803, -0.8004493749588645, -0.7973807871494317,
1542 -0.7943123257713546, -0.7912439908356396, -0.7881757823485300, -0.7851077003115063,
1543 -0.7820397447212868, -0.7789719155698294, -0.7759042128443329, -0.7728366365272386,
1544 -0.7697691865962324, -0.7667018630242468, -0.7636346657794624, -0.7605675948253116,
1545 -0.7575006501204794, -0.7544338316189082, -0.7513671392697986, -0.7483005730176139,
1546 -0.7452341328020831, -0.7421678185582038, -0.7391016302162466, -0.7360355677017578,
1547 -0.7329696309355647, -0.7299038198337787, -0.7268381343078000, -0.7237725742643218,
1548 -0.7207071396053357, -0.7176418302281357, -0.7145766460253233, -0.7115115868848132,
1549 -0.7084466526898385, -0.7053818433189556, -0.7023171586460507, -0.6992525985403449,
1550 -0.6961881628664013, -0.6931238514841299, -0.6900596642487952, -0.6869956010110216,
1551 -0.6839316616168009, -0.6808678459074992, -0.6778041537198631, -0.6747405848860284,
1552 -0.6716771392335258, -0.6686138165852896, -0.6655506167596651, -0.6624875395704165,
1553 -0.6594245848267348, -0.6563617523332462, -0.6532990418900204, -0.6502364532925790,
1554 -0.6471739863319046, -0.6441116407944493, -0.6410494164621440, -0.6379873131124075,
1555 -0.6349253305181557, -0.6318634684478110, -0.6288017266653131, -0.6257401049301271,
1556 -0.6226786029972549, -0.6196172206172444, -0.6165559575362010, -0.6134948134957965,
1557 -0.6104337882332812, -0.6073728814814939, -0.6043120929688732, -0.6012514224194678,
1558 -0.5981908695529498, -0.5951304340846230, -0.5920701157254376, -0.5890099141819997,
1559 -0.5859498291565846, -0.5828898603471477, -0.5798300074473378, -0.5767702701465086,
1560 -0.5737106481297314, -0.5706511410778079, -0.5675917486672830, -0.5645324705704574,
1561 -0.5614733064554015, -0.5584142559859673, -0.5553553188218032, -0.5522964946183664,
1562 -0.5492377830269375, -0.5461791836946337, -0.5431206962644228, -0.5400623203751378,
1563 -0.5370040556614907, -0.5339459017540870, -0.5308878582794401, -0.5278299248599867,
1564 -0.5247721011141006, -0.5217143866561084, -0.5186567810963040, -0.5155992840409649,
1565 -0.5125418950923666, -0.5094846138487980, -0.5064274399045782, -0.5033703728500708,
1566 -0.5003134122717017, -0.4972565577519730, -0.4941998088694810, -0.4911431651989314,
1567 -0.4880866263111567, -0.4850301917731316, -0.4819738611479913, -0.4789176339950472,
1568 -0.4758615098698037, -0.4728054883239767, -0.4697495689055093, -0.4666937511585906,
1569 -0.4636380346236717, -0.4605824188374848, -0.4575269033330600, -0.4544714876397434,
1570 -0.4514161712832160, -0.4483609537855100, -0.4453058346650290, -0.4422508134365649,
1571 -0.4391958896113176, -0.4361410626969126, -0.4330863321974207, -0.4300316976133757,
1572 -0.4269771584417951, -0.4239227141761973, -0.4208683643066221, -0.4178141083196501,
1573 -0.4147599456984207, -0.4117058759226540, -0.4086518984686680, -0.4055980128094006,
1574 -0.4025442184144278, -0.3994905147499850, -0.3964369012789863, -0.3933833774610454,
1575 -0.3903299427524949, -0.3872765966064085, -0.3842233384726200, -0.3811701677977445,
1576 -0.3781170840251998, -0.3750640865952259, -0.3720111749449079, -0.3689583485081953,
1577 -0.3659056067159246, -0.3628529489958394, -0.3598003747726132, -0.3567478834678695,
1578 -0.3536954745002046, -0.3506431472852087, -0.3475909012354876, -0.3445387357606854,
1579 -0.3414866502675054, -0.3384346441597333, -0.3353827168382586, -0.3323308677010977,
1580 -0.3292790961434151, -0.3262274015575475, -0.3231757833330247, -0.3201242408565939,
1581 -0.3170727735122413, -0.3140213806812149, -0.3109700617420491, -0.3079188160705851,
1582 -0.3048676430399968, -0.3018165420208114, -0.2987655123809355, -0.2957145534856753,
1583 -0.2926636646977631, -0.2896128453773791, -0.2865620948821750, -0.2835114125672991,
1584 -0.2804607977854179, -0.2774102498867426, -0.2743597682190509, -0.2713093521277122,
1585 -0.2682590009557110, -0.2652087140436722, -0.2621584907298840, -0.2591083303503231,
1586 -0.2560582322386794, -0.2530081957263792, -0.2499582201426115, -0.2469083048143511,
1587 -0.2438584490663844, -0.2408086522213333, -0.2377589135996813, -0.2347092325197966,
1588 -0.2316596082979593, -0.2286100402483842, -0.2255605276832478, -0.2225110699127127,
1589 -0.2194616662449523, -0.2164123159861774, -0.2133630184406603, -0.2103137729107614,
1590 -0.2072645786969535, -0.2042154350978488, -0.2011663414102229, -0.1981172969290423,
1591 -0.1950683009474881, -0.1920193527569836, -0.1889704516472197, -0.1859215969061795,
1592 -0.1828727878201665, -0.1798240236738284, -0.1767753037501854, -0.1737266273306537,
1593 -0.1706779936950747, -0.1676294021217382, -0.1645808518874114, -0.1615323422673629,
1594 -0.1584838725353908, -0.1554354419638487, -0.1523870498236709, -0.1493386953844011,
1595 -0.1462903779142168, -0.1432420966799579, -0.1401938509471512, -0.1371456399800395,
1596 -0.1340974630416059, -0.1310493193936025, -0.1280012082965759, -0.1249531290098951,
1597 -0.1219050807917775, -0.1188570628993160, -0.1158090745885068, -0.1127611151142748,
1598 -0.1097131837305024, -0.1066652796900548, -0.1036174022448089, -0.1005695506456786,
1599 -0.0975217241426437, -0.0944739219847753, -0.0914261434202646, -0.0883783876964495,
1600 -0.0853306540598411, -0.0822829417561525, -0.0792352500303247, -0.0761875781265552,
1601 -0.0731399252883239, -0.0700922907584221, -0.0670446737789784, -0.0639970735914873,
1602 -0.0609494894368364, -0.0579019205553327, -0.0548543661867321, -0.0518068255702648,
1603 -0.0487592979446650, -0.0457117825481961, -0.0426642786186804, -0.0396167853935248,
1604 -0.0365693021097503, -0.0335218280040174, -0.0304743623126556, -0.0274269042716904,
1605 -0.0243794531168700, -0.0213320080836945, -0.0182845684074421, -0.0152371333231980,
1606 -0.0121897020658807, -0.0091422738702712, -0.0060948479710391, -0.0030474236027716,
1607 0.0000000000000000, 0.0030474236027716, 0.0060948479710391, 0.0091422738702712,
1608 0.0121897020658807, 0.0152371333231980, 0.0182845684074421, 0.0213320080836945,
1609 0.0243794531168700, 0.0274269042716904, 0.0304743623126556, 0.0335218280040174,
1610 0.0365693021097503, 0.0396167853935248, 0.0426642786186804, 0.0457117825481961,
1611 0.0487592979446650, 0.0518068255702648, 0.0548543661867321, 0.0579019205553327,
1612 0.0609494894368364, 0.0639970735914873, 0.0670446737789784, 0.0700922907584221,
1613 0.0731399252883239, 0.0761875781265552, 0.0792352500303247, 0.0822829417561525,
1614 0.0853306540598411, 0.0883783876964495, 0.0914261434202646, 0.0944739219847753,
1615 0.0975217241426437, 0.1005695506456786, 0.1036174022448089, 0.1066652796900548,
1616 0.1097131837305024, 0.1127611151142748, 0.1158090745885068, 0.1188570628993160,
1617 0.1219050807917775, 0.1249531290098951, 0.1280012082965759, 0.1310493193936025,
1618 0.1340974630416059, 0.1371456399800395, 0.1401938509471512, 0.1432420966799579,
1619 0.1462903779142168, 0.1493386953844011, 0.1523870498236709, 0.1554354419638487,
1620 0.1584838725353908, 0.1615323422673629, 0.1645808518874114, 0.1676294021217382,
1621 0.1706779936950747, 0.1737266273306537, 0.1767753037501854, 0.1798240236738284,
1622 0.1828727878201665, 0.1859215969061795, 0.1889704516472197, 0.1920193527569836,
1623 0.1950683009474881, 0.1981172969290423, 0.2011663414102229, 0.2042154350978488,
1624 0.2072645786969535, 0.2103137729107614, 0.2133630184406603, 0.2164123159861774,
1625 0.2194616662449523, 0.2225110699127127, 0.2255605276832478, 0.2286100402483842,
1626 0.2316596082979593, 0.2347092325197966, 0.2377589135996813, 0.2408086522213333,
1627 0.2438584490663844, 0.2469083048143511, 0.2499582201426115, 0.2530081957263792,
1628 0.2560582322386794, 0.2591083303503231, 0.2621584907298840, 0.2652087140436722,
1629 0.2682590009557110, 0.2713093521277122, 0.2743597682190509, 0.2774102498867426,
1630 0.2804607977854179, 0.2835114125672991, 0.2865620948821750, 0.2896128453773791,
1631 0.2926636646977631, 0.2957145534856753, 0.2987655123809355, 0.3018165420208114,
1632 0.3048676430399968, 0.3079188160705851, 0.3109700617420491, 0.3140213806812149,
1633 0.3170727735122413, 0.3201242408565939, 0.3231757833330247, 0.3262274015575475,
1634 0.3292790961434151, 0.3323308677010977, 0.3353827168382586, 0.3384346441597333,
1635 0.3414866502675054, 0.3445387357606854, 0.3475909012354876, 0.3506431472852087,
1636 0.3536954745002046, 0.3567478834678695, 0.3598003747726132, 0.3628529489958394,
1637 0.3659056067159246, 0.3689583485081953, 0.3720111749449079, 0.3750640865952259,
1638 0.3781170840251998, 0.3811701677977445, 0.3842233384726200, 0.3872765966064085,
1639 0.3903299427524949, 0.3933833774610454, 0.3964369012789863, 0.3994905147499850,
1640 0.4025442184144278, 0.4055980128094006, 0.4086518984686680, 0.4117058759226540,
1641 0.4147599456984207, 0.4178141083196501, 0.4208683643066221, 0.4239227141761973,
1642 0.4269771584417949, 0.4300316976133759, 0.4330863321974207, 0.4361410626969126,
1643 0.4391958896113174, 0.4422508134365651, 0.4453058346650290, 0.4483609537855100,
1644 0.4514161712832158, 0.4544714876397437, 0.4575269033330600, 0.4605824188374846,
1645 0.4636380346236719, 0.4666937511585906, 0.4697495689055093, 0.4728054883239765,
1646 0.4758615098698039, 0.4789176339950472, 0.4819738611479913, 0.4850301917731313,
1647 0.4880866263111567, 0.4911431651989314, 0.4941998088694807, 0.4972565577519732,
1648 0.5003134122717017, 0.5033703728500708, 0.5064274399045780, 0.5094846138487981,
1649 0.5125418950923666, 0.5155992840409649, 0.5186567810963038, 0.5217143866561084,
1650 0.5247721011141006, 0.5278299248599865, 0.5308878582794403, 0.5339459017540870,
1651 0.5370040556614907, 0.5400623203751377, 0.5431206962644230, 0.5461791836946337,
1652 0.5492377830269375, 0.5522964946183662, 0.5553553188218032, 0.5584142559859673,
1653 0.5614733064554014, 0.5645324705704576, 0.5675917486672830, 0.5706511410778078,
1654 0.5737106481297312, 0.5767702701465087, 0.5798300074473378, 0.5828898603471476,
1655 0.5859498291565843, 0.5890099141819998, 0.5920701157254376, 0.5951304340846229,
1656 0.5981908695529500, 0.6012514224194680, 0.6043120929688731, 0.6073728814814937,
1657 0.6104337882332813, 0.6134948134957965, 0.6165559575362007, 0.6196172206172447,
1658 0.6226786029972549, 0.6257401049301271, 0.6288017266653130, 0.6318634684478113,
1659 0.6349253305181557, 0.6379873131124074, 0.6410494164621438, 0.6441116407944494,
1660 0.6471739863319046, 0.6502364532925788, 0.6532990418900205, 0.6563617523332463,
1661 0.6594245848267348, 0.6624875395704165, 0.6655506167596653, 0.6686138165852896,
1662 0.6716771392335257, 0.6747405848860282, 0.6778041537198634, 0.6808678459074992,
1663 0.6839316616168007, 0.6869956010110218, 0.6900596642487954, 0.6931238514841299,
1664 0.6961881628664012, 0.6992525985403450, 0.7023171586460507, 0.7053818433189555,
1665 0.7084466526898383, 0.7115115868848134, 0.7145766460253233, 0.7176418302281355,
1666 0.7207071396053360, 0.7237725742643220, 0.7268381343078000, 0.7299038198337786,
1667 0.7329696309355649, 0.7360355677017578, 0.7391016302162465, 0.7421678185582037,
1668 0.7452341328020832, 0.7483005730176139, 0.7513671392697985, 0.7544338316189083,
1669 0.7575006501204795, 0.7605675948253116, 0.7636346657794623, 0.7667018630242469,
1670 0.7697691865962324, 0.7728366365272384, 0.7759042128443326, 0.7789719155698295,
1671 0.7820397447212868, 0.7851077003115062, 0.7881757823485303, 0.7912439908356397,
1672 0.7943123257713546, 0.7973807871494316, 0.8004493749588646, 0.8035180891838803,
1673 0.8065869298039425, 0.8096558967937484, 0.8127249901232297, 0.8157942097575512,
1674 0.8188635556571133, 0.8219330277775504, 0.8250026260697310, 0.8280723504797606,
1675 0.8311422009489808, 0.8342121774139715, 0.8372822798065497, 0.8403525080537743,
1676 0.8434228620779455, 0.8464933417966075, 0.8495639471225490, 0.8526346779638074,
1677 0.8557055342236705, 0.8587765158006768, 0.8618476225886219, 0.8649188544765586,
1678 0.8679902113488013, 0.8710616930849278, 0.8741332995597844, 0.8772050306434889,
1679 0.8802768862014341, 0.8833488660942911, 0.8864209701780152, 0.8894931983038492,
1680 0.8925655503183271, 0.8956380260632806, 0.8987106253758426, 0.9017833480884531,
1681 0.9048561940288629, 0.9079291630201414, 0.9110022548806804, 0.9140754694242010,
1682 0.9171488064597577, 0.9202222657917469, 0.9232958472199125, 0.9263695505393509,
1683 0.9294433755405196, 0.9325173220092435, 0.9355913897267225, 0.9386655784695360,
1684 0.9417398880096545, 0.9448143181144439, 0.9478888685466759, 0.9509635390645325,
1685 0.9540383294216178, 0.9571132393669650, 0.9601882686450431, 0.9632634169957687,
1686 0.9663386841545127, 0.9694140698521105, 0.9724895738148697, 0.9755651957645813,
1687 0.9786409354185294, 0.9817167924894980, 0.9847927666857850, 0.9878688577112096,
1688 0.9909450652651239, 0.9940213890424222, 0.9970978287335528, 1.0001743840245285,
1689 1.0032510545969382, 1.0063278401279556, 1.0094047402903543, 1.0124817547525173,
1690 1.0155588831784472, 1.0186361252277820, 1.0217134805558040, 1.0247909488134532,
1691 1.0278685296473395, 1.0309462226997554, 1.0340240276086894, 1.0371019440078382,
1692 1.0401799715266187, 1.0432581097901843, 1.0463363584194365, 1.0494147170310375,
1693 1.0524931852374262, 1.0555717626468313, 1.0586504488632853, 1.0617292434866386,
1694 1.0648081461125745, 1.0678871563326240, 1.0709662737341807, 1.0740454979005143,
1695 1.0771248284107880, 1.0802042648400727, 1.0832838067593618, 1.0863634537355888,
1696 1.0894432053316419, 1.0925230611063800, 1.0956030206146483, 1.0986830834072967,
1697 1.1017632490311944, 1.1048435170292479, 1.1079238869404153, 1.1110043582997270,
1698 1.1140849306383012, 1.1171656034833588, 1.1202463763582455, 1.1233272487824457,
1699 1.1264082202716030, 1.1294892903375349, 1.1325704584882540, 1.1356517242279855,
1700 1.1387330870571848, 1.1418145464725562, 1.1448961019670723, 1.1479777530299933,
1701 1.1510594991468840, 1.1541413397996356, 1.1572232744664834, 1.1603053026220270,
1702 1.1633874237372486, 1.1664696372795356, 1.1695519427126980, 1.1726343394969900,
1703 1.1757168270891285, 1.1787994049423160, 1.1818820725062600, 1.1849648292271922,
1704 1.1880476745478916, 1.1911306079077049, 1.1942136287425678, 1.1972967364850238,
1705 1.2003799305642500, 1.2034632104060752, 1.2065465754330034, 1.2096300250642344,
1706 1.2127135587156865, 1.2157971758000200, 1.2188808757266550, 1.2219646579017995,
1707 1.2250485217284688, 1.2281324666065080, 1.2312164919326152, 1.2343005971003653,
1708 1.2373847815002326, 1.2404690445196138, 1.2435533855428500, 1.2466378039512538,
1709 1.2497222991231294, 1.2528068704337967, 1.2558915172556180, 1.2589762389580186,
1710 1.2620610349075130, 1.2651459044677273, 1.2682308469994257, 1.2713158618605336,
1711 1.2744009484061627, 1.2774861059886347, 1.2805713339575073, 1.2836566316595999,
1712 1.2867419984390154, 1.2898274336371687, 1.2929129365928110, 1.2959985066420547,
1713 1.2990841431183986, 1.3021698453527548, 1.3052556126734736, 1.3083414444063700,
1714 1.3114273398747476, 1.3145132983994277, 1.3175993192987740, 1.3206854018887175,
1715 1.3237715454827859, 1.3268577493921270, 1.3299440129255384, 1.3330303353894903,
1716 1.3361167160881562, 1.3392031543234375, 1.3422896493949916, 1.3453762006002570,
1717 1.3484628072344833, 1.3515494685907570, 1.3546361839600276, 1.3577229526311376,
1718 1.3608097738908491, 1.3638966470238705, 1.3669835713128842, 1.3700705460385765,
1719 1.3731575704796635, 1.3762446439129201, 1.3793317656132063, 1.3824189348534979,
1720 1.3855061509049140, 1.3885934130367428, 1.3916807205164740, 1.3947680726098244,
1721 1.3978554685807680, 1.4009429076915625, 1.4040303892027810, 1.4071179123733386,
1722 1.4102054764605212, 1.4132930807200161, 1.4163807244059394, 1.4194684067708665,
1723 1.4225561270658580, 1.4256438845404933, 1.4287316784428970, 1.4318195080197695,
1724 1.4349073725164143, 1.4379952711767703, 1.4410832032434397, 1.4441711679577170,
1725 1.4472591645596196, 1.4503471922879179, 1.4534352503801644, 1.4565233380727216,
1726 1.4596114546007952, 1.4626995991984624, 1.4657877710987015, 1.4688759695334213,
1727 1.4719641937334929, 1.4750524429287790, 1.4781407163481628, 1.4812290132195800,
1728 1.4843173327700480, 1.4874056742256965, 1.4904940368117963, 1.4935824197527918,
1729 1.4966708222723308, 1.4997592435932940, 1.5028476829378250, 1.5059361395273627,
1730 1.5090246125826707, 1.5121131013238660, 1.5152016049704535, 1.5182901227413530,
1731 1.5213786538549319, 1.5244671975290338, 1.5275557529810110, 1.5306443194277553,
1732 1.5337328960857264, 1.5368214821709845, 1.5399100768992207, 1.5429986794857880,
1733 1.5460872891457300, 1.5491759050938145, 1.5522645265445632, 1.5553531527122815,
1734 1.5584417828110895, 1.5615304160549546, 1.5646190516577200, 1.5677076888331380,
1735 1.5707963267948966, 1.5707963267948966 };
1736 
1737 // the two arrays above have 1027 elements each. The latitude spacing of the points
1738 // is GEOTESS_DLAT = PI/1024 radians. The first value is at -PI/2-GEOTESS_DLAT and
1739 // the last value is at PI/2+GEOTESS_DLAT. The extra elements on the ends account
1740 // for the possibility of small roundoff errors.
1741 
1742 static const double GEOTESS_DLAT = PI/1024.;
1743 
1744 static const double GEOTESS_LAT0 = -PI/2. - GEOTESS_DLAT;
1745 
1746 // GEOTESS_E is ( 1 - eccentricity squared) for the WGS84 ellipsoid.
1747 static const double GEOTESS_E = 0.99330562000985870000;
1748 
1749 inline double GeoTessUtils::getGeographicLat(const double& lat)
1750 {
1751  // convert lat from geocentric to geographic latitude.
1752  if (approximateLatitudes)
1753  {
1754  double tmp = (lat - GEOTESS_LAT0) / GEOTESS_DLAT;
1755  int i = (int) tmp;
1756  return geographic[i] + (tmp - i) * (geographic[i + 1] - geographic[i]);
1757  }
1758  return atan(tan(lat) / GEOTESS_E);
1759 }
1760 
1761 inline double GeoTessUtils::getGeocentricLat(const double& lat)
1762 {
1763  // convert lat from geographic to geocentric latitude.
1764  if (approximateLatitudes)
1765  {
1766  double tmp = (lat - GEOTESS_LAT0) / GEOTESS_DLAT;
1767  int i = (int) tmp;
1768  return geocentric[i] + (tmp - i) * (geocentric[i + 1] - geocentric[i]);
1769  }
1770  return atan(tan(lat) * GEOTESS_E);
1771 }
1772 
1773 } // end namespace geotess
1774 
1775 #endif // GEOTESSUTILS_OBJECT_H
1776 
#define GEOTESS_EXP_IMP
Definition: CPPGlobals.h:71
Collection of static functions to manipulate geographic information.
Definition: GeoTessUtils.h:70
static double getLat(const double *const v)
Definition: GeoTessUtils.h:563
static void getGreatCirclePoint(double const *const *const greatCircle, double distance, double *const v)
static double azimuthDegrees(const double *const v1, const double *const v2, double errorValue)
static void center(vector< double * > v, double *x)
static void getGreatCircle(const double *const v, double azimuth, double **const gc)
static void cross(const double *const v1, const double *const v2, double *const rslt)
Definition: GeoTessUtils.h:728
static double getGreatCirclePoints(double *ptA, double *ptB, const double &delta, const bool &onCenters, double **points, int &npoints)
static double angle(const double *const v0, const double *const v1)
Definition: GeoTessUtils.h:497
static double dot(const double *const v0, const double *const v1)
Definition: GeoTessUtils.h:134
static double getLonDegrees(const double *const v)
Definition: GeoTessUtils.h:595
static bool isPole(const double *const u)
static void getTransform(const double *const u, const double *const v, double **const t)
static double * circumCenterPlus(const double *const v0, const double *const v1, const double *const v2)
Definition: GeoTessUtils.h:929
static double crossNormal(const double *const u, const double *const v, double *const w)
Definition: GeoTessUtils.h:769
static void circumCenterPlus(double const *const *const t, double *const vs)
Definition: GeoTessUtils.h:959
static int getGreatCirclePoints(double *ptA, double *ptB, const double &delta, const bool &onCenters)
static void readString(string &s, ifstream &ifs)
Definition: GeoTessUtils.h:469
static void circumCenter(const double *const v0, const double *const v1, const double *const v2, double *const vs)
Definition: GeoTessUtils.h:875
static double * getGreatCirclePoint(double const *const *const greatCircle, double distance)
static bool approximateLatitudes
Definition: GeoTessUtils.h:95
static double getTriangleArea(const double *const v0, const double *const v1, const double *const v2)
static double crossNorth(const double *const u, double *const w)
Definition: GeoTessUtils.h:790
static double * center(double const *const *const v, int n)
static double getEarthRadius(const double *const v)
Definition: GeoTessUtils.h:553
static void transform(const double *x, double const *const *const t, double *const g)
Definition: GeoTessUtils.h:456
static double length(const double *const u)
Definition: GeoTessUtils.h:420
static string class_name()
Definition: GeoTessUtils.h:111
static double * getVectorDegrees(const double &lat, const double &lon, double *v)
Definition: GeoTessUtils.h:625
static void getGreatCircle(const double *const v0, const double *const v1, double **const gc)
static double ** getGreatCircle(const double *const v, double azimuth)
static string getLatLonString(const double *const v)
static void rotate(const double *const x, const double *const p, double a, double *const z)
static double getLon(const double *const v)
Definition: GeoTessUtils.h:572
static string getLonLatString(const double *const v)
static double * getVector(const double &lat, const double &lon)
Definition: GeoTessUtils.h:641
static double getGreatCirclePoints(double *ptA, double *ptB, const int &npoints, const bool &onCenters, double **points)
static bool vectorTripleProduct(const double *const v0, const double *const v1, const double *const v2, double *const rslt)
Definition: GeoTessUtils.h:822
static bool parallel(const double *const u, const double *const v)
static double getDistance3D(const double *const v0, double r0, const double *const v1, double r1)
Definition: GeoTessUtils.h:537
static bool vectorTripleProductNorthPole(const double *const u, double *const w)
Definition: GeoTessUtils.h:856
static double ** getGreatCircle(const double *const v0, const double *const v1)
static double getLatDegrees(const double *const v)
Definition: GeoTessUtils.h:582
static double * getVectorDegrees(const double &lat, const double &lon)
Definition: GeoTessUtils.h:610
static void normalizeFast(double *const u)
Definition: GeoTessUtils.h:685
static void move(const double *const w, const double *const vtp, double a, double *const u)
static double azimuth(const double *const v1, const double *const v2, double errorValue)
static double getTriangleArea(const double *const v0, const double *const v1, const double *const v2, double *work1, double *work2, double *work3)
static void circumCenterPlus(const double *const v0, const double *const v1, const double *const v2, double *const vs)
Definition: GeoTessUtils.h:900
static bool moveNorth(const double *const x, double distance, double *const z)
static string getVersion()
Definition: GeoTessUtils.h:125
virtual int class_size() const
Definition: GeoTessUtils.h:118
static double * crossNormal(const double *const u, const double *const v)
Definition: GeoTessUtils.h:746
static double scalarTripleProduct(const double *const v0, const double *const v1, const double *const v2)
Definition: GeoTessUtils.h:146
static bool moveDistAz(const double *const w, double distance, double azimuth, double *const u)
Definition: GeoTessUtils.h:977
static double * getVector(const double &lat, const double &lon, double *v)
Definition: GeoTessUtils.h:659
static double normalize(double *const u)
Definition: GeoTessUtils.h:701
static double angleDegrees(const double *const v0, const double *const v1)
Definition: GeoTessUtils.h:515
static void writeString(ofstream &ofs, const string &s)
Definition: GeoTessUtils.h:484