GeoTessCPP  2.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 
80  /*
81  * Private assignment operator. Not used.
82  */
83  GeoTessUtils& operator=(const GeoTessUtils& gtu)
84  {
85  return *this;
86  }
87 
88 public:
89 
100  static bool approximateLatitudes;
101 
106  {
107  }
108 
112  virtual ~GeoTessUtils()
113  {
114  }
115 
120  static string class_name()
121  { return "GeoTessUtils"; }
122 
127  virtual int class_size() const
128  { return (int) sizeof(GeoTessUtils); }
129 
134  static string getVersion() { return "2.2.0"; }
135 
143  static double dot(const double* const v0, const double* const v1)
144  { return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2]; }
145 
155  static double scalarTripleProduct(const double* const v0,
156  const double* const v1, const double* const v2)
157  {
158  return v0[0] * v1[1] * v2[2] + v1[0] * v2[1] * v0[2]
159  + v2[0] * v0[1] * v1[2] - v2[0] * v1[1] * v0[2]
160  - v0[0] * v2[1] * v1[2] - v1[0] * v0[1] * v2[2];
161  }
162 
170  static double getGeoCentricLatitude(const double& lat);
171 
179  static double getGeoGraphicLatitude(const double& lat);
180 
185  static string getLatLonString(const double* const v);
186 
191  static string getLonLatString(const double* const v);
192 
193 
208  static double azimuthDegrees(const double* const v1, const double* const v2,
209  double errorValue);
210 
225  static double azimuth(const double* const v1, const double* const v2,
226  double errorValue);
227 
242 static void rotate(const double* const x, const double* const p, double a,
243  double* const z);
244 
267  static double** getGreatCircle(const double* const v0,
268  const double* const v1);
269 
292  static void getGreatCircle(const double* const v0, const double* const v1,
293  double** const gc);
294 
319  static double** getGreatCircle(const double* const v, double azimuth);
320 
345  static void getGreatCircle(const double* const v, double azimuth,
346  double** const gc);
347 
360  static int getGreatCirclePoints(double* ptA, double* ptB,
361  const double& delta, const bool& onCenters);
362 
376  static double getGreatCirclePoints(double* ptA, double* ptB,
377  const int& npoints, const bool& onCenters, double** points);
378 
395  static double getGreatCirclePoints(double* ptA, double* ptB,
396  const double& delta, const bool& onCenters, double** points,
397  int& npoints);
398 
405  static double length(const double* const u)
406  {
407  double l = u[0] * u[0] + u[1] * u[1] + u[2] * u[2];
408  return l > 0 ? sqrt(l) : 0.;
409  }
410 
423  static void getTransform(const double* const u, const double* const v,
424  double** const t);
425 
441  static void transform(const double* x,
442  double const* const * const t, double* const g)
443  {
444  g[0] = x[0] * t[0][0] + x[1] * t[0][1] + x[2] * t[0][2];
445  g[1] = x[0] * t[1][0] + x[1] * t[1][1] + x[2] * t[1][2];
446  g[2] = x[0] * t[2][0] + x[1] * t[2][1] + x[2] * t[2][2];
447  }
448 
454  static void readString(string& s, ifstream& ifs)
455  {
456  int sze;
457  ifs >> sze;
458  char* c = new char[sze];
459  ifs.read(c, sze);
460  s = c;
461  delete[] c;
462  }
463 
469  static void writeString(ofstream& ofs, const string& s)
470  {
471  ofs << s.length();
472  ofs.write(s.c_str(), s.length());
473  }
474 
482  static double angle(const double* const v0,
483  const double* const v1)
484  {
485  double dot = v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2];
486  if (dot >= 1.0)
487  return 0.0;
488  if (dot <= -1.0)
489  return PI;
490  return acos(dot);
491  }
492 
500  static double angleDegrees(const double* const v0,
501  const double* const v1)
502  {
503  double dot = v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2];
504  if (dot >= 1.)
505  return 0.;
506  if (dot <= -1.)
507  return 180.;
508  return CPPUtils::toDegrees(acos(dot));
509  }
510 
522  static double getDistance3D(const double* const v0, double r0,
523  const double* const v1, double r1)
524  {
525  double v[3] = { v0[0] * r0 - v1[0] * r1, v0[1] * r0 - v1[1] * r1, v0[2] * r0
526  - v1[2] * r1 };
527  return length(v);
528  }
529 
537  static double getEarthRadius(const double* const v)
538  {
539  return EARTH_A / sqrt(1. + EARTH_E / (1 - EARTH_E) * v[2] * v[2]);
540  }
541 
548  static double getLat(const double* const v)
549  {
550  return getGeoGraphicLatitude(asin(v[2]));
551  }
552 
559  static double getLon(const double* const v)
560  {
561  return atan2(v[1], v[0]);
562  }
563 
570  static double getLatDegrees(const double* const v)
571  {
572  // the constant 0.9933 is (1-e*e) where e is the eccentricity of the
573  // earth
574  // as defined by the GRS80 ellipsoid.
575  return CPPUtils::toDegrees(atan(tan(asin(v[2])) / 0.9933056199770992));
576  }
577 
584  static double getLonDegrees(const double* const v)
585  {
586  return CPPUtils::toDegrees(atan2(v[1], v[0]));
587  }
588 
600  static double* getVectorDegrees(const double& lat,
601  const double& lon)
602  {
603  return getVector(CPPUtils::toRadians(lat), CPPUtils::toRadians(lon));
604  }
605 
616  static double* getVectorDegrees(const double& lat,
617  const double& lon, double* v)
618  {
619  return getVector(CPPUtils::toRadians(lat), CPPUtils::toRadians(lon), v);
620  }
621 
633  static double* getVector(const double& lat, const double& lon)
634  {
635  double* v = new double[3];
636  getVector(lat, lon, v);
637  return v;
638  }
639 
650  static double* getVector(const double& lat, const double& lon, double* v)
651  {
652  // convert lat from geographic to geocentric latitude.
653  double temp = getGeoCentricLatitude(lat);
654 
655  // z component of v is sin of geocentric latitude.
656  v[2] = sin(temp);
657 
658  // set lat = to cos of geocentric latitude
659  temp = cos(temp);
660 
661  // compute x and y components of v
662  v[0] = temp * cos(lon);
663  v[1] = temp * sin(lon);
664 
665  return v;
666  }
667 
676  static void normalizeFast(double* const u)
677  {
678  double len = u[0] * u[0] + u[1] * u[1] + u[2] * u[2];
679  len = sqrt(len);
680  u[0] /= len;
681  u[1] /= len;
682  u[2] /= len;
683  }
684 
692  static double normalize(double* const u)
693  {
694  double len = u[0] * u[0] + u[1] * u[1] + u[2] * u[2];
695  if (len > 0.)
696  {
697  len = sqrt(len);
698  u[0] /= len;
699  u[1] /= len;
700  u[2] /= len;
701  }
702  else
703  {
704  len = u[0] = u[1] = u[2] = 0.0;
705  }
706  return len;
707  }
708 
719  static void cross(const double* const v1, const double* const v2,
720  double* const rslt)
721  {
722  rslt[0] = v1[1] * v2[2] - v1[2] * v2[1];
723  rslt[1] = v1[2] * v2[0] - v1[0] * v2[2];
724  rslt[2] = v1[0] * v2[1] - v1[1] * v2[0];
725  }
726 
737  static double* crossNormal(const double* const u,
738  const double* const v)
739  {
740  double* w = new double[3];
741  w[0] = u[1] * v[2] - u[2] * v[1];
742  w[1] = u[2] * v[0] - u[0] * v[2];
743  w[2] = u[0] * v[1] - u[1] * v[0];
744  normalize(w);
745  return w;
746  }
747 
760  static double crossNormal(const double* const u,
761  const double* const v, double* const w)
762  {
763  w[0] = u[1] * v[2] - u[2] * v[1];
764  w[1] = u[2] * v[0] - u[0] * v[2];
765  w[2] = u[0] * v[1] - u[1] * v[0];
766  return normalize(w);
767  }
768 
781  static double crossNorth(const double* const u, double* const w)
782  {
783  double len = u[0] * u[0] + u[1] * u[1];
784  if (len <= 0.)
785  {
786  len = w[0] = w[1] = w[2] = 0.;
787  }
788  else
789  {
790  len = sqrt(len);
791  w[0] = u[1] / len;
792  w[1] = -u[0] / len;
793  w[2] = 0.;
794  }
795  return len;
796  }
797 
813  static bool vectorTripleProduct(const double* const v0,
814  const double* const v1, const double* const v2, double* const rslt)
815  {
816  // set q = v0 cross v1
817  double q0 = v0[1] * v1[2] - v0[2] * v1[1];
818  double q1 = v0[2] * v1[0] - v0[0] * v1[2];
819  double q2 = v0[0] * v1[1] - v0[1] * v1[0];
820 
821  // set w = q cross v2
822  double w0 = q1 * v2[2] - q2 * v2[1];
823  double w1 = q2 * v2[0] - q0 * v2[2];
824  double w2 = q0 * v2[1] - q1 * v2[0];
825 
826  // set rslt = w
827  rslt[0] = w0;
828  rslt[1] = w1;
829  rslt[2] = w2;
830 
831  // normalize rslt to unit length. if the length
832  // of v1 or v2 is zero or they are nearly parallel then
833  // rslt will = {0,0,0} and the function will return false;
834  return normalize(rslt) != 0.;
835  }
836 
847  static bool vectorTripleProductNorthPole(const double* const u,
848  double* const w)
849  {
850  w[0] = -u[0] * u[2];
851  w[1] = -u[1] * u[2];
852  w[2] = u[1] * u[1] + u[0] * u[0];
853  return normalize(w) != 0.;
854  }
855 
866  static void circumCenter(const double* const v0,
867  const double* const v1, const double* const v2, double* const vs)
868  {
869  vs[0] = v0[1] * (v2[2] - v1[2]) + v2[1] * (v1[2] - v0[2]) + v1[1] * (v0[2] - v2[2]);
870  vs[1] = v0[2] * (v2[0] - v1[0]) + v2[2] * (v1[0] - v0[0]) + v1[2] * (v0[0] - v2[0]);
871  vs[2] = v0[0] * (v2[1] - v1[1]) + v2[0] * (v1[1] - v0[1]) + v1[0] * (v0[1] - v2[1]);
872  double len = vs[0] * vs[0] + vs[1] * vs[1] + vs[2] * vs[2];
873  len = sqrt(len);
874  vs[0] /= len;
875  vs[1] /= len;
876  vs[2] /= len;
877  }
878 
891  static void circumCenterPlus(const double* const v0,
892  const double* const v1, const double* const v2, double* const vs)
893  {
894  vs[0] = v0[1] * (v2[2] - v1[2]) + v2[1] * (v1[2] - v0[2]) + v1[1] * (v0[2] - v2[2]);
895  vs[1] = v0[2] * (v2[0] - v1[0]) + v2[2] * (v1[0] - v0[0]) + v1[2] * (v0[0] - v2[0]);
896  vs[2] = v0[0] * (v2[1] - v1[1]) + v2[0] * (v1[1] - v0[1]) + v1[0] * (v0[1] - v2[1]);
897  double len = vs[0] * vs[0] + vs[1] * vs[1] + vs[2] * vs[2];
898  len = sqrt(len);
899  vs[0] /= len;
900  vs[1] /= len;
901  vs[2] /= len;
902  vs[3] = dot(vs, v0);
903  }
904 
920  static double* circumCenterPlus(const double* const v0,
921  const double* const v1, const double* const v2)
922  {
923  double* vs = new double[4];
924  vs[0] = v0[1] * (v2[2] - v1[2]) + v2[1] * (v1[2] - v0[2]) + v1[1] * (v0[2] - v2[2]);
925  vs[1] = v0[2] * (v2[0] - v1[0]) + v2[2] * (v1[0] - v0[0]) + v1[2] * (v0[0] - v2[0]);
926  vs[2] = v0[0] * (v2[1] - v1[1]) + v2[0] * (v1[1] - v0[1]) + v1[0] * (v0[1] - v2[1]);
927  double len = vs[0] * vs[0] + vs[1] * vs[1] + vs[2] * vs[2];
928  len = sqrt(len);
929  vs[0] /= len;
930  vs[1] /= len;
931  vs[2] /= len;
932  vs[3] = dot(vs, v0);
933  return vs;
934  }
935 
950  static void circumCenterPlus(double const* const * const t, double* const vs)
951  { circumCenterPlus(t[0], t[1], t[2], vs); }
952 
968  static bool moveDistAz(const double* const w, double distance,
969  double azimuth, double* const u)
970  {
971  double n[3] = { 0.0, 0.0, 0.0 };
972  if (moveNorth(w, distance, n))
973  {
974  rotate(n, w, azimuth, u);
975  return true;
976  }
977  u[0] = w[0];
978  u[1] = w[1];
979  u[2] = w[2];
980  return false;
981  }
982 
996  static void move(const double* const w, const double* const vtp,
997  double a, double* const u)
998  {
999  double cosa = cos(a);
1000  double sina = sin(a);
1001  u[0] = cosa * w[0] + sina * vtp[0];
1002  u[1] = cosa * w[1] + sina * vtp[1];
1003  u[2] = cosa * w[2] + sina * vtp[2];
1004  }
1005 
1020  static bool moveNorth(const double* const x, double distance,
1021  double* const z)
1022  {
1023  double vtp[3] = { 0.0, 0.0, 0.0 };
1024  if (vectorTripleProductNorthPole(x, vtp))
1025  {
1026  move(x, vtp, distance, z);
1027  return true;
1028  }
1029 
1030  z[0] = x[0];
1031  z[1] = x[1];
1032  z[2] = x[2];
1033  return false;
1034  }
1035 
1043  static bool isPole(const double* const u)
1044  {
1045  return (u[0] * u[0] + u[1] * u[1]) < 1.0e-15;
1046  }
1047 
1057  static bool parallel(const double* const u, const double* const v)
1058  {
1059  return 1.0 - abs(u[0] * v[0] + u[1] * v[1] + u[2] * v[2]) < 2.0e-15;
1060  }
1061 
1078  static double* getGreatCirclePoint(
1079  double const* const * const greatCircle, double distance)
1080  {
1081  double* v = new double[3];
1082  getGreatCirclePoint(greatCircle, distance, v);
1083  return v;
1084  }
1085 
1103  static void getGreatCirclePoint(
1104  double const* const * const greatCircle, double distance,
1105  double* const v)
1106  {
1107  double cosa = cos(distance);
1108  double sina = sin(distance);
1109  v[0] = cosa * greatCircle[0][0] + sina * greatCircle[1][0];
1110  v[1] = cosa * greatCircle[0][1] + sina * greatCircle[1][1];
1111  v[2] = cosa * greatCircle[0][2] + sina * greatCircle[1][2];
1112  }
1113 
1120  static double getTriangleArea(const double* const v0,
1121  const double* const v1, const double* const v2)
1122  {
1123  double v10[3] = { v1[0] - v0[0], v1[1] - v0[1], v1[2] - v0[2] };
1124  double v20[3] = { v2[0] - v0[0], v2[1] - v0[1], v2[2] - v0[2] };
1125  double u[3] = { v10[1] * v20[2] - v10[2] * v20[1], v10[2] * v20[0]
1126  - v10[0] * v20[2], v10[0] * v20[1] - v10[1] * v20[0] };
1127  return sqrt(u[0] * u[0] + u[1] * u[1] + u[2] * u[2]) / 2.;
1128  }
1129 
1139  static double getTriangleArea(const double* const v0,
1140  const double* const v1, const double* const v2, double* work1, double* work2, double* work3)
1141  {
1142  work1[0] = v1[0] - v0[0];
1143  work1[1] = v1[1] - v0[1];
1144  work1[2] = v1[2] - v0[2];
1145 
1146  work2[0] = v2[0] - v0[0];
1147  work2[1] = v2[1] - v0[1];
1148  work2[2] = v2[2] - v0[2];
1149 
1150  work3[0] = work1[1] * work2[2] - work1[2] * work2[1];
1151  work3[1] = work1[2] * work2[0] - work1[0] * work2[2];
1152  work3[2] = work1[0] * work2[1] - work1[1] * work2[0];
1153 
1154  return sqrt(work3[0] * work3[0] + work3[1] * work3[1] + work3[2] * work3[2]) / 2.;
1155  }
1156 
1164  static double* center(double const * const * const v, int n)
1165  {
1166  double* x = new double[3];
1167  x[0] = x[1] = x[2] = 0.0;
1168  if (n == 0)
1169  return x;
1170 
1171  for (int i = 0; i < n; ++i)
1172  {
1173  x[0] += v[i][0];
1174  x[1] += v[i][1];
1175  x[2] += v[i][2];
1176  }
1177  normalize(x);
1178  return x;
1179  }
1180 
1188  static void center(vector<double*> v, double* x)
1189  {
1190  x[0] = x[1] = x[2] = 0.0;
1191 
1192  for (size_t i = 0; i < v.size(); ++i)
1193  {
1194  x[0] += v[i][0];
1195  x[1] += v[i][1];
1196  x[2] += v[i][2];
1197  }
1198  normalize(x);
1199  }
1200 };
1201 // end class GeoTessUtils
1202 
1203 // **** _INLINE FUNCTION IMPLEMENTATIONS_ **************************************
1204 
1205 // conversion from geocentric to geographic latitude, in radians.
1206 static const double geographic[] = {
1207 -1.5707963267948966,
1208 -1.5707963267948966, -1.5677489031921250, -1.5647014788238576, -1.5616540529246252,
1209 -1.5586066247290158, -1.5555591934716986, -1.5525117583874544, -1.5494643187112020,
1210 -1.5464168736780266, -1.5433694225232062, -1.5403219644822410, -1.5372744987908793,
1211 -1.5342270246851464, -1.5311795414013718, -1.5281320481762162, -1.5250845442467005,
1212 -1.5220370288502316, -1.5189895012246317, -1.5159419606081646, -1.5128944062395640,
1213 -1.5098468373580602, -1.5067992532034090, -1.5037516530159180, -1.5007040360364745,
1214 -1.4976564015065728, -1.4946087486683413, -1.4915610767645720, -1.4885133850387440,
1215 -1.4854656727350555, -1.4824179390984470, -1.4793701833746320, -1.4763224048101213,
1216 -1.4732746026522530, -1.4702267761492180, -1.4671789245500877, -1.4641310471048419,
1217 -1.4610831430643942, -1.4580352116806217, -1.4549872522063898, -1.4519392638955806,
1218 -1.4488912460031191, -1.4458431977850015, -1.4427951184983205, -1.4397470074012940,
1219 -1.4366988637532907, -1.4336506868148570, -1.4306024758477454, -1.4275542301149386,
1220 -1.4245059488806797, -1.4214576314104954, -1.4184092769712255, -1.4153608848310480,
1221 -1.4123124542595058, -1.4092639845275337, -1.4062154749074850, -1.4031669246731584,
1222 -1.4001183330998220, -1.3970696994642429, -1.3940210230447112, -1.3909723031210681,
1223 -1.3879235389747300, -1.3848747298887172, -1.3818258751476769, -1.3787769740379130,
1224 -1.3757280258474085, -1.3726790298658542, -1.3696299853846736, -1.3665808916970477,
1225 -1.3635317480979430, -1.3604825538841352, -1.3574333083542363, -1.3543840108087190,
1226 -1.3513346605499443, -1.3482852568821840, -1.3452357991116488, -1.3421862865465124,
1227 -1.3391367184969374, -1.3360870942751000, -1.3330374131952152, -1.3299876745735633,
1228 -1.3269378777285121, -1.3238880219805456, -1.3208381066522850, -1.3177881310685170,
1229 -1.3147380945562173, -1.3116879964445736, -1.3086378360650126, -1.3055876127512245,
1230 -1.3025373258391855, -1.2994869746671844, -1.2964365585758457, -1.2933860769081540,
1231 -1.2903355290094787, -1.2872849142275975, -1.2842342319127213, -1.2811834814175174,
1232 -1.2781326620971334, -1.2750817733092212, -1.2720308144139612, -1.2689797847740851,
1233 -1.2659286837548998, -1.2628775107243113, -1.2598262650528476, -1.2567749461136817,
1234 -1.2537235532826554, -1.2506720859383025, -1.2476205434618720, -1.2445689252373493,
1235 -1.2415172306514815, -1.2384654590937990, -1.2354136099566380, -1.2323616826351630,
1236 -1.2293096765273912, -1.2262575910342110, -1.2232054255594090, -1.2201531795096878,
1237 -1.2171008522946918, -1.2140484433270270, -1.2109959520222835, -1.2079433777990571,
1238 -1.2048907200789720, -1.2018379782867012, -1.1987851518499886, -1.1957322401996706,
1239 -1.1926792427696968, -1.1896261589971520, -1.1865729883222764, -1.1835197301884879,
1240 -1.1804663840424017, -1.1774129493338514, -1.1743594255159102, -1.1713058120449116,
1241 -1.1682521083804690, -1.1651983139854960, -1.1621444283262286, -1.1590904508722426,
1242 -1.1560363810964758, -1.1529822184752465, -1.1499279624882743, -1.1468736126186994,
1243 -1.1438191683531016, -1.1407646291815210, -1.1377099945974760, -1.1346552640979840,
1244 -1.1316004371835788, -1.1285455133583318, -1.1254904921298676, -1.1224353730093866,
1245 -1.1193801555116805, -1.1163248391551530, -1.1132694234618365, -1.1102139079574118,
1246 -1.1071582921712249, -1.1041025756363059, -1.1010467578893872, -1.0979908384709198,
1247 -1.0949348169250928, -1.0918786927998494, -1.0888224656469052, -1.0857661350217649,
1248 -1.0827097004837398, -1.0796531615959652, -1.0765965179254158, -1.0735397690429236,
1249 -1.0704829145231949, -1.0674259539448256, -1.0643688868903185, -1.0613117129460985,
1250 -1.0582544317025300, -1.0551970427539317, -1.0521395456985925, -1.0490819401387883,
1251 -1.0460242256807961, -1.0429664019349100, -1.0399084685154565, -1.0368504250408095,
1252 -1.0337922711334060, -1.0307340064197588, -1.0276756305304735, -1.0246171431002629,
1253 -1.0215585437679590, -1.0184998321765302, -1.0154410079730933, -1.0123820708089293,
1254 -1.0093230203394952, -1.0062638562244390, -1.0032045781276135, -1.0001451857170887,
1255 -0.9970856786651652, -0.9940260566483880, -0.9909663193475587, -0.9879064664477488,
1256 -0.9848464976383120, -0.9817864126128968, -0.9787262110694590, -0.9756658927102736,
1257 -0.9726054572419468, -0.9695449043754286, -0.9664842338260234, -0.9634234453134026,
1258 -0.9603625385616154, -0.9573015132991002, -0.9542403692586956, -0.9511791061776521,
1259 -0.9481177237976417, -0.9450562218647695, -0.9419946001295835, -0.9389328583470855,
1260 -0.9358709962767409, -0.9328090136824890, -0.9297469103327525, -0.9266846860004473,
1261 -0.9236223404629921, -0.9205598735023176, -0.9174972849048763, -0.9144345744616503,
1262 -0.9113717419681617, -0.9083087872244800, -0.9052457100352315, -0.9021825102096069,
1263 -0.8991191875613709, -0.8960557419088682, -0.8929921730750334, -0.8899284808873974,
1264 -0.8868646651780957, -0.8838007257838750, -0.8807366625461014, -0.8776724753107666,
1265 -0.8746081639284953, -0.8715437282545516, -0.8684791681488458, -0.8654144834759410,
1266 -0.8623496741050579, -0.8592847399100833, -0.8562196807695732, -0.8531544965667609,
1267 -0.8500891871895607, -0.8470237525305747, -0.8439581924870967, -0.8408925069611178,
1268 -0.8378266958593319, -0.8347607590931386, -0.8316946965786500, -0.8286285082366928,
1269 -0.8255621939928134, -0.8224957537772827, -0.8194291875250981, -0.8163624951759885,
1270 -0.8132956766744170, -0.8102287319695851, -0.8071616610154342, -0.8040944637706497,
1271 -0.8010271401986641, -0.7979596902676580, -0.7948921139505637, -0.7918244112250671,
1272 -0.7887565820736097, -0.7856886264833902, -0.7826205444463665, -0.7795523359592570,
1273 -0.7764840010235420, -0.7734155396454647, -0.7703469518360321, -0.7672782376110162,
1274 -0.7642093969909539, -0.7611404300011481, -0.7580713366716669, -0.7550021170373452,
1275 -0.7519327711377832, -0.7488632990173464, -0.7457937007251657, -0.7427239763151360,
1276 -0.7396541258459155, -0.7365841493809252, -0.7335140469883469, -0.7304438187411222,
1277 -0.7273734647169510, -0.7243029849982892, -0.7212323796723475, -0.7181616488310889,
1278 -0.7150907925712262, -0.7120198109942198, -0.7089487042062748, -0.7058774723183379,
1279 -0.7028061154460953, -0.6997346337099688, -0.6966630272351121, -0.6935912961514075,
1280 -0.6905194405934625, -0.6874474607006055, -0.6843753566168813, -0.6813031284910476,
1281 -0.6782307764765696, -0.6751583007316160, -0.6720857014190538, -0.6690129787064436,
1282 -0.6659401327660337, -0.6628671637747551, -0.6597940719142159, -0.6567208573706956,
1283 -0.6536475203351388, -0.6505740610031495, -0.6475004795749841, -0.6444267762555459,
1284 -0.6413529512543770, -0.6382790047856527, -0.6352049370681742, -0.6321307483253605,
1285 -0.6290564387852420, -0.6259820086804524, -0.6229074582482208, -0.6198327877303641,
1286 -0.6167579973732786, -0.6136830874279318, -0.6106080581498534, -0.6075329097991277,
1287 -0.6044576426403837, -0.6013822569427861, -0.5983067529800269, -0.5952311310303151,
1288 -0.5921553913763675, -0.5890795343053987, -0.5860035601091116, -0.5829274690836870,
1289 -0.5798512615297728, -0.5767749377524746, -0.5736984980613438, -0.5706219427703677,
1290 -0.5675452721979585, -0.5644684866669408, -0.5613915865045422, -0.5583145720423796,
1291 -0.5552374436164493, -0.5521602015671145, -0.5490828462390925, -0.5460053779814434,
1292 -0.5429277971475571, -0.5398501040951412, -0.5367722991862070, -0.5336943827870587,
1293 -0.5306163552682779, -0.5275382170047123, -0.5244599683754603, -0.5213816097638592,
1294 -0.5183031415574704, -0.5152245641480652, -0.5121458779316114, -0.5090670833082580,
1295 -0.5059881806823221, -0.5029091704622723, -0.4998300530607160, -0.4967508288943822,
1296 -0.4936714983841087, -0.4905920619548242, -0.4875125200355348, -0.4844328730593077,
1297 -0.4813531214632545, -0.4782732656885168, -0.4751933061802482, -0.4721132433875999,
1298 -0.4690330777637020, -0.4659528097656490, -0.4628724398544813, -0.4597919684951693,
1299 -0.4567113961565957, -0.4536307233115377, -0.4505499504366511, -0.4474690780124505,
1300 -0.4443881065232937, -0.4413070364573617, -0.4382258683066425, -0.4351446025669108,
1301 -0.4320632397377119, -0.4289817803223404, -0.4259002248278240, -0.4228185737649034,
1302 -0.4197368276480125, -0.4166549869952609, -0.4135730523284130, -0.4104910241728699,
1303 -0.4074089030576480, -0.4043266895153610, -0.4012443840821984, -0.3981619872979068,
1304 -0.3950794997057681, -0.3919969218525802, -0.3889142542886367, -0.3858314975677045,
1305 -0.3827486522470051, -0.3796657188871915, -0.3765826980523292, -0.3734995903098728,
1306 -0.3704163962306467, -0.3673331163888213, -0.3642497513618933, -0.3611663017306622,
1307 -0.3580827680792097, -0.3549991509948770, -0.3519154510682416, -0.3488316688930969,
1308 -0.3457478050664276, -0.3426638601883887, -0.3395798348622813, -0.3364957296945312,
1309 -0.3334115452946638, -0.3303272822752831, -0.3272429412520464, -0.3241585228436426,
1310 -0.3210740276717675, -0.3179894563610997, -0.3149048095392786, -0.3118200878368778,
1311 -0.3087352918873839, -0.3056504223271693, -0.3025654797954709, -0.2994804649343629,
1312 -0.2963953783887339, -0.2933102208062620, -0.2902249928373890, -0.2871396951352969,
1313 -0.2840543283558812, -0.2809688931577279, -0.2778833902020855, -0.2747978201528420,
1314 -0.2717121836764979, -0.2686264814421417, -0.2655407141214227, -0.2624548823885265,
1315 -0.2593689869201489, -0.2562830283954686, -0.2531970074961227, -0.2501109249061789,
1316 -0.2470247813121108, -0.2439385774027693, -0.2408523138693584, -0.2377659914054063,
1317 -0.2346796107067404, -0.2315931724714588, -0.2285066773999049, -0.2254201261946395,
1318 -0.2223335195604130, -0.2192468582041398, -0.2161601428348690, -0.2130733741637589,
1319 -0.2099865529040473, -0.2068996797710264, -0.2038127554820124, -0.2007257807563200,
1320 -0.1976387563152328, -0.1945516828819765, -0.1914645611816903, -0.1883773919413984,
1321 -0.1852901758899828, -0.1822029137581537, -0.1791156062784226, -0.1760282541850719,
1322 -0.1729408582141288, -0.1698534191033340, -0.1667659375921156, -0.1636784144215582,
1323 -0.1605908503343753, -0.1575032460748804, -0.1544156023889568, -0.1513279200240304,
1324 -0.1482401997290386, -0.1451524422544033, -0.1420646483519993, -0.1389768187751272,
1325 -0.1358889542784822, -0.1328010556181263, -0.1297131235514570, -0.1266251588371797,
1326 -0.1235371622352770, -0.1204491345069784, -0.1173610764147325, -0.1142729887221751,
1327 -0.1111848721941013, -0.1080967275964339, -0.1050085556961953, -0.1019203572614753,
1328 -0.0988321330614037, -0.0957438838661177, -0.0926556104467337, -0.0895673135753164,
1329 -0.0864789940248483, -0.0833906525692003, -0.0803022899831004, -0.0772139070421047,
1330 -0.0741255045225655, -0.0710370832016027, -0.0679486438570714, -0.0648601872675336,
1331 -0.0617717142122262, -0.0586832254710305, -0.0555947218244430, -0.0525062040535433,
1332 -0.0494176729399648, -0.0463291292658628, -0.0432405738138854, -0.0401520073671412,
1333 -0.0370634307091703, -0.0339748446239121, -0.0308862498956756, -0.0277976473091088,
1334 -0.0247090376491666, -0.0216204217010820, -0.0185318002503333, -0.0154431740826154,
1335 -0.0123545439838071, -0.0092659107399420, -0.0061772751371762, -0.0030886379617588,
1336 0.0000000000000000, 0.0030886379617588, 0.0061772751371762, 0.0092659107399420,
1337 0.0123545439838071, 0.0154431740826154, 0.0185318002503333, 0.0216204217010820,
1338 0.0247090376491666, 0.0277976473091088, 0.0308862498956756, 0.0339748446239121,
1339 0.0370634307091703, 0.0401520073671412, 0.0432405738138854, 0.0463291292658628,
1340 0.0494176729399648, 0.0525062040535433, 0.0555947218244430, 0.0586832254710305,
1341 0.0617717142122262, 0.0648601872675336, 0.0679486438570714, 0.0710370832016027,
1342 0.0741255045225655, 0.0772139070421047, 0.0803022899831004, 0.0833906525692003,
1343 0.0864789940248483, 0.0895673135753164, 0.0926556104467337, 0.0957438838661177,
1344 0.0988321330614037, 0.1019203572614753, 0.1050085556961953, 0.1080967275964339,
1345 0.1111848721941013, 0.1142729887221751, 0.1173610764147325, 0.1204491345069784,
1346 0.1235371622352770, 0.1266251588371797, 0.1297131235514570, 0.1328010556181263,
1347 0.1358889542784822, 0.1389768187751272, 0.1420646483519993, 0.1451524422544033,
1348 0.1482401997290386, 0.1513279200240304, 0.1544156023889568, 0.1575032460748804,
1349 0.1605908503343753, 0.1636784144215582, 0.1667659375921156, 0.1698534191033340,
1350 0.1729408582141288, 0.1760282541850719, 0.1791156062784226, 0.1822029137581537,
1351 0.1852901758899828, 0.1883773919413984, 0.1914645611816903, 0.1945516828819765,
1352 0.1976387563152328, 0.2007257807563200, 0.2038127554820124, 0.2068996797710264,
1353 0.2099865529040473, 0.2130733741637589, 0.2161601428348690, 0.2192468582041398,
1354 0.2223335195604130, 0.2254201261946395, 0.2285066773999049, 0.2315931724714588,
1355 0.2346796107067404, 0.2377659914054063, 0.2408523138693584, 0.2439385774027693,
1356 0.2470247813121108, 0.2501109249061789, 0.2531970074961227, 0.2562830283954686,
1357 0.2593689869201489, 0.2624548823885265, 0.2655407141214227, 0.2686264814421417,
1358 0.2717121836764979, 0.2747978201528420, 0.2778833902020855, 0.2809688931577279,
1359 0.2840543283558812, 0.2871396951352969, 0.2902249928373890, 0.2933102208062620,
1360 0.2963953783887339, 0.2994804649343629, 0.3025654797954709, 0.3056504223271693,
1361 0.3087352918873839, 0.3118200878368778, 0.3149048095392786, 0.3179894563610997,
1362 0.3210740276717675, 0.3241585228436426, 0.3272429412520464, 0.3303272822752831,
1363 0.3334115452946638, 0.3364957296945312, 0.3395798348622813, 0.3426638601883887,
1364 0.3457478050664276, 0.3488316688930969, 0.3519154510682416, 0.3549991509948770,
1365 0.3580827680792097, 0.3611663017306622, 0.3642497513618933, 0.3673331163888213,
1366 0.3704163962306467, 0.3734995903098728, 0.3765826980523292, 0.3796657188871915,
1367 0.3827486522470051, 0.3858314975677045, 0.3889142542886367, 0.3919969218525802,
1368 0.3950794997057681, 0.3981619872979068, 0.4012443840821984, 0.4043266895153610,
1369 0.4074089030576480, 0.4104910241728699, 0.4135730523284130, 0.4166549869952609,
1370 0.4197368276480125, 0.4228185737649034, 0.4259002248278240, 0.4289817803223404,
1371 0.4320632397377117, 0.4351446025669111, 0.4382258683066425, 0.4413070364573617,
1372 0.4443881065232935, 0.4474690780124507, 0.4505499504366511, 0.4536307233115377,
1373 0.4567113961565955, 0.4597919684951695, 0.4628724398544813, 0.4659528097656488,
1374 0.4690330777637022, 0.4721132433875999, 0.4751933061802482, 0.4782732656885166,
1375 0.4813531214632548, 0.4844328730593077, 0.4875125200355348, 0.4905920619548240,
1376 0.4936714983841087, 0.4967508288943822, 0.4998300530607158, 0.5029091704622726,
1377 0.5059881806823221, 0.5090670833082580, 0.5121458779316113, 0.5152245641480654,
1378 0.5183031415574704, 0.5213816097638592, 0.5244599683754600, 0.5275382170047123,
1379 0.5306163552682779, 0.5336943827870585, 0.5367722991862072, 0.5398501040951412,
1380 0.5429277971475571, 0.5460053779814433, 0.5490828462390928, 0.5521602015671145,
1381 0.5552374436164493, 0.5583145720423793, 0.5613915865045422, 0.5644684866669408,
1382 0.5675452721979584, 0.5706219427703679, 0.5736984980613438, 0.5767749377524745,
1383 0.5798512615297726, 0.5829274690836871, 0.5860035601091116, 0.5890795343053986,
1384 0.5921553913763673, 0.5952311310303152, 0.5983067529800269, 0.6013822569427860,
1385 0.6044576426403839, 0.6075329097991278, 0.6106080581498534, 0.6136830874279315,
1386 0.6167579973732787, 0.6198327877303641, 0.6229074582482207, 0.6259820086804526,
1387 0.6290564387852421, 0.6321307483253605, 0.6352049370681740, 0.6382790047856529,
1388 0.6413529512543770, 0.6444267762555458, 0.6475004795749840, 0.6505740610031496,
1389 0.6536475203351388, 0.6567208573706955, 0.6597940719142161, 0.6628671637747552,
1390 0.6659401327660337, 0.6690129787064435, 0.6720857014190540, 0.6751583007316160,
1391 0.6782307764765694, 0.6813031284910472, 0.6843753566168814, 0.6874474607006055,
1392 0.6905194405934625, 0.6935912961514077, 0.6966630272351122, 0.6997346337099688,
1393 0.7028061154460952, 0.7058774723183380, 0.7089487042062748, 0.7120198109942197,
1394 0.7150907925712261, 0.7181616488310891, 0.7212323796723475, 0.7243029849982890,
1395 0.7273734647169512, 0.7304438187411223, 0.7335140469883469, 0.7365841493809251,
1396 0.7396541258459156, 0.7427239763151360, 0.7457937007251656, 0.7488632990173463,
1397 0.7519327711377833, 0.7550021170373452, 0.7580713366716668, 0.7611404300011482,
1398 0.7642093969909540, 0.7672782376110162, 0.7703469518360320, 0.7734155396454648,
1399 0.7764840010235420, 0.7795523359592569, 0.7826205444463663, 0.7856886264833903,
1400 0.7887565820736097, 0.7918244112250670, 0.7948921139505639, 0.7979596902676581,
1401 0.8010271401986641, 0.8040944637706496, 0.8071616610154343, 0.8102287319695851,
1402 0.8132956766744170, 0.8163624951759882, 0.8194291875250982, 0.8224957537772827,
1403 0.8255621939928133, 0.8286285082366929, 0.8316946965786500, 0.8347607590931386,
1404 0.8378266958593317, 0.8408925069611180, 0.8439581924870967, 0.8470237525305746,
1405 0.8500891871895606, 0.8531544965667610, 0.8562196807695732, 0.8592847399100831,
1406 0.8623496741050583, 0.8654144834759411, 0.8684791681488458, 0.8715437282545514,
1407 0.8746081639284954, 0.8776724753107666, 0.8807366625461013, 0.8838007257838747,
1408 0.8868646651780958, 0.8899284808873974, 0.8929921730750333, 0.8960557419088684,
1409 0.8991191875613709, 0.9021825102096069, 0.9052457100352312, 0.9083087872244802,
1410 0.9113717419681617, 0.9144345744616502, 0.9174972849048760, 0.9205598735023178,
1411 0.9236223404629921, 0.9266846860004472, 0.9297469103327527, 0.9328090136824891,
1412 0.9358709962767409, 0.9389328583470853, 0.9419946001295836, 0.9450562218647695,
1413 0.9481177237976417, 0.9511791061776519, 0.9542403692586957, 0.9573015132991002,
1414 0.9603625385616152, 0.9634234453134028, 0.9664842338260234, 0.9695449043754285,
1415 0.9726054572419467, 0.9756658927102736, 0.9787262110694590, 0.9817864126128968,
1416 0.9848464976383122, 0.9879064664477489, 0.9909663193475587, 0.9940260566483880,
1417 0.9970856786651654, 1.0001451857170889, 1.0032045781276135, 1.0062638562244390,
1418 1.0093230203394952, 1.0123820708089293, 1.0154410079730933, 1.0184998321765304,
1419 1.0215585437679590, 1.0246171431002629, 1.0276756305304735, 1.0307340064197590,
1420 1.0337922711334060, 1.0368504250408095, 1.0399084685154563, 1.0429664019349100,
1421 1.0460242256807961, 1.0490819401387883, 1.0521395456985927, 1.0551970427539317,
1422 1.0582544317025300, 1.0613117129460985, 1.0643688868903185, 1.0674259539448256,
1423 1.0704829145231949, 1.0735397690429234, 1.0765965179254158, 1.0796531615959652,
1424 1.0827097004837398, 1.0857661350217650, 1.0888224656469052, 1.0918786927998494,
1425 1.0949348169250925, 1.0979908384709200, 1.1010467578893872, 1.1041025756363059,
1426 1.1071582921712246, 1.1102139079574118, 1.1132694234618365, 1.1163248391551530,
1427 1.1193801555116807, 1.1224353730093866, 1.1254904921298676, 1.1285455133583315,
1428 1.1316004371835790, 1.1346552640979840, 1.1377099945974760, 1.1407646291815206,
1429 1.1438191683531016, 1.1468736126186994, 1.1499279624882743, 1.1529822184752467,
1430 1.1560363810964758, 1.1590904508722426, 1.1621444283262283, 1.1651983139854962,
1431 1.1682521083804690, 1.1713058120449116, 1.1743594255159100, 1.1774129493338514,
1432 1.1804663840424017, 1.1835197301884879, 1.1865729883222769, 1.1896261589971520,
1433 1.1926792427696968, 1.1957322401996704, 1.1987851518499888, 1.2018379782867012,
1434 1.2048907200789720, 1.2079433777990570, 1.2109959520222835, 1.2140484433270270,
1435 1.2171008522946918, 1.2201531795096880, 1.2232054255594090, 1.2262575910342110,
1436 1.2293096765273910, 1.2323616826351633, 1.2354136099566380, 1.2384654590937990,
1437 1.2415172306514812, 1.2445689252373493, 1.2476205434618720, 1.2506720859383025,
1438 1.2537235532826556, 1.2567749461136817, 1.2598262650528476, 1.2628775107243113,
1439 1.2659286837549000, 1.2689797847740851, 1.2720308144139612, 1.2750817733092210,
1440 1.2781326620971334, 1.2811834814175174, 1.2842342319127213, 1.2872849142275977,
1441 1.2903355290094787, 1.2933860769081540, 1.2964365585758455, 1.2994869746671847,
1442 1.3025373258391855, 1.3055876127512245, 1.3086378360650124, 1.3116879964445736,
1443 1.3147380945562173, 1.3177881310685170, 1.3208381066522852, 1.3238880219805456,
1444 1.3269378777285121, 1.3299876745735630, 1.3330374131952154, 1.3360870942751000,
1445 1.3391367184969374, 1.3421862865465122, 1.3452357991116488, 1.3482852568821840,
1446 1.3513346605499441, 1.3543840108087193, 1.3574333083542363, 1.3604825538841352,
1447 1.3635317480979428, 1.3665808916970479, 1.3696299853846736, 1.3726790298658542,
1448 1.3757280258474083, 1.3787769740379130, 1.3818258751476769, 1.3848747298887170,
1449 1.3879235389747302, 1.3909723031210681, 1.3940210230447112, 1.3970696994642426,
1450 1.4001183330998221, 1.4031669246731584, 1.4062154749074850, 1.4092639845275339,
1451 1.4123124542595058, 1.4153608848310480, 1.4184092769712255, 1.4214576314104956,
1452 1.4245059488806797, 1.4275542301149386, 1.4306024758477451, 1.4336506868148573,
1453 1.4366988637532907, 1.4397470074012940, 1.4427951184983208, 1.4458431977850015,
1454 1.4488912460031191, 1.4519392638955804, 1.4549872522063900, 1.4580352116806217,
1455 1.4610831430643942, 1.4641310471048417, 1.4671789245500880, 1.4702267761492180,
1456 1.4732746026522530, 1.4763224048101216, 1.4793701833746320, 1.4824179390984470,
1457 1.4854656727350553, 1.4885133850387442, 1.4915610767645720, 1.4946087486683413,
1458 1.4976564015065725, 1.5007040360364747, 1.5037516530159180, 1.5067992532034090,
1459 1.5098468373580605, 1.5128944062395640, 1.5159419606081646, 1.5189895012246315,
1460 1.5220370288502318, 1.5250845442467005, 1.5281320481762162, 1.5311795414013716,
1461 1.5342270246851466, 1.5372744987908793, 1.5403219644822408, 1.5433694225232064,
1462 1.5464168736780266, 1.5494643187112020, 1.5525117583874541, 1.5555591934716988,
1463 1.5586066247290158, 1.5616540529246252, 1.5647014788238574, 1.5677489031921252,
1464 1.5707963267948966, 1.5707963267948966 };
1465 
1466 // conversion from geographic to geocentric latitude, in radians.
1467 
1468 static const double geocentric[] = {
1469 -1.5707963267948966,
1470 -1.5707963267948966, -1.5677076888331378, -1.5646190516577203, -1.5615304160549546,
1471 -1.5584417828110895, -1.5553531527122813, -1.5522645265445634, -1.5491759050938145,
1472 -1.5460872891457300, -1.5429986794857877, -1.5399100768992209, -1.5368214821709845,
1473 -1.5337328960857262, -1.5306443194277555, -1.5275557529810110, -1.5244671975290338,
1474 -1.5213786538549317, -1.5182901227413532, -1.5152016049704535, -1.5121131013238660,
1475 -1.5090246125826705, -1.5059361395273627, -1.5028476829378250, -1.4997592435932938,
1476 -1.4966708222723310, -1.4935824197527918, -1.4904940368117963, -1.4874056742256963,
1477 -1.4843173327700483, -1.4812290132195800, -1.4781407163481628, -1.4750524429287788,
1478 -1.4719641937334929, -1.4688759695334213, -1.4657877710987013, -1.4626995991984626,
1479 -1.4596114546007952, -1.4565233380727216, -1.4534352503801642, -1.4503471922879183,
1480 -1.4472591645596196, -1.4441711679577170, -1.4410832032434395, -1.4379952711767703,
1481 -1.4349073725164143, -1.4318195080197693, -1.4287316784428974, -1.4256438845404933,
1482 -1.4225561270658580, -1.4194684067708663, -1.4163807244059399, -1.4132930807200161,
1483 -1.4102054764605212, -1.4071179123733384, -1.4040303892027810, -1.4009429076915625,
1484 -1.3978554685807678, -1.3947680726098246, -1.3916807205164740, -1.3885934130367428,
1485 -1.3855061509049138, -1.3824189348534980, -1.3793317656132063, -1.3762446439129201,
1486 -1.3731575704796637, -1.3700705460385765, -1.3669835713128842, -1.3638966470238703,
1487 -1.3608097738908493, -1.3577229526311376, -1.3546361839600276, -1.3515494685907568,
1488 -1.3484628072344835, -1.3453762006002570, -1.3422896493949916, -1.3392031543234377,
1489 -1.3361167160881562, -1.3330303353894903, -1.3299440129255382, -1.3268577493921272,
1490 -1.3237715454827859, -1.3206854018887175, -1.3175993192987738, -1.3145132983994277,
1491 -1.3114273398747476, -1.3083414444063700, -1.3052556126734738, -1.3021698453527548,
1492 -1.2990841431183986, -1.2959985066420545, -1.2929129365928111, -1.2898274336371687,
1493 -1.2867419984390154, -1.2836566316595996, -1.2805713339575073, -1.2774861059886347,
1494 -1.2744009484061627, -1.2713158618605336, -1.2682308469994257, -1.2651459044677273,
1495 -1.2620610349075128, -1.2589762389580188, -1.2558915172556180, -1.2528068704337967,
1496 -1.2497222991231292, -1.2466378039512538, -1.2435533855428500, -1.2404690445196138,
1497 -1.2373847815002328, -1.2343005971003653, -1.2312164919326152, -1.2281324666065077,
1498 -1.2250485217284690, -1.2219646579017995, -1.2188808757266550, -1.2157971758000197,
1499 -1.2127135587156865, -1.2096300250642344, -1.2065465754330034, -1.2034632104060754,
1500 -1.2003799305642500, -1.1972967364850238, -1.1942136287425673, -1.1911306079077050,
1501 -1.1880476745478916, -1.1849648292271922, -1.1818820725062600, -1.1787994049423160,
1502 -1.1757168270891285, -1.1726343394969900, -1.1695519427126981, -1.1664696372795356,
1503 -1.1633874237372486, -1.1603053026220267, -1.1572232744664834, -1.1541413397996356,
1504 -1.1510594991468840, -1.1479777530299930, -1.1448961019670723, -1.1418145464725562,
1505 -1.1387330870571848, -1.1356517242279858, -1.1325704584882540, -1.1294892903375349,
1506 -1.1264082202716028, -1.1233272487824462, -1.1202463763582455, -1.1171656034833588,
1507 -1.1140849306383010, -1.1110043582997270, -1.1079238869404153, -1.1048435170292479,
1508 -1.1017632490311946, -1.0986830834072967, -1.0956030206146483, -1.0925230611063799,
1509 -1.0894432053316420, -1.0863634537355888, -1.0832838067593618, -1.0802042648400725,
1510 -1.0771248284107880, -1.0740454979005143, -1.0709662737341807, -1.0678871563326242,
1511 -1.0648081461125745, -1.0617292434866386, -1.0586504488632850, -1.0555717626468313,
1512 -1.0524931852374262, -1.0494147170310375, -1.0463363584194363, -1.0432581097901843,
1513 -1.0401799715266187, -1.0371019440078382, -1.0340240276086896, -1.0309462226997554,
1514 -1.0278685296473395, -1.0247909488134530, -1.0217134805558040, -1.0186361252277820,
1515 -1.0155588831784472, -1.0124817547525171, -1.0094047402903543, -1.0063278401279556,
1516 -1.0032510545969382, -1.0001743840245287, -0.9970978287335528, -0.9940213890424220,
1517 -0.9909450652651237, -0.9878688577112096, -0.9847927666857850, -0.9817167924894978,
1518 -0.9786409354185291, -0.9755651957645814, -0.9724895738148697, -0.9694140698521104,
1519 -0.9663386841545130, -0.9632634169957689, -0.9601882686450431, -0.9571132393669648,
1520 -0.9540383294216180, -0.9509635390645325, -0.9478888685466756, -0.9448143181144442,
1521 -0.9417398880096545, -0.9386655784695360, -0.9355913897267224, -0.9325173220092438,
1522 -0.9294433755405196, -0.9263695505393507, -0.9232958472199123, -0.9202222657917470,
1523 -0.9171488064597577, -0.9140754694242008, -0.9110022548806807, -0.9079291630201415,
1524 -0.9048561940288629, -0.9017833480884530, -0.8987106253758427, -0.8956380260632806,
1525 -0.8925655503183270, -0.8894931983038491, -0.8864209701780152, -0.8833488660942911,
1526 -0.8802768862014340, -0.8772050306434891, -0.8741332995597845, -0.8710616930849278,
1527 -0.8679902113488013, -0.8649188544765588, -0.8618476225886219, -0.8587765158006768,
1528 -0.8557055342236701, -0.8526346779638075, -0.8495639471225490, -0.8464933417966074,
1529 -0.8434228620779456, -0.8403525080537744, -0.8372822798065497, -0.8342121774139714,
1530 -0.8311422009489811, -0.8280723504797606, -0.8250026260697307, -0.8219330277775502,
1531 -0.8188635556571134, -0.8157942097575512, -0.8127249901232296, -0.8096558967937485,
1532 -0.8065869298039426, -0.8035180891838803, -0.8004493749588645, -0.7973807871494317,
1533 -0.7943123257713546, -0.7912439908356396, -0.7881757823485300, -0.7851077003115063,
1534 -0.7820397447212868, -0.7789719155698294, -0.7759042128443329, -0.7728366365272386,
1535 -0.7697691865962324, -0.7667018630242468, -0.7636346657794624, -0.7605675948253116,
1536 -0.7575006501204794, -0.7544338316189082, -0.7513671392697986, -0.7483005730176139,
1537 -0.7452341328020831, -0.7421678185582038, -0.7391016302162466, -0.7360355677017578,
1538 -0.7329696309355647, -0.7299038198337787, -0.7268381343078000, -0.7237725742643218,
1539 -0.7207071396053357, -0.7176418302281357, -0.7145766460253233, -0.7115115868848132,
1540 -0.7084466526898385, -0.7053818433189556, -0.7023171586460507, -0.6992525985403449,
1541 -0.6961881628664013, -0.6931238514841299, -0.6900596642487952, -0.6869956010110216,
1542 -0.6839316616168009, -0.6808678459074992, -0.6778041537198631, -0.6747405848860284,
1543 -0.6716771392335258, -0.6686138165852896, -0.6655506167596651, -0.6624875395704165,
1544 -0.6594245848267348, -0.6563617523332462, -0.6532990418900204, -0.6502364532925790,
1545 -0.6471739863319046, -0.6441116407944493, -0.6410494164621440, -0.6379873131124075,
1546 -0.6349253305181557, -0.6318634684478110, -0.6288017266653131, -0.6257401049301271,
1547 -0.6226786029972549, -0.6196172206172444, -0.6165559575362010, -0.6134948134957965,
1548 -0.6104337882332812, -0.6073728814814939, -0.6043120929688732, -0.6012514224194678,
1549 -0.5981908695529498, -0.5951304340846230, -0.5920701157254376, -0.5890099141819997,
1550 -0.5859498291565846, -0.5828898603471477, -0.5798300074473378, -0.5767702701465086,
1551 -0.5737106481297314, -0.5706511410778079, -0.5675917486672830, -0.5645324705704574,
1552 -0.5614733064554015, -0.5584142559859673, -0.5553553188218032, -0.5522964946183664,
1553 -0.5492377830269375, -0.5461791836946337, -0.5431206962644228, -0.5400623203751378,
1554 -0.5370040556614907, -0.5339459017540870, -0.5308878582794401, -0.5278299248599867,
1555 -0.5247721011141006, -0.5217143866561084, -0.5186567810963040, -0.5155992840409649,
1556 -0.5125418950923666, -0.5094846138487980, -0.5064274399045782, -0.5033703728500708,
1557 -0.5003134122717017, -0.4972565577519730, -0.4941998088694810, -0.4911431651989314,
1558 -0.4880866263111567, -0.4850301917731316, -0.4819738611479913, -0.4789176339950472,
1559 -0.4758615098698037, -0.4728054883239767, -0.4697495689055093, -0.4666937511585906,
1560 -0.4636380346236717, -0.4605824188374848, -0.4575269033330600, -0.4544714876397434,
1561 -0.4514161712832160, -0.4483609537855100, -0.4453058346650290, -0.4422508134365649,
1562 -0.4391958896113176, -0.4361410626969126, -0.4330863321974207, -0.4300316976133757,
1563 -0.4269771584417951, -0.4239227141761973, -0.4208683643066221, -0.4178141083196501,
1564 -0.4147599456984207, -0.4117058759226540, -0.4086518984686680, -0.4055980128094006,
1565 -0.4025442184144278, -0.3994905147499850, -0.3964369012789863, -0.3933833774610454,
1566 -0.3903299427524949, -0.3872765966064085, -0.3842233384726200, -0.3811701677977445,
1567 -0.3781170840251998, -0.3750640865952259, -0.3720111749449079, -0.3689583485081953,
1568 -0.3659056067159246, -0.3628529489958394, -0.3598003747726132, -0.3567478834678695,
1569 -0.3536954745002046, -0.3506431472852087, -0.3475909012354876, -0.3445387357606854,
1570 -0.3414866502675054, -0.3384346441597333, -0.3353827168382586, -0.3323308677010977,
1571 -0.3292790961434151, -0.3262274015575475, -0.3231757833330247, -0.3201242408565939,
1572 -0.3170727735122413, -0.3140213806812149, -0.3109700617420491, -0.3079188160705851,
1573 -0.3048676430399968, -0.3018165420208114, -0.2987655123809355, -0.2957145534856753,
1574 -0.2926636646977631, -0.2896128453773791, -0.2865620948821750, -0.2835114125672991,
1575 -0.2804607977854179, -0.2774102498867426, -0.2743597682190509, -0.2713093521277122,
1576 -0.2682590009557110, -0.2652087140436722, -0.2621584907298840, -0.2591083303503231,
1577 -0.2560582322386794, -0.2530081957263792, -0.2499582201426115, -0.2469083048143511,
1578 -0.2438584490663844, -0.2408086522213333, -0.2377589135996813, -0.2347092325197966,
1579 -0.2316596082979593, -0.2286100402483842, -0.2255605276832478, -0.2225110699127127,
1580 -0.2194616662449523, -0.2164123159861774, -0.2133630184406603, -0.2103137729107614,
1581 -0.2072645786969535, -0.2042154350978488, -0.2011663414102229, -0.1981172969290423,
1582 -0.1950683009474881, -0.1920193527569836, -0.1889704516472197, -0.1859215969061795,
1583 -0.1828727878201665, -0.1798240236738284, -0.1767753037501854, -0.1737266273306537,
1584 -0.1706779936950747, -0.1676294021217382, -0.1645808518874114, -0.1615323422673629,
1585 -0.1584838725353908, -0.1554354419638487, -0.1523870498236709, -0.1493386953844011,
1586 -0.1462903779142168, -0.1432420966799579, -0.1401938509471512, -0.1371456399800395,
1587 -0.1340974630416059, -0.1310493193936025, -0.1280012082965759, -0.1249531290098951,
1588 -0.1219050807917775, -0.1188570628993160, -0.1158090745885068, -0.1127611151142748,
1589 -0.1097131837305024, -0.1066652796900548, -0.1036174022448089, -0.1005695506456786,
1590 -0.0975217241426437, -0.0944739219847753, -0.0914261434202646, -0.0883783876964495,
1591 -0.0853306540598411, -0.0822829417561525, -0.0792352500303247, -0.0761875781265552,
1592 -0.0731399252883239, -0.0700922907584221, -0.0670446737789784, -0.0639970735914873,
1593 -0.0609494894368364, -0.0579019205553327, -0.0548543661867321, -0.0518068255702648,
1594 -0.0487592979446650, -0.0457117825481961, -0.0426642786186804, -0.0396167853935248,
1595 -0.0365693021097503, -0.0335218280040174, -0.0304743623126556, -0.0274269042716904,
1596 -0.0243794531168700, -0.0213320080836945, -0.0182845684074421, -0.0152371333231980,
1597 -0.0121897020658807, -0.0091422738702712, -0.0060948479710391, -0.0030474236027716,
1598 0.0000000000000000, 0.0030474236027716, 0.0060948479710391, 0.0091422738702712,
1599 0.0121897020658807, 0.0152371333231980, 0.0182845684074421, 0.0213320080836945,
1600 0.0243794531168700, 0.0274269042716904, 0.0304743623126556, 0.0335218280040174,
1601 0.0365693021097503, 0.0396167853935248, 0.0426642786186804, 0.0457117825481961,
1602 0.0487592979446650, 0.0518068255702648, 0.0548543661867321, 0.0579019205553327,
1603 0.0609494894368364, 0.0639970735914873, 0.0670446737789784, 0.0700922907584221,
1604 0.0731399252883239, 0.0761875781265552, 0.0792352500303247, 0.0822829417561525,
1605 0.0853306540598411, 0.0883783876964495, 0.0914261434202646, 0.0944739219847753,
1606 0.0975217241426437, 0.1005695506456786, 0.1036174022448089, 0.1066652796900548,
1607 0.1097131837305024, 0.1127611151142748, 0.1158090745885068, 0.1188570628993160,
1608 0.1219050807917775, 0.1249531290098951, 0.1280012082965759, 0.1310493193936025,
1609 0.1340974630416059, 0.1371456399800395, 0.1401938509471512, 0.1432420966799579,
1610 0.1462903779142168, 0.1493386953844011, 0.1523870498236709, 0.1554354419638487,
1611 0.1584838725353908, 0.1615323422673629, 0.1645808518874114, 0.1676294021217382,
1612 0.1706779936950747, 0.1737266273306537, 0.1767753037501854, 0.1798240236738284,
1613 0.1828727878201665, 0.1859215969061795, 0.1889704516472197, 0.1920193527569836,
1614 0.1950683009474881, 0.1981172969290423, 0.2011663414102229, 0.2042154350978488,
1615 0.2072645786969535, 0.2103137729107614, 0.2133630184406603, 0.2164123159861774,
1616 0.2194616662449523, 0.2225110699127127, 0.2255605276832478, 0.2286100402483842,
1617 0.2316596082979593, 0.2347092325197966, 0.2377589135996813, 0.2408086522213333,
1618 0.2438584490663844, 0.2469083048143511, 0.2499582201426115, 0.2530081957263792,
1619 0.2560582322386794, 0.2591083303503231, 0.2621584907298840, 0.2652087140436722,
1620 0.2682590009557110, 0.2713093521277122, 0.2743597682190509, 0.2774102498867426,
1621 0.2804607977854179, 0.2835114125672991, 0.2865620948821750, 0.2896128453773791,
1622 0.2926636646977631, 0.2957145534856753, 0.2987655123809355, 0.3018165420208114,
1623 0.3048676430399968, 0.3079188160705851, 0.3109700617420491, 0.3140213806812149,
1624 0.3170727735122413, 0.3201242408565939, 0.3231757833330247, 0.3262274015575475,
1625 0.3292790961434151, 0.3323308677010977, 0.3353827168382586, 0.3384346441597333,
1626 0.3414866502675054, 0.3445387357606854, 0.3475909012354876, 0.3506431472852087,
1627 0.3536954745002046, 0.3567478834678695, 0.3598003747726132, 0.3628529489958394,
1628 0.3659056067159246, 0.3689583485081953, 0.3720111749449079, 0.3750640865952259,
1629 0.3781170840251998, 0.3811701677977445, 0.3842233384726200, 0.3872765966064085,
1630 0.3903299427524949, 0.3933833774610454, 0.3964369012789863, 0.3994905147499850,
1631 0.4025442184144278, 0.4055980128094006, 0.4086518984686680, 0.4117058759226540,
1632 0.4147599456984207, 0.4178141083196501, 0.4208683643066221, 0.4239227141761973,
1633 0.4269771584417949, 0.4300316976133759, 0.4330863321974207, 0.4361410626969126,
1634 0.4391958896113174, 0.4422508134365651, 0.4453058346650290, 0.4483609537855100,
1635 0.4514161712832158, 0.4544714876397437, 0.4575269033330600, 0.4605824188374846,
1636 0.4636380346236719, 0.4666937511585906, 0.4697495689055093, 0.4728054883239765,
1637 0.4758615098698039, 0.4789176339950472, 0.4819738611479913, 0.4850301917731313,
1638 0.4880866263111567, 0.4911431651989314, 0.4941998088694807, 0.4972565577519732,
1639 0.5003134122717017, 0.5033703728500708, 0.5064274399045780, 0.5094846138487981,
1640 0.5125418950923666, 0.5155992840409649, 0.5186567810963038, 0.5217143866561084,
1641 0.5247721011141006, 0.5278299248599865, 0.5308878582794403, 0.5339459017540870,
1642 0.5370040556614907, 0.5400623203751377, 0.5431206962644230, 0.5461791836946337,
1643 0.5492377830269375, 0.5522964946183662, 0.5553553188218032, 0.5584142559859673,
1644 0.5614733064554014, 0.5645324705704576, 0.5675917486672830, 0.5706511410778078,
1645 0.5737106481297312, 0.5767702701465087, 0.5798300074473378, 0.5828898603471476,
1646 0.5859498291565843, 0.5890099141819998, 0.5920701157254376, 0.5951304340846229,
1647 0.5981908695529500, 0.6012514224194680, 0.6043120929688731, 0.6073728814814937,
1648 0.6104337882332813, 0.6134948134957965, 0.6165559575362007, 0.6196172206172447,
1649 0.6226786029972549, 0.6257401049301271, 0.6288017266653130, 0.6318634684478113,
1650 0.6349253305181557, 0.6379873131124074, 0.6410494164621438, 0.6441116407944494,
1651 0.6471739863319046, 0.6502364532925788, 0.6532990418900205, 0.6563617523332463,
1652 0.6594245848267348, 0.6624875395704165, 0.6655506167596653, 0.6686138165852896,
1653 0.6716771392335257, 0.6747405848860282, 0.6778041537198634, 0.6808678459074992,
1654 0.6839316616168007, 0.6869956010110218, 0.6900596642487954, 0.6931238514841299,
1655 0.6961881628664012, 0.6992525985403450, 0.7023171586460507, 0.7053818433189555,
1656 0.7084466526898383, 0.7115115868848134, 0.7145766460253233, 0.7176418302281355,
1657 0.7207071396053360, 0.7237725742643220, 0.7268381343078000, 0.7299038198337786,
1658 0.7329696309355649, 0.7360355677017578, 0.7391016302162465, 0.7421678185582037,
1659 0.7452341328020832, 0.7483005730176139, 0.7513671392697985, 0.7544338316189083,
1660 0.7575006501204795, 0.7605675948253116, 0.7636346657794623, 0.7667018630242469,
1661 0.7697691865962324, 0.7728366365272384, 0.7759042128443326, 0.7789719155698295,
1662 0.7820397447212868, 0.7851077003115062, 0.7881757823485303, 0.7912439908356397,
1663 0.7943123257713546, 0.7973807871494316, 0.8004493749588646, 0.8035180891838803,
1664 0.8065869298039425, 0.8096558967937484, 0.8127249901232297, 0.8157942097575512,
1665 0.8188635556571133, 0.8219330277775504, 0.8250026260697310, 0.8280723504797606,
1666 0.8311422009489808, 0.8342121774139715, 0.8372822798065497, 0.8403525080537743,
1667 0.8434228620779455, 0.8464933417966075, 0.8495639471225490, 0.8526346779638074,
1668 0.8557055342236705, 0.8587765158006768, 0.8618476225886219, 0.8649188544765586,
1669 0.8679902113488013, 0.8710616930849278, 0.8741332995597844, 0.8772050306434889,
1670 0.8802768862014341, 0.8833488660942911, 0.8864209701780152, 0.8894931983038492,
1671 0.8925655503183271, 0.8956380260632806, 0.8987106253758426, 0.9017833480884531,
1672 0.9048561940288629, 0.9079291630201414, 0.9110022548806804, 0.9140754694242010,
1673 0.9171488064597577, 0.9202222657917469, 0.9232958472199125, 0.9263695505393509,
1674 0.9294433755405196, 0.9325173220092435, 0.9355913897267225, 0.9386655784695360,
1675 0.9417398880096545, 0.9448143181144439, 0.9478888685466759, 0.9509635390645325,
1676 0.9540383294216178, 0.9571132393669650, 0.9601882686450431, 0.9632634169957687,
1677 0.9663386841545127, 0.9694140698521105, 0.9724895738148697, 0.9755651957645813,
1678 0.9786409354185294, 0.9817167924894980, 0.9847927666857850, 0.9878688577112096,
1679 0.9909450652651239, 0.9940213890424222, 0.9970978287335528, 1.0001743840245285,
1680 1.0032510545969382, 1.0063278401279556, 1.0094047402903543, 1.0124817547525173,
1681 1.0155588831784472, 1.0186361252277820, 1.0217134805558040, 1.0247909488134532,
1682 1.0278685296473395, 1.0309462226997554, 1.0340240276086894, 1.0371019440078382,
1683 1.0401799715266187, 1.0432581097901843, 1.0463363584194365, 1.0494147170310375,
1684 1.0524931852374262, 1.0555717626468313, 1.0586504488632853, 1.0617292434866386,
1685 1.0648081461125745, 1.0678871563326240, 1.0709662737341807, 1.0740454979005143,
1686 1.0771248284107880, 1.0802042648400727, 1.0832838067593618, 1.0863634537355888,
1687 1.0894432053316419, 1.0925230611063800, 1.0956030206146483, 1.0986830834072967,
1688 1.1017632490311944, 1.1048435170292479, 1.1079238869404153, 1.1110043582997270,
1689 1.1140849306383012, 1.1171656034833588, 1.1202463763582455, 1.1233272487824457,
1690 1.1264082202716030, 1.1294892903375349, 1.1325704584882540, 1.1356517242279855,
1691 1.1387330870571848, 1.1418145464725562, 1.1448961019670723, 1.1479777530299933,
1692 1.1510594991468840, 1.1541413397996356, 1.1572232744664834, 1.1603053026220270,
1693 1.1633874237372486, 1.1664696372795356, 1.1695519427126980, 1.1726343394969900,
1694 1.1757168270891285, 1.1787994049423160, 1.1818820725062600, 1.1849648292271922,
1695 1.1880476745478916, 1.1911306079077049, 1.1942136287425678, 1.1972967364850238,
1696 1.2003799305642500, 1.2034632104060752, 1.2065465754330034, 1.2096300250642344,
1697 1.2127135587156865, 1.2157971758000200, 1.2188808757266550, 1.2219646579017995,
1698 1.2250485217284688, 1.2281324666065080, 1.2312164919326152, 1.2343005971003653,
1699 1.2373847815002326, 1.2404690445196138, 1.2435533855428500, 1.2466378039512538,
1700 1.2497222991231294, 1.2528068704337967, 1.2558915172556180, 1.2589762389580186,
1701 1.2620610349075130, 1.2651459044677273, 1.2682308469994257, 1.2713158618605336,
1702 1.2744009484061627, 1.2774861059886347, 1.2805713339575073, 1.2836566316595999,
1703 1.2867419984390154, 1.2898274336371687, 1.2929129365928110, 1.2959985066420547,
1704 1.2990841431183986, 1.3021698453527548, 1.3052556126734736, 1.3083414444063700,
1705 1.3114273398747476, 1.3145132983994277, 1.3175993192987740, 1.3206854018887175,
1706 1.3237715454827859, 1.3268577493921270, 1.3299440129255384, 1.3330303353894903,
1707 1.3361167160881562, 1.3392031543234375, 1.3422896493949916, 1.3453762006002570,
1708 1.3484628072344833, 1.3515494685907570, 1.3546361839600276, 1.3577229526311376,
1709 1.3608097738908491, 1.3638966470238705, 1.3669835713128842, 1.3700705460385765,
1710 1.3731575704796635, 1.3762446439129201, 1.3793317656132063, 1.3824189348534979,
1711 1.3855061509049140, 1.3885934130367428, 1.3916807205164740, 1.3947680726098244,
1712 1.3978554685807680, 1.4009429076915625, 1.4040303892027810, 1.4071179123733386,
1713 1.4102054764605212, 1.4132930807200161, 1.4163807244059394, 1.4194684067708665,
1714 1.4225561270658580, 1.4256438845404933, 1.4287316784428970, 1.4318195080197695,
1715 1.4349073725164143, 1.4379952711767703, 1.4410832032434397, 1.4441711679577170,
1716 1.4472591645596196, 1.4503471922879179, 1.4534352503801644, 1.4565233380727216,
1717 1.4596114546007952, 1.4626995991984624, 1.4657877710987015, 1.4688759695334213,
1718 1.4719641937334929, 1.4750524429287790, 1.4781407163481628, 1.4812290132195800,
1719 1.4843173327700480, 1.4874056742256965, 1.4904940368117963, 1.4935824197527918,
1720 1.4966708222723308, 1.4997592435932940, 1.5028476829378250, 1.5059361395273627,
1721 1.5090246125826707, 1.5121131013238660, 1.5152016049704535, 1.5182901227413530,
1722 1.5213786538549319, 1.5244671975290338, 1.5275557529810110, 1.5306443194277553,
1723 1.5337328960857264, 1.5368214821709845, 1.5399100768992207, 1.5429986794857880,
1724 1.5460872891457300, 1.5491759050938145, 1.5522645265445632, 1.5553531527122815,
1725 1.5584417828110895, 1.5615304160549546, 1.5646190516577200, 1.5677076888331380,
1726 1.5707963267948966, 1.5707963267948966 };
1727 
1728 // the two arrays above have 1027 elements each. The latitude spacing of the points
1729 // is GEOTESS_DLAT = PI/1024 radians. The first value is at -PI/2-GEOTESS_DLAT and
1730 // the last value is at PI/2+GEOTESS_DLAT. The extra elements on the ends account
1731 // for the possibility of small roundoff errors.
1732 
1733 static const double GEOTESS_DLAT = PI/1024.;
1734 
1735 static const double GEOTESS_LAT0 = -PI/2. - GEOTESS_DLAT;
1736 
1737 // GEOTESS_E is ( 1 - eccentricity squared) for the WGS84 ellipsoid.
1738 static const double GEOTESS_E = 0.99330562000985870000;
1739 
1740 inline double GeoTessUtils::getGeoGraphicLatitude(const double& lat)
1741 {
1742  // convert lat from geocentric to geographic latitude.
1743  if (approximateLatitudes)
1744  {
1745  double tmp = (lat - GEOTESS_LAT0) / GEOTESS_DLAT;
1746  int i = (int) tmp;
1747  return geographic[i] + (tmp - i) * (geographic[i + 1] - geographic[i]);
1748  }
1749  return atan(tan(lat) / GEOTESS_E);
1750 }
1751 
1752 inline double GeoTessUtils::getGeoCentricLatitude(const double& lat)
1753 {
1754  // convert lat from geographic to geocentric latitude.
1755  if (approximateLatitudes)
1756  {
1757  double tmp = (lat - GEOTESS_LAT0) / GEOTESS_DLAT;
1758  int i = (int) tmp;
1759  return geocentric[i] + (tmp - i) * (geocentric[i + 1] - geocentric[i]);
1760  }
1761  return atan(tan(lat) * GEOTESS_E);
1762 }
1763 
1764 } // end namespace geotess
1765 
1766 #endif // GEOTESSUTILS_OBJECT_H
1767 
static double angleDegrees(const double *const v0, const double *const v1)
Definition: GeoTessUtils.h:500
virtual int class_size() const
Definition: GeoTessUtils.h:127
static double getLon(const double *const v)
Definition: GeoTessUtils.h:559
static double getLat(const double *const v)
Definition: GeoTessUtils.h:548
static double * circumCenterPlus(const double *const v0, const double *const v1, const double *const v2)
Definition: GeoTessUtils.h:920
static void circumCenterPlus(double const *const *const t, double *const vs)
Definition: GeoTessUtils.h:950
static double * getVector(const double &lat, const double &lon, double *v)
Definition: GeoTessUtils.h:650
static bool isPole(const double *const u)
Definition: GeoTessUtils.h:1043
static double * center(double const *const *const v, int n)
Definition: GeoTessUtils.h:1164
static double normalize(double *const u)
Definition: GeoTessUtils.h:692
static double crossNormal(const double *const u, const double *const v, double *const w)
Definition: GeoTessUtils.h:760
static double crossNorth(const double *const u, double *const w)
Definition: GeoTessUtils.h:781
static double getTriangleArea(const double *const v0, const double *const v1, const double *const v2, double *work1, double *work2, double *work3)
Definition: GeoTessUtils.h:1139
static void circumCenter(const double *const v0, const double *const v1, const double *const v2, double *const vs)
Definition: GeoTessUtils.h:866
static void normalizeFast(double *const u)
Definition: GeoTessUtils.h:676
Collection of static functions to manipulate geographic information.
Definition: GeoTessUtils.h:69
static double * getVectorDegrees(const double &lat, const double &lon)
Definition: GeoTessUtils.h:600
static bool moveDistAz(const double *const w, double distance, double azimuth, double *const u)
Definition: GeoTessUtils.h:968
static bool approximateLatitudes
Definition: GeoTessUtils.h:100
static bool moveNorth(const double *const x, double distance, double *const z)
Definition: GeoTessUtils.h:1020
static double getDistance3D(const double *const v0, double r0, const double *const v1, double r1)
Definition: GeoTessUtils.h:522
static void circumCenterPlus(const double *const v0, const double *const v1, const double *const v2, double *const vs)
Definition: GeoTessUtils.h:891
static double dot(const double *const v0, const double *const v1)
Definition: GeoTessUtils.h:143
static bool vectorTripleProduct(const double *const v0, const double *const v1, const double *const v2, double *const rslt)
Definition: GeoTessUtils.h:813
static double getEarthRadius(const double *const v)
Definition: GeoTessUtils.h:537
static double * getVectorDegrees(const double &lat, const double &lon, double *v)
Definition: GeoTessUtils.h:616
static bool parallel(const double *const u, const double *const v)
Definition: GeoTessUtils.h:1057
static void transform(const double *x, double const *const *const t, double *const g)
Definition: GeoTessUtils.h:441
GeoTessUtils()
Definition: GeoTessUtils.h:105
static void cross(const double *const v1, const double *const v2, double *const rslt)
Definition: GeoTessUtils.h:719
static void move(const double *const w, const double *const vtp, double a, double *const u)
Definition: GeoTessUtils.h:996
static double getLonDegrees(const double *const v)
Definition: GeoTessUtils.h:584
static double length(const double *const u)
Definition: GeoTessUtils.h:405
static double * getGreatCirclePoint(double const *const *const greatCircle, double distance)
Definition: GeoTessUtils.h:1078
static bool vectorTripleProductNorthPole(const double *const u, double *const w)
Definition: GeoTessUtils.h:847
static double getTriangleArea(const double *const v0, const double *const v1, const double *const v2)
Definition: GeoTessUtils.h:1120
static double * getVector(const double &lat, const double &lon)
Definition: GeoTessUtils.h:633
virtual ~GeoTessUtils()
Definition: GeoTessUtils.h:112
static string class_name()
Definition: GeoTessUtils.h:120
static string getVersion()
Definition: GeoTessUtils.h:134
#define GEOTESS_EXP_IMP
Definition: CPPGlobals.h:71
static double angle(const double *const v0, const double *const v1)
Definition: GeoTessUtils.h:482
static double * crossNormal(const double *const u, const double *const v)
Definition: GeoTessUtils.h:737
static double scalarTripleProduct(const double *const v0, const double *const v1, const double *const v2)
Definition: GeoTessUtils.h:155
static void writeString(ofstream &ofs, const string &s)
Definition: GeoTessUtils.h:469
static void readString(string &s, ifstream &ifs)
Definition: GeoTessUtils.h:454
static double getLatDegrees(const double *const v)
Definition: GeoTessUtils.h:570
static void center(vector< double * > v, double *x)
Definition: GeoTessUtils.h:1188
static void getGreatCirclePoint(double const *const *const greatCircle, double distance, double *const v)
Definition: GeoTessUtils.h:1103