| AlbersEqualArea.hpp | | AlbersEqualArea.hpp | |
| | | | |
| skipping to change at line 91 | | skipping to change at line 91 | |
| } | | } | |
| // return atanh(sqrt(x))/sqrt(x) - 1, accurate for small x | | // return atanh(sqrt(x))/sqrt(x) - 1, accurate for small x | |
| static real atanhxm1(real x); | | static real atanhxm1(real x); | |
| | | | |
| // Divided differences | | // Divided differences | |
| // Definition: Df(x,y) = (f(x)-f(y))/(x-y) | | // Definition: Df(x,y) = (f(x)-f(y))/(x-y) | |
| // See: | | // See: | |
| // W. M. Kahan and R. J. Fateman, | | // W. M. Kahan and R. J. Fateman, | |
| // Symbolic computation of divided differences, | | // Symbolic computation of divided differences, | |
| // SIGSAM Bull. 33(3), 7-28 (1999) | | // SIGSAM Bull. 33(3), 7-28 (1999) | |
|
| // http://dx.doi.org/10.1145/334714.334716 | | // https://dx.doi.org/10.1145/334714.334716 | |
| // http://www.cs.berkeley.edu/~fateman/papers/divdiff.pdf | | // http://www.cs.berkeley.edu/~fateman/papers/divdiff.pdf | |
| // | | // | |
| // General rules | | // General rules | |
| // h(x) = f(g(x)): Dh(x,y) = Df(g(x),g(y))*Dg(x,y) | | // h(x) = f(g(x)): Dh(x,y) = Df(g(x),g(y))*Dg(x,y) | |
| // h(x) = f(x)*g(x): | | // h(x) = f(x)*g(x): | |
| // Dh(x,y) = Df(x,y)*g(x) + Dg(x,y)*f(y) | | // Dh(x,y) = Df(x,y)*g(x) + Dg(x,y)*f(y) | |
| // = Df(x,y)*g(y) + Dg(x,y)*f(x) | | // = Df(x,y)*g(y) + Dg(x,y)*f(x) | |
| // = Df(x,y)*(g(x)+g(y))/2 + Dg(x,y)*(f(x)+f(y))/2 | | // = Df(x,y)*(g(x)+g(y))/2 + Dg(x,y)*(f(x)+f(y))/2 | |
| // | | // | |
| // sn(x) = x/sqrt(1+x^2): Dsn(x,y) = (x+y)/((sn(x)+sn(y))*(1+x^2)*(1+y^
2)) | | // sn(x) = x/sqrt(1+x^2): Dsn(x,y) = (x+y)/((sn(x)+sn(y))*(1+x^2)*(1+y^
2)) | |
| | | | |
End of changes. 1 change blocks. |
| 1 lines changed or deleted | | 1 lines changed or added | |
|
| DMS.hpp | | DMS.hpp | |
| /** | | /** | |
| * \file DMS.hpp | | * \file DMS.hpp | |
| * \brief Header for GeographicLib::DMS class | | * \brief Header for GeographicLib::DMS class | |
| * | | * | |
|
| * Copyright (c) Charles Karney (2008-2011) <charles@karney.com> and licens
ed | | * Copyright (c) Charles Karney (2008-2014) <charles@karney.com> and licens
ed | |
| * under the MIT/X11 License. For more information, see | | * under the MIT/X11 License. For more information, see | |
| * http://geographiclib.sourceforge.net/ | | * http://geographiclib.sourceforge.net/ | |
| **********************************************************************/ | | **********************************************************************/ | |
| | | | |
| #if !defined(GEOGRAPHICLIB_DMS_HPP) | | #if !defined(GEOGRAPHICLIB_DMS_HPP) | |
| #define GEOGRAPHICLIB_DMS_HPP 1 | | #define GEOGRAPHICLIB_DMS_HPP 1 | |
| | | | |
| #include <GeographicLib/Constants.hpp> | | #include <GeographicLib/Constants.hpp> | |
| #include <GeographicLib/Utility.hpp> | | #include <GeographicLib/Utility.hpp> | |
| | | | |
| | | | |
| skipping to change at line 123 | | skipping to change at line 123 | |
| * | | * | |
| * @param[in] dms string input. | | * @param[in] dms string input. | |
| * @param[out] ind a DMS::flag value signaling the presence of a | | * @param[out] ind a DMS::flag value signaling the presence of a | |
| * hemisphere indicator. | | * hemisphere indicator. | |
| * @exception GeographicErr if \e dms is malformed (see below). | | * @exception GeographicErr if \e dms is malformed (see below). | |
| * @return angle (degrees). | | * @return angle (degrees). | |
| * | | * | |
| * Degrees, minutes, and seconds are indicated by the characters d, ' | | * Degrees, minutes, and seconds are indicated by the characters d, ' | |
| * (single quote), " (double quote), and these components may only
be | | * (single quote), " (double quote), and these components may only
be | |
| * given in this order. Any (but not all) components may be omitted an
d | | * given in this order. Any (but not all) components may be omitted an
d | |
|
| * other symbols (e.g., the ° symbol for degrees and the unicode | | * other symbols (e.g., the ° symbol for degrees and the unicode pr | |
| * prime and double prime symbols for minutes and seconds) may be | | ime | |
| * substituted. The last component indicator may be omitted and is ass | | * and double prime symbols for minutes and seconds) may be substituted | |
| umed | | ; | |
| * to be the next smallest unit (thus 33d10 is interpreted as 33d10'). | | * two single quotes can be used instead of ". The last component | |
| The | | * indicator may be omitted and is assumed to be the next smallest unit | |
| * final component may be a decimal fraction but the non-final componen | | * (thus 33d10 is interpreted as 33d10'). The final component may be a | |
| ts | | * decimal fraction but the non-final components must be integers. Ins | |
| * must be integers. Instead of using d, ', and " to indicate | | tead | |
| * degrees, minutes, and seconds, : (colon) may be used to <i>separate< | | * of using d, ', and " to indicate degrees, minutes, and seconds, | |
| /i> | | : | |
| * these components (numbers must appear before and after each colon); | | * (colon) may be used to <i>separate</i> these components (numbers mus | |
| thus | | t | |
| * 50d30'10.3" may be written as 50:30:10.3, 5.5' may be written | | * appear before and after each colon); thus 50d30'10.3" may be | |
| * 0:5.5, and so on. The integer parts of the minutes and seconds | | * written as 50:30:10.3, 5.5' may be written 0:5.5, and so on. The | |
| * components must be less than 60. A single leading sign is permitted | | * integer parts of the minutes and seconds components must be less tha | |
| . A | | n | |
| * hemisphere designator (N, E, W, S) may be added to the beginning or | | * 60. A single leading sign is permitted. A hemisphere designator (N | |
| end | | , E, | |
| * of the string. The result is multiplied by the implied sign of the | | * W, S) may be added to the beginning or end of the string. The resul | |
| * hemisphere designator (negative for S and W). In addition \e ind is | | t is | |
| set | | * multiplied by the implied sign of the hemisphere designator (negativ | |
| * to DMS::LATITUDE if N or S is present, to DMS::LONGITUDE if E or W i | | e | |
| s | | * for S and W). In addition \e ind is set to DMS::LATITUDE if N or S | |
| * present, and to DMS::NONE otherwise. Throws an error on a malformed | | is | |
| * string. No check is performed on the range of the result. Examples | | * present, to DMS::LONGITUDE if E or W is present, and to DMS::NONE | |
| of | | * otherwise. Throws an error on a malformed string. No check is | |
| * legal and illegal strings are | | * performed on the range of the result. Examples of legal and illegal | |
| | | * strings are | |
| * - <i>LEGAL</i> (all the entries on each line are equivalent) | | * - <i>LEGAL</i> (all the entries on each line are equivalent) | |
| * - -20.51125, 20d30'40.5"S, -20°30'40.5, -20d30.675, | | * - -20.51125, 20d30'40.5"S, -20°30'40.5, -20d30.675, | |
| * N-20d30'40.5", -20:30:40.5 | | * N-20d30'40.5", -20:30:40.5 | |
| * - 4d0'9, 4d9", 4d9'', 4:0:9, 004:00:09, 4.0025, 4.0025d, 4d0.
15, | | * - 4d0'9, 4d9", 4d9'', 4:0:9, 004:00:09, 4.0025, 4.0025d, 4d0.
15, | |
| * 04:.15 | | * 04:.15 | |
| * - <i>ILLEGAL</i> (the exception thrown explains the problem) | | * - <i>ILLEGAL</i> (the exception thrown explains the problem) | |
| * - 4d5"4', 4::5, 4:5:, :4:5, 4d4.5'4", -N20.5, 1.8e2d, 4:
60, | | * - 4d5"4', 4::5, 4:5:, :4:5, 4d4.5'4", -N20.5, 1.8e2d, 4:
60, | |
| * 4d-5' | | * 4d-5' | |
| * | | * | |
| * <b>NOTE:</b> At present, all the string handling in the C++ | | * <b>NOTE:</b> At present, all the string handling in the C++ | |
| | | | |
| skipping to change at line 284 | | skipping to change at line 285 | |
| * A hemisphere designator E/W can be used; the result is multiplied by | | * A hemisphere designator E/W can be used; the result is multiplied by | |
| * −1 if W is present. | | * −1 if W is present. | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| static Math::real DecodeAzimuth(const std::string& azistr); | | static Math::real DecodeAzimuth(const std::string& azistr); | |
| | | | |
| /** | | /** | |
| * Convert angle (in degrees) into a DMS string (using d, ', and "
). | | * Convert angle (in degrees) into a DMS string (using d, ', and "
). | |
| * | | * | |
| * @param[in] angle input angle (degrees) | | * @param[in] angle input angle (degrees) | |
| * @param[in] trailing DMS::component value indicating the trailing uni
ts | | * @param[in] trailing DMS::component value indicating the trailing uni
ts | |
|
| * on the string and this is given as a decimal number if necessary. | | * of the string (this component is given as a decimal number if | |
| | | * necessary). | |
| * @param[in] prec the number of digits after the decimal point for the | | * @param[in] prec the number of digits after the decimal point for the | |
| * trailing component. | | * trailing component. | |
| * @param[in] ind DMS::flag value indicated additional formatting. | | * @param[in] ind DMS::flag value indicated additional formatting. | |
| * @param[in] dmssep if non-null, use as the DMS separator character | | * @param[in] dmssep if non-null, use as the DMS separator character | |
| * (instead of d, ', " delimiters). | | * (instead of d, ', " delimiters). | |
| * @exception std::bad_alloc if memory for the string can't be allocate
d. | | * @exception std::bad_alloc if memory for the string can't be allocate
d. | |
| * @return formatted string | | * @return formatted string | |
| * | | * | |
| * The interpretation of \e ind is as follows: | | * The interpretation of \e ind is as follows: | |
| * - ind == DMS::NONE, signed result no leading zeros on degrees except
in | | * - ind == DMS::NONE, signed result no leading zeros on degrees except
in | |
| | | | |
End of changes. 3 change blocks. |
| 30 lines changed or deleted | | 32 lines changed or added | |
|
| EllipticFunction.hpp | | EllipticFunction.hpp | |
| | | | |
| skipping to change at line 46 | | skipping to change at line 46 | |
| * In geodesic applications, it is convenient to separate the incomplete | | * In geodesic applications, it is convenient to separate the incomplete | |
| * integrals into secular and periodic components, e.g., | | * integrals into secular and periodic components, e.g., | |
| * \f[ | | * \f[ | |
| * E(\phi, k) = (2 E(\phi) / \pi) [ \phi + \delta E(\phi, k) ] | | * E(\phi, k) = (2 E(\phi) / \pi) [ \phi + \delta E(\phi, k) ] | |
| * \f] | | * \f] | |
| * where δ\e E(φ, \e k) is an odd periodic function with period | | * where δ\e E(φ, \e k) is an odd periodic function with period | |
| * π. | | * π. | |
| * | | * | |
| * The computation of the elliptic integrals uses the algorithms given in | | * The computation of the elliptic integrals uses the algorithms given in | |
| * - B. C. Carlson, | | * - B. C. Carlson, | |
|
| * <a href="http://dx.doi.org/10.1007/BF02198293"> Computation of real
or | | * <a href="https://dx.doi.org/10.1007/BF02198293"> Computation of real
or | |
| * complex elliptic integrals</a>, Numerical Algorithms 10, 13--26 (199
5) | | * complex elliptic integrals</a>, Numerical Algorithms 10, 13--26 (199
5) | |
| * . | | * . | |
| * with the additional optimizations given in http://dlmf.nist.gov/19.36.
i. | | * with the additional optimizations given in http://dlmf.nist.gov/19.36.
i. | |
| * The computation of the Jacobi elliptic functions uses the algorithm gi
ven | | * The computation of the Jacobi elliptic functions uses the algorithm gi
ven | |
| * in | | * in | |
| * - R. Bulirsch, | | * - R. Bulirsch, | |
|
| * <a href="http://dx.doi.org/10.1007/BF01397975"> Numerical Calculatio
n of | | * <a href="https://dx.doi.org/10.1007/BF01397975"> Numerical Calculati
on of | |
| * Elliptic Integrals and Elliptic Functions</a>, Numericshe Mathematik
7, | | * Elliptic Integrals and Elliptic Functions</a>, Numericshe Mathematik
7, | |
| * 78--90 (1965). | | * 78--90 (1965). | |
| * . | | * . | |
| * The notation follows http://dlmf.nist.gov/19 and http://dlmf.nist.gov/
22 | | * The notation follows http://dlmf.nist.gov/19 and http://dlmf.nist.gov/
22 | |
| * | | * | |
| * Example of use: | | * Example of use: | |
| * \include example-EllipticFunction.cpp | | * \include example-EllipticFunction.cpp | |
| **********************************************************************/ | | **********************************************************************/ | |
| class GEOGRAPHICLIB_EXPORT EllipticFunction { | | class GEOGRAPHICLIB_EXPORT EllipticFunction { | |
| private: | | private: | |
| | | | |
| skipping to change at line 243 | | skipping to change at line 243 | |
| | | | |
| /** | | /** | |
| * The complete integral of the third kind. | | * The complete integral of the third kind. | |
| * | | * | |
| * @return Π(α<sup>2</sup>, \e k) | | * @return Π(α<sup>2</sup>, \e k) | |
| * | | * | |
| * Π(α<sup>2</sup>, \e k) is defined in | | * Π(α<sup>2</sup>, \e k) is defined in | |
| * http://dlmf.nist.gov/19.2.E7 | | * http://dlmf.nist.gov/19.2.E7 | |
| * \f[ | | * \f[ | |
| * \Pi(\alpha^2, k) = \int_0^{\pi/2} | | * \Pi(\alpha^2, k) = \int_0^{\pi/2} | |
|
| * \frac1{\sqrt{1-k^2\sin^2\phi}(1 - \alpha^2\sin^2\phi_)}\,d\phi. | | * \frac1{\sqrt{1-k^2\sin^2\phi}(1 - \alpha^2\sin^2\phi)}\,d\phi. | |
| * \f] | | * \f] | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| Math::real Pi() const { return _Pic; } | | Math::real Pi() const { return _Pic; } | |
| | | | |
| /** | | /** | |
| * Legendre's complete geodesic longitude integral. | | * Legendre's complete geodesic longitude integral. | |
| * | | * | |
| * @return \e G(α<sup>2</sup>, \e k) | | * @return \e G(α<sup>2</sup>, \e k) | |
| * | | * | |
| * \e G(α<sup>2</sup>, \e k) is given by | | * \e G(α<sup>2</sup>, \e k) is given by | |
| | | | |
| skipping to change at line 333 | | skipping to change at line 333 | |
| /** | | /** | |
| * The incomplete integral of the third kind. | | * The incomplete integral of the third kind. | |
| * | | * | |
| * @param[in] phi | | * @param[in] phi | |
| * @return Π(φ, α<sup>2</sup>, \e k). | | * @return Π(φ, α<sup>2</sup>, \e k). | |
| * | | * | |
| * Π(φ, α<sup>2</sup>, \e k) is defined in | | * Π(φ, α<sup>2</sup>, \e k) is defined in | |
| * http://dlmf.nist.gov/19.2.E7 | | * http://dlmf.nist.gov/19.2.E7 | |
| * \f[ | | * \f[ | |
| * \Pi(\phi, \alpha^2, k) = \int_0^\phi | | * \Pi(\phi, \alpha^2, k) = \int_0^\phi | |
|
| * \frac1{\sqrt{1-k^2\sin^2\theta}(1 - \alpha^2\sin^2\theta_)}\,d\t
heta. | | * \frac1{\sqrt{1-k^2\sin^2\theta}(1 - \alpha^2\sin^2\theta)}\,d\th
eta. | |
| * \f] | | * \f] | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| Math::real Pi(real phi) const; | | Math::real Pi(real phi) const; | |
| | | | |
| /** | | /** | |
| * Jahnke's incomplete elliptic integral. | | * Jahnke's incomplete elliptic integral. | |
| * | | * | |
| * @param[in] phi | | * @param[in] phi | |
| * @return \e D(φ, \e k). | | * @return \e D(φ, \e k). | |
| * | | * | |
| | | | |
| skipping to change at line 372 | | skipping to change at line 372 | |
| * \frac{k^2}{\alpha^2} F(\phi, k) + | | * \frac{k^2}{\alpha^2} F(\phi, k) + | |
| * \biggl(1 - \frac{k^2}{\alpha^2}\biggr) \Pi(\phi, \alpha^2, k) \
\ | | * \biggl(1 - \frac{k^2}{\alpha^2}\biggr) \Pi(\phi, \alpha^2, k) \
\ | |
| * &= \int_0^\phi | | * &= \int_0^\phi | |
| * \frac{\sqrt{1-k^2\sin^2\theta}}{1 - \alpha^2\sin^2\theta}\,d\the
ta. | | * \frac{\sqrt{1-k^2\sin^2\theta}}{1 - \alpha^2\sin^2\theta}\,d\the
ta. | |
| * \end{align} | | * \end{align} | |
| * \f] | | * \f] | |
| * | | * | |
| * Legendre expresses the longitude of a point on the geodesic in terms
of | | * Legendre expresses the longitude of a point on the geodesic in terms
of | |
| * this combination of elliptic integrals in Exercices de Calcul | | * this combination of elliptic integrals in Exercices de Calcul | |
| * Intégral, Vol. 1 (1811), p. 181, | | * Intégral, Vol. 1 (1811), p. 181, | |
|
| * http://books.google.com/books?id=riIOAAAAQAAJ&pg=PA181. | | * https://books.google.com/books?id=riIOAAAAQAAJ&pg=PA181. | |
| * | | * | |
| * See \ref geodellip for the expression for the longitude in terms of
this | | * See \ref geodellip for the expression for the longitude in terms of
this | |
| * function. | | * function. | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| Math::real G(real phi) const; | | Math::real G(real phi) const; | |
| | | | |
| /** | | /** | |
| * Cayley's geodesic longitude difference integral. | | * Cayley's geodesic longitude difference integral. | |
| * | | * | |
| * @param[in] phi | | * @param[in] phi | |
| | | | |
| skipping to change at line 399 | | skipping to change at line 399 | |
| * \frac1{\alpha^2} F(\phi, k) + | | * \frac1{\alpha^2} F(\phi, k) + | |
| * \biggl(1 - \frac1{\alpha^2}\biggr) \Pi(\phi, \alpha^2, k) \\ | | * \biggl(1 - \frac1{\alpha^2}\biggr) \Pi(\phi, \alpha^2, k) \\ | |
| * &= \int_0^\phi | | * &= \int_0^\phi | |
| * \frac{\cos^2\theta}{(1-\alpha^2\sin^2\theta)\sqrt{1-k^2\sin^2\th
eta}} | | * \frac{\cos^2\theta}{(1-\alpha^2\sin^2\theta)\sqrt{1-k^2\sin^2\th
eta}} | |
| * \,d\theta. | | * \,d\theta. | |
| * \end{align} | | * \end{align} | |
| * \f] | | * \f] | |
| * | | * | |
| * Cayley expresses the longitude difference of a point on the geodesic
in | | * Cayley expresses the longitude difference of a point on the geodesic
in | |
| * terms of this combination of elliptic integrals in Phil. Mag. <b>40<
/b> | | * terms of this combination of elliptic integrals in Phil. Mag. <b>40<
/b> | |
|
| * (1870), p. 333, http://books.google.com/books?id=Zk0wAAAAIAAJ&pg=PA3
33. | | * (1870), p. 333, https://books.google.com/books?id=Zk0wAAAAIAAJ&pg=PA
333. | |
| * | | * | |
| * See \ref geodellip for the expression for the longitude in terms of
this | | * See \ref geodellip for the expression for the longitude in terms of
this | |
| * function. | | * function. | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| Math::real H(real phi) const; | | Math::real H(real phi) const; | |
| ///@} | | ///@} | |
| | | | |
| /** \name Incomplete integrals in terms of Jacobi elliptic functions. | | /** \name Incomplete integrals in terms of Jacobi elliptic functions. | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| /** | | /** | |
| | | | |
End of changes. 6 change blocks. |
| 6 lines changed or deleted | | 6 lines changed or added | |
|
| Geocentric.hpp | | Geocentric.hpp | |
| | | | |
| skipping to change at line 32 | | skipping to change at line 32 | |
| * lon, height = \e h (measured vertically from the surface of the ellips
oid) | | * lon, height = \e h (measured vertically from the surface of the ellips
oid) | |
| * to geocentric coordinates (\e X, \e Y, \e Z). The origin of geocentri
c | | * to geocentric coordinates (\e X, \e Y, \e Z). The origin of geocentri
c | |
| * coordinates is at the center of the earth. The \e Z axis goes thru th
e | | * coordinates is at the center of the earth. The \e Z axis goes thru th
e | |
| * north pole, \e lat = 90°. The \e X axis goes thru \e lat = 0, | | * north pole, \e lat = 90°. The \e X axis goes thru \e lat = 0, | |
| * \e lon = 0. %Geocentric coordinates are also known as earth centered, | | * \e lon = 0. %Geocentric coordinates are also known as earth centered, | |
| * earth fixed (ECEF) coordinates. | | * earth fixed (ECEF) coordinates. | |
| * | | * | |
| * The conversion from geographic to geocentric coordinates is | | * The conversion from geographic to geocentric coordinates is | |
| * straightforward. For the reverse transformation we use | | * straightforward. For the reverse transformation we use | |
| * - H. Vermeille, | | * - H. Vermeille, | |
|
| * <a href="http://dx.doi.org/10.1007/s00190-002-0273-6"> Direct | | * <a href="https://dx.doi.org/10.1007/s00190-002-0273-6"> Direct | |
| * transformation from geocentric coordinates to geodetic coordinates</
a>, | | * transformation from geocentric coordinates to geodetic coordinates</
a>, | |
| * J. Geodesy 76, 451--454 (2002). | | * J. Geodesy 76, 451--454 (2002). | |
| * . | | * . | |
| * Several changes have been made to ensure that the method returns accur
ate | | * Several changes have been made to ensure that the method returns accur
ate | |
| * results for all finite inputs (even if \e h is infinite). The changes
are | | * results for all finite inputs (even if \e h is infinite). The changes
are | |
| * described in Appendix B of | | * described in Appendix B of | |
| * - C. F. F. Karney, | | * - C. F. F. Karney, | |
| * <a href="http://arxiv.org/abs/1102.1215v1">Geodesics | | * <a href="http://arxiv.org/abs/1102.1215v1">Geodesics | |
| * on an ellipsoid of revolution</a>, | | * on an ellipsoid of revolution</a>, | |
| * Feb. 2011; | | * Feb. 2011; | |
| * preprint | | * preprint | |
| * <a href="http://arxiv.org/abs/1102.1215v1">arxiv:1102.1215v1</a>. | | * <a href="http://arxiv.org/abs/1102.1215v1">arxiv:1102.1215v1</a>. | |
| * . | | * . | |
| * Vermeille similarly updated his method in | | * Vermeille similarly updated his method in | |
| * - H. Vermeille, | | * - H. Vermeille, | |
|
| * <a href="http://dx.doi.org/10.1007/s00190-010-0419-x"> | | * <a href="https://dx.doi.org/10.1007/s00190-010-0419-x"> | |
| * An analytical method to transform geocentric into | | * An analytical method to transform geocentric into | |
| * geodetic coordinates</a>, J. Geodesy 85, 105--117 (2011). | | * geodetic coordinates</a>, J. Geodesy 85, 105--117 (2011). | |
| * . | | * . | |
| * See \ref geocentric for more information. | | * See \ref geocentric for more information. | |
| * | | * | |
| * The errors in these routines are close to round-off. Specifically, fo
r | | * The errors in these routines are close to round-off. Specifically, fo
r | |
| * points within 5000 km of the surface of the ellipsoid (either inside o
r | | * points within 5000 km of the surface of the ellipsoid (either inside o
r | |
| * outside the ellipsoid), the error is bounded by 7 nm (7 nanometers) fo
r | | * outside the ellipsoid), the error is bounded by 7 nm (7 nanometers) fo
r | |
| * the WGS84 ellipsoid. See \ref geocentric for further information on t
he | | * the WGS84 ellipsoid. See \ref geocentric for further information on t
he | |
| * errors. | | * errors. | |
| | | | |
End of changes. 2 change blocks. |
| 2 lines changed or deleted | | 2 lines changed or added | |
|
| GeodesicLine.hpp | | GeodesicLine.hpp | |
| | | | |
| skipping to change at line 42 | | skipping to change at line 42 | |
| * Sec. 9 of | | * Sec. 9 of | |
| * <a href="http://arxiv.org/abs/1102.1215v1">arXiv:1102.1215v1</a> for | | * <a href="http://arxiv.org/abs/1102.1215v1">arXiv:1102.1215v1</a> for | |
| * details. The algorithms used by this class are based on series expans
ions | | * details. The algorithms used by this class are based on series expans
ions | |
| * using the flattening \e f as a small parameter. These are only accura
te | | * using the flattening \e f as a small parameter. These are only accura
te | |
| * for |<i>f</i>| < 0.02; however reasonably accurate results will be | | * for |<i>f</i>| < 0.02; however reasonably accurate results will be | |
| * obtained for |<i>f</i>| < 0.2. For very eccentric ellipsoids, use | | * obtained for |<i>f</i>| < 0.2. For very eccentric ellipsoids, use | |
| * GeodesicLineExact instead. | | * GeodesicLineExact instead. | |
| * | | * | |
| * The algorithms are described in | | * The algorithms are described in | |
| * - C. F. F. Karney, | | * - C. F. F. Karney, | |
|
| * <a href="http://dx.doi.org/10.1007/s00190-012-0578-z"> | | * <a href="https://dx.doi.org/10.1007/s00190-012-0578-z"> | |
| * Algorithms for geodesics</a>, | | * Algorithms for geodesics</a>, | |
| * J. Geodesy <b>87</b>, 43--55 (2013); | | * J. Geodesy <b>87</b>, 43--55 (2013); | |
|
| * DOI: <a href="http://dx.doi.org/10.1007/s00190-012-0578-z"> | | * DOI: <a href="https://dx.doi.org/10.1007/s00190-012-0578-z"> | |
| * 10.1007/s00190-012-0578-z</a>; | | * 10.1007/s00190-012-0578-z</a>; | |
| * addenda: <a href="http://geographiclib.sf.net/geod-addenda.html"> | | * addenda: <a href="http://geographiclib.sf.net/geod-addenda.html"> | |
| * geod-addenda.html</a>. | | * geod-addenda.html</a>. | |
| * . | | * . | |
| * For more information on geodesics see \ref geodesic. | | * For more information on geodesics see \ref geodesic. | |
| * | | * | |
| * Example of use: | | * Example of use: | |
| * \include example-GeodesicLine.cpp | | * \include example-GeodesicLine.cpp | |
| * | | * | |
| * <a href="GeodSolve.1.html">GeodSolve</a> is a command-line utility | | * <a href="GeodSolve.1.html">GeodSolve</a> is a command-line utility | |
| | | | |
End of changes. 2 change blocks. |
| 2 lines changed or deleted | | 2 lines changed or added | |
|
| Gnomonic.hpp | | Gnomonic.hpp | |
| | | | |
| skipping to change at line 25 | | skipping to change at line 25 | |
| #include <GeographicLib/Constants.hpp> | | #include <GeographicLib/Constants.hpp> | |
| | | | |
| namespace GeographicLib { | | namespace GeographicLib { | |
| | | | |
| /** | | /** | |
| * \brief %Gnomonic projection | | * \brief %Gnomonic projection | |
| * | | * | |
| * %Gnomonic projection centered at an arbitrary position \e C on the | | * %Gnomonic projection centered at an arbitrary position \e C on the | |
| * ellipsoid. This projection is derived in Section 8 of | | * ellipsoid. This projection is derived in Section 8 of | |
| * - C. F. F. Karney, | | * - C. F. F. Karney, | |
|
| * <a href="http://dx.doi.org/10.1007/s00190-012-0578-z"> | | * <a href="https://dx.doi.org/10.1007/s00190-012-0578-z"> | |
| * Algorithms for geodesics</a>, | | * Algorithms for geodesics</a>, | |
| * J. Geodesy <b>87</b>, 43--55 (2013); | | * J. Geodesy <b>87</b>, 43--55 (2013); | |
|
| * DOI: <a href="http://dx.doi.org/10.1007/s00190-012-0578-z"> | | * DOI: <a href="https://dx.doi.org/10.1007/s00190-012-0578-z"> | |
| * 10.1007/s00190-012-0578-z</a>; | | * 10.1007/s00190-012-0578-z</a>; | |
| * addenda: <a href="http://geographiclib.sf.net/geod-addenda.html"> | | * addenda: <a href="http://geographiclib.sf.net/geod-addenda.html"> | |
| * geod-addenda.html</a>. | | * geod-addenda.html</a>. | |
| * . | | * . | |
| * The projection of \e P is defined as follows: compute the geodesic lin
e | | * The projection of \e P is defined as follows: compute the geodesic lin
e | |
| * from \e C to \e P; compute the reduced length \e m12, geodesic scale \
e | | * from \e C to \e P; compute the reduced length \e m12, geodesic scale \
e | |
| * M12, and ρ = <i>m12</i>/\e M12; finally \e x = ρ sin \e azi1;
\e | | * M12, and ρ = <i>m12</i>/\e M12; finally \e x = ρ sin \e azi1;
\e | |
| * y = ρ cos \e azi1, where \e azi1 is the azimuth of the geodesic at
\e | | * y = ρ cos \e azi1, where \e azi1 is the azimuth of the geodesic at
\e | |
| * C. The Gnomonic::Forward and Gnomonic::Reverse methods also return th
e | | * C. The Gnomonic::Forward and Gnomonic::Reverse methods also return th
e | |
| * azimuth \e azi of the geodesic at \e P and reciprocal scale \e rk in t
he | | * azimuth \e azi of the geodesic at \e P and reciprocal scale \e rk in t
he | |
| | | | |
End of changes. 2 change blocks. |
| 2 lines changed or deleted | | 2 lines changed or added | |
|
| LambertConformalConic.hpp | | LambertConformalConic.hpp | |
| | | | |
| skipping to change at line 78 | | skipping to change at line 78 | |
| inline real eatanhe(real x) const { | | inline real eatanhe(real x) const { | |
| using std::atan; | | using std::atan; | |
| return _f >= 0 ? _e * Math::atanh(_e * x) : - _e * atan(_e * x); | | return _f >= 0 ? _e * Math::atanh(_e * x) : - _e * atan(_e * x); | |
| } | | } | |
| // Divided differences | | // Divided differences | |
| // Definition: Df(x,y) = (f(x)-f(y))/(x-y) | | // Definition: Df(x,y) = (f(x)-f(y))/(x-y) | |
| // See: | | // See: | |
| // W. M. Kahan and R. J. Fateman, | | // W. M. Kahan and R. J. Fateman, | |
| // Symbolic computation of divided differences, | | // Symbolic computation of divided differences, | |
| // SIGSAM Bull. 33(3), 7-28 (1999) | | // SIGSAM Bull. 33(3), 7-28 (1999) | |
|
| // http://dx.doi.org/10.1145/334714.334716 | | // https://dx.doi.org/10.1145/334714.334716 | |
| // http://www.cs.berkeley.edu/~fateman/papers/divdiff.pdf | | // http://www.cs.berkeley.edu/~fateman/papers/divdiff.pdf | |
| // | | // | |
| // General rules | | // General rules | |
| // h(x) = f(g(x)): Dh(x,y) = Df(g(x),g(y))*Dg(x,y) | | // h(x) = f(g(x)): Dh(x,y) = Df(g(x),g(y))*Dg(x,y) | |
| // h(x) = f(x)*g(x): | | // h(x) = f(x)*g(x): | |
| // Dh(x,y) = Df(x,y)*g(x) + Dg(x,y)*f(y) | | // Dh(x,y) = Df(x,y)*g(x) + Dg(x,y)*f(y) | |
| // = Df(x,y)*g(y) + Dg(x,y)*f(x) | | // = Df(x,y)*g(y) + Dg(x,y)*f(x) | |
| // = Df(x,y)*(g(x)+g(y))/2 + Dg(x,y)*(f(x)+f(y))/2 | | // = Df(x,y)*(g(x)+g(y))/2 + Dg(x,y)*(f(x)+f(y))/2 | |
| // | | // | |
| // hyp(x) = sqrt(1+x^2): Dhyp(x,y) = (x+y)/(hyp(x)+hyp(y)) | | // hyp(x) = sqrt(1+x^2): Dhyp(x,y) = (x+y)/(hyp(x)+hyp(y)) | |
| | | | |
End of changes. 1 change blocks. |
| 1 lines changed or deleted | | 1 lines changed or added | |
|
| MGRS.hpp | | MGRS.hpp | |
| | | | |
| skipping to change at line 238 | | skipping to change at line 238 | |
| * the zone number followed by one of [C--M] for the southern | | * the zone number followed by one of [C--M] for the southern | |
| * hemisphere and [N--X] for the northern hemisphere. For \e zone = | | * hemisphere and [N--X] for the northern hemisphere. For \e zone = | |
| * 0, the MGRS coordinates begins with one of [AB] for the southern | | * 0, the MGRS coordinates begins with one of [AB] for the southern | |
| * hemisphere and [XY] for the northern hemisphere. | | * hemisphere and [XY] for the northern hemisphere. | |
| * | | * | |
| * The conversion to the MGRS is exact for prec in [0, 5] except that a | | * The conversion to the MGRS is exact for prec in [0, 5] except that a | |
| * neighboring latitude band letter may be given if the point is within
5nm | | * neighboring latitude band letter may be given if the point is within
5nm | |
| * of a band boundary. For prec in [6, 11], the conversion is accurate
to | | * of a band boundary. For prec in [6, 11], the conversion is accurate
to | |
| * roundoff. | | * roundoff. | |
| * | | * | |
|
| * If \e prec = -1, then the "grid zone designation", e.g., 18T, is | | * If \e prec = −1, then the "grid zone designation", e.g., 18T,
is | |
| * returned. This consists of the UTM zone number (absent for UPS) and
the | | * returned. This consists of the UTM zone number (absent for UPS) and
the | |
| * first letter of the MGRS string which labels the latitude band for U
TM | | * first letter of the MGRS string which labels the latitude band for U
TM | |
| * and the hemisphere for UPS. | | * and the hemisphere for UPS. | |
| * | | * | |
| * If \e x or \e y is NaN or if \e zone is UTMUPS::INVALID, the returne
d | | * If \e x or \e y is NaN or if \e zone is UTMUPS::INVALID, the returne
d | |
| * MGRS string is "INVALID". | | * MGRS string is "INVALID". | |
| * | | * | |
| * Return the result via a reference argument to avoid the overhead of | | * Return the result via a reference argument to avoid the overhead of | |
| * allocating a potentially large number of small strings. If an error
is | | * allocating a potentially large number of small strings. If an error
is | |
| * thrown, then \e mgrs is unchanged. | | * thrown, then \e mgrs is unchanged. | |
| | | | |
| skipping to change at line 314 | | skipping to change at line 314 | |
| * | | * | |
| * The UTM/UPS selection and the UTM zone is preserved in the conversio
n | | * The UTM/UPS selection and the UTM zone is preserved in the conversio
n | |
| * from MGRS coordinate. The conversion is exact for prec in [0, 5].
With | | * from MGRS coordinate. The conversion is exact for prec in [0, 5].
With | |
| * centerp = true the conversion from MGRS to geographic and back is | | * centerp = true the conversion from MGRS to geographic and back is | |
| * stable. This is not assured if \e centerp = false. | | * stable. This is not assured if \e centerp = false. | |
| * | | * | |
| * If a "grid zone designation" (for example, 18T or A) is given, then
some | | * If a "grid zone designation" (for example, 18T or A) is given, then
some | |
| * suitable (but essentially arbitrary) point within that grid zone is | | * suitable (but essentially arbitrary) point within that grid zone is | |
| * returned. The main utility of the conversion is to allow \e zone an
d \e | | * returned. The main utility of the conversion is to allow \e zone an
d \e | |
| * northp to be determined. In this case, the \e centerp parameter is | | * northp to be determined. In this case, the \e centerp parameter is | |
|
| * ignored. | | * ignored and \e prec is set to −1. | |
| * | | * | |
| * If the first 3 characters of \e mgrs are "INV", then \e x and \e y a
re | | * If the first 3 characters of \e mgrs are "INV", then \e x and \e y a
re | |
|
| * set to NaN and \e zone is set to UTMUPS::INVALID. | | * set to NaN, \e zone is set to UTMUPS::INVALID, and \e prec is set to | |
| | | * −2. | |
| * | | * | |
| * If an exception is thrown, then the arguments are unchanged. | | * If an exception is thrown, then the arguments are unchanged. | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| static void Reverse(const std::string& mgrs, | | static void Reverse(const std::string& mgrs, | |
| int& zone, bool& northp, real& x, real& y, | | int& zone, bool& northp, real& x, real& y, | |
| int& prec, bool centerp = true); | | int& prec, bool centerp = true); | |
| | | | |
| /** \name Inspector functions | | /** \name Inspector functions | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| ///@{ | | ///@{ | |
| | | | |
End of changes. 3 change blocks. |
| 3 lines changed or deleted | | 4 lines changed or added | |
|
| MagneticModel.hpp | | MagneticModel.hpp | |
| | | | |
| skipping to change at line 45 | | skipping to change at line 45 | |
| * | | * | |
| * See \ref magnetic for details of how to install the magnetic model and
the | | * See \ref magnetic for details of how to install the magnetic model and
the | |
| * data format. | | * data format. | |
| * | | * | |
| * See | | * See | |
| * - General information: | | * - General information: | |
| * - http://geomag.org/models/index.html | | * - http://geomag.org/models/index.html | |
| * - WMM2010: | | * - WMM2010: | |
| * - http://ngdc.noaa.gov/geomag/WMM/DoDWMM.shtml | | * - http://ngdc.noaa.gov/geomag/WMM/DoDWMM.shtml | |
| * - http://ngdc.noaa.gov/geomag/WMM/data/WMM2010/WMM2010COF.zip | | * - http://ngdc.noaa.gov/geomag/WMM/data/WMM2010/WMM2010COF.zip | |
|
| | | * - WMM2015: | |
| | | * - http://ngdc.noaa.gov/geomag/WMM/DoDWMM.shtml | |
| | | * - http://ngdc.noaa.gov/geomag/WMM/data/WMM2015/WMM2015COF.zip | |
| * - IGRF11: | | * - IGRF11: | |
| * - http://ngdc.noaa.gov/IAGA/vmod/igrf.html | | * - http://ngdc.noaa.gov/IAGA/vmod/igrf.html | |
| * - http://ngdc.noaa.gov/IAGA/vmod/igrf11coeffs.txt | | * - http://ngdc.noaa.gov/IAGA/vmod/igrf11coeffs.txt | |
| * - http://ngdc.noaa.gov/IAGA/vmod/geomag70_linux.tar.gz | | * - http://ngdc.noaa.gov/IAGA/vmod/geomag70_linux.tar.gz | |
| * - EMM2010: | | * - EMM2010: | |
| * - http://ngdc.noaa.gov/geomag/EMM/index.html | | * - http://ngdc.noaa.gov/geomag/EMM/index.html | |
| * - http://ngdc.noaa.gov/geomag/EMM/data/geomag/EMM2010_Sph_Windows_Li
nux.zip | | * - http://ngdc.noaa.gov/geomag/EMM/data/geomag/EMM2010_Sph_Windows_Li
nux.zip | |
| * | | * | |
| * Example of use: | | * Example of use: | |
| * \include example-MagneticModel.cpp | | * \include example-MagneticModel.cpp | |
| | | | |
| skipping to change at line 330 | | skipping to change at line 333 | |
| * GEOGRAPHICLIB_DATA is set; otherwise, it is a compile-time default | | * GEOGRAPHICLIB_DATA is set; otherwise, it is a compile-time default | |
| * (/usr/local/share/GeographicLib/magnetic on non-Windows systems and | | * (/usr/local/share/GeographicLib/magnetic on non-Windows systems and | |
| * C:/ProgramData/GeographicLib/magnetic on Windows systems). | | * C:/ProgramData/GeographicLib/magnetic on Windows systems). | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| static std::string DefaultMagneticPath(); | | static std::string DefaultMagneticPath(); | |
| | | | |
| /** | | /** | |
| * @return the default name for the magnetic model. | | * @return the default name for the magnetic model. | |
| * | | * | |
| * This is the value of the environment variable | | * This is the value of the environment variable | |
|
| * GEOGRAPHICLIB_MAGNETIC_NAME, if set; otherwise, it is "wmm2010". Th
e | | * GEOGRAPHICLIB_MAGNETIC_NAME, if set; otherwise, it is "wmm2015". Th
e | |
| * MagneticModel class does not use this function; it is just provided
as a | | * MagneticModel class does not use this function; it is just provided
as a | |
| * convenience for a calling program when constructing a MagneticModel | | * convenience for a calling program when constructing a MagneticModel | |
| * object. | | * object. | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| static std::string DefaultMagneticName(); | | static std::string DefaultMagneticName(); | |
| }; | | }; | |
| | | | |
| } // namespace GeographicLib | | } // namespace GeographicLib | |
| | | | |
| #if defined(_MSC_VER) | | #if defined(_MSC_VER) | |
| | | | |
End of changes. 2 change blocks. |
| 1 lines changed or deleted | | 4 lines changed or added | |
|
| Math.hpp | | Math.hpp | |
| | | | |
| skipping to change at line 25 | | skipping to change at line 25 | |
| #define GEOGRAPHICLIB_MATH_HPP 1 | | #define GEOGRAPHICLIB_MATH_HPP 1 | |
| | | | |
| /** | | /** | |
| * Are C++11 math functions available? | | * Are C++11 math functions available? | |
| **********************************************************************/ | | **********************************************************************/ | |
| #if !defined(GEOGRAPHICLIB_CXX11_MATH) | | #if !defined(GEOGRAPHICLIB_CXX11_MATH) | |
| // Recent versions of g++ -std=c++11 (4.7 and later?) set __cplusplus to 20
1103 | | // Recent versions of g++ -std=c++11 (4.7 and later?) set __cplusplus to 20
1103 | |
| // and support the new C++11 mathematical functions, std::atanh, etc. Howe
ver | | // and support the new C++11 mathematical functions, std::atanh, etc. Howe
ver | |
| // the Android toolchain, which uses g++ -std=c++11 (4.8 as of 2014-03-11, | | // the Android toolchain, which uses g++ -std=c++11 (4.8 as of 2014-03-11, | |
| // according to Pullan Lu), does not support std::atanh. Android toolchain
s | | // according to Pullan Lu), does not support std::atanh. Android toolchain
s | |
|
| // might define __ANDROID__ or ANDROID; so need to check both. | | // might define __ANDROID__ or ANDROID; so need to check both. With OSX th | |
| # if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ >= 7 \ | | e | |
| && __cplusplus >= 201103 && \ | | // version is GNUC version 4.2 and __cplusplus is set to 201103, so remove | |
| | | the | |
| | | // version check on GNUC. | |
| | | # if defined(__GNUC__) && __cplusplus >= 201103 && \ | |
| !(defined(__ANDROID__) || defined(ANDROID) || defined(__CYGWIN__)) | | !(defined(__ANDROID__) || defined(ANDROID) || defined(__CYGWIN__)) | |
| # define GEOGRAPHICLIB_CXX11_MATH 1 | | # define GEOGRAPHICLIB_CXX11_MATH 1 | |
| // Visual C++ 12 supports these functions | | // Visual C++ 12 supports these functions | |
| # elif defined(_MSC_VER) && _MSC_VER >= 1800 | | # elif defined(_MSC_VER) && _MSC_VER >= 1800 | |
| # define GEOGRAPHICLIB_CXX11_MATH 1 | | # define GEOGRAPHICLIB_CXX11_MATH 1 | |
| # else | | # else | |
| # define GEOGRAPHICLIB_CXX11_MATH 0 | | # define GEOGRAPHICLIB_CXX11_MATH 0 | |
| # endif | | # endif | |
| #endif | | #endif | |
| | | | |
| | | | |
| skipping to change at line 264 | | skipping to change at line 265 | |
| template<typename T> static inline T hypot(T x, T y) { | | template<typename T> static inline T hypot(T x, T y) { | |
| #if GEOGRAPHICLIB_CXX11_MATH | | #if GEOGRAPHICLIB_CXX11_MATH | |
| using std::hypot; return hypot(x, y); | | using std::hypot; return hypot(x, y); | |
| #else | | #else | |
| using std::abs; using std::sqrt; | | using std::abs; using std::sqrt; | |
| x = abs(x); y = abs(y); | | x = abs(x); y = abs(y); | |
| if (x < y) std::swap(x, y); // Now x >= y >= 0 | | if (x < y) std::swap(x, y); // Now x >= y >= 0 | |
| y /= (x ? x : 1); | | y /= (x ? x : 1); | |
| return x * sqrt(1 + y * y); | | return x * sqrt(1 + y * y); | |
| // For an alternative (square-root free) method see | | // For an alternative (square-root free) method see | |
|
| // C. Moler and D. Morrision (1983) http://dx.doi.org/10.1147/rd.276. | | // C. Moler and D. Morrision (1983) https://dx.doi.org/10.1147/rd.276 | |
| 0577 | | .0577 | |
| // and A. A. Dubrulle (1983) http://dx.doi.org/10.1147/rd.276.0582 | | // and A. A. Dubrulle (1983) https://dx.doi.org/10.1147/rd.276.0582 | |
| #endif | | #endif | |
| } | | } | |
| | | | |
| /** | | /** | |
| * exp(\e x) − 1 accurate near \e x = 0. | | * exp(\e x) − 1 accurate near \e x = 0. | |
| * | | * | |
| * @tparam T the type of the argument and the returned value. | | * @tparam T the type of the argument and the returned value. | |
| * @param[in] x | | * @param[in] x | |
| * @return exp(\e x) − 1. | | * @return exp(\e x) − 1. | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| template<typename T> static inline T expm1(T x) { | | template<typename T> static inline T expm1(T x) { | |
| #if GEOGRAPHICLIB_CXX11_MATH | | #if GEOGRAPHICLIB_CXX11_MATH | |
| using std::expm1; return expm1(x); | | using std::expm1; return expm1(x); | |
| #else | | #else | |
| using std::exp; using std::abs; using std::log; | | using std::exp; using std::abs; using std::log; | |
|
| volatile T | | GEOGRAPHICLIB_VOLATILE T | |
| y = exp(x), | | y = exp(x), | |
| z = y - 1; | | z = y - 1; | |
| // The reasoning here is similar to that for log1p. The expression | | // The reasoning here is similar to that for log1p. The expression | |
| // mathematically reduces to exp(x) - 1, and the factor z/log(y) = (y
- | | // mathematically reduces to exp(x) - 1, and the factor z/log(y) = (y
- | |
| // 1)/log(y) is a slowly varying quantity near y = 1 and is accuratel
y | | // 1)/log(y) is a slowly varying quantity near y = 1 and is accuratel
y | |
| // computed. | | // computed. | |
| return abs(x) > 1 ? z : (z == 0 ? x : x * z / log(y)); | | return abs(x) > 1 ? z : (z == 0 ? x : x * z / log(y)); | |
| #endif | | #endif | |
| } | | } | |
| | | | |
| | | | |
| skipping to change at line 304 | | skipping to change at line 305 | |
| * | | * | |
| * @tparam T the type of the argument and the returned value. | | * @tparam T the type of the argument and the returned value. | |
| * @param[in] x | | * @param[in] x | |
| * @return log(1 + \e x). | | * @return log(1 + \e x). | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| template<typename T> static inline T log1p(T x) { | | template<typename T> static inline T log1p(T x) { | |
| #if GEOGRAPHICLIB_CXX11_MATH | | #if GEOGRAPHICLIB_CXX11_MATH | |
| using std::log1p; return log1p(x); | | using std::log1p; return log1p(x); | |
| #else | | #else | |
| using std::log; | | using std::log; | |
|
| volatile T | | GEOGRAPHICLIB_VOLATILE T | |
| y = 1 + x, | | y = 1 + x, | |
| z = y - 1; | | z = y - 1; | |
| // Here's the explanation for this magic: y = 1 + z, exactly, and z | | // Here's the explanation for this magic: y = 1 + z, exactly, and z | |
| // approx x, thus log(y)/z (which is nearly constant near z = 0) retu
rns | | // approx x, thus log(y)/z (which is nearly constant near z = 0) retu
rns | |
| // a good approximation to the true log(1 + x)/x. The multiplication
x * | | // a good approximation to the true log(1 + x)/x. The multiplication
x * | |
| // (log(y)/z) introduces little additional error. | | // (log(y)/z) introduces little additional error. | |
| return z == 0 ? x : x * log(y) / z; | | return z == 0 ? x : x * log(y) / z; | |
| #endif | | #endif | |
| } | | } | |
| | | | |
| | | | |
End of changes. 4 change blocks. |
| 8 lines changed or deleted | | 11 lines changed or added | |
|
| NormalGravity.hpp | | NormalGravity.hpp | |
| | | | |
| skipping to change at line 54 | | skipping to change at line 54 | |
| * - <b>γ</b> = ∇\e U = <b>Γ</b> + <b>f</b>, the normal | | * - <b>γ</b> = ∇\e U = <b>Γ</b> + <b>f</b>, the normal | |
| * acceleration; | | * acceleration; | |
| * - \e X, \e Y, \e Z, geocentric coordinates; | | * - \e X, \e Y, \e Z, geocentric coordinates; | |
| * - \e x, \e y, \e z, local cartesian coordinates used to denote the eas
t, | | * - \e x, \e y, \e z, local cartesian coordinates used to denote the eas
t, | |
| * north and up directions. | | * north and up directions. | |
| * | | * | |
| * References: | | * References: | |
| * - W. A. Heiskanen and H. Moritz, Physical Geodesy (Freeman, San | | * - W. A. Heiskanen and H. Moritz, Physical Geodesy (Freeman, San | |
| * Francisco, 1967), Secs. 1-19, 2-7, 2-8 (2-9, 2-10), 6-2 (6-3). | | * Francisco, 1967), Secs. 1-19, 2-7, 2-8 (2-9, 2-10), 6-2 (6-3). | |
| * - H. Moritz, Geodetic Reference System 1980, J. Geodesy 54(3), 395-405 | | * - H. Moritz, Geodetic Reference System 1980, J. Geodesy 54(3), 395-405 | |
|
| * (1980) http://dx.doi.org/10.1007/BF02521480 | | * (1980) https://dx.doi.org/10.1007/BF02521480 | |
| * | | * | |
| * Example of use: | | * Example of use: | |
| * \include example-NormalGravity.cpp | | * \include example-NormalGravity.cpp | |
| **********************************************************************/ | | **********************************************************************/ | |
| | | | |
| class GEOGRAPHICLIB_EXPORT NormalGravity { | | class GEOGRAPHICLIB_EXPORT NormalGravity { | |
| private: | | private: | |
| static const int maxit_ = 10; | | static const int maxit_ = 10; | |
| typedef Math::real real; | | typedef Math::real real; | |
| friend class GravityModel; | | friend class GravityModel; | |
| | | | |
End of changes. 1 change blocks. |
| 1 lines changed or deleted | | 1 lines changed or added | |
|
| OSGB.hpp | | OSGB.hpp | |
| /** | | /** | |
| * \file OSGB.hpp | | * \file OSGB.hpp | |
| * \brief Header for GeographicLib::OSGB class | | * \brief Header for GeographicLib::OSGB class | |
| * | | * | |
|
| * Copyright (c) Charles Karney (2010-2013) <charles@karney.com> and licens
ed | | * Copyright (c) Charles Karney (2010-2014) <charles@karney.com> and licens
ed | |
| * under the MIT/X11 License. For more information, see | | * under the MIT/X11 License. For more information, see | |
| * http://geographiclib.sourceforge.net/ | | * http://geographiclib.sourceforge.net/ | |
| **********************************************************************/ | | **********************************************************************/ | |
| | | | |
| #if !defined(GEOGRAPHICLIB_OSGB_HPP) | | #if !defined(GEOGRAPHICLIB_OSGB_HPP) | |
| #define GEOGRAPHICLIB_OSGB_HPP 1 | | #define GEOGRAPHICLIB_OSGB_HPP 1 | |
| | | | |
| #include <GeographicLib/Constants.hpp> | | #include <GeographicLib/Constants.hpp> | |
| #include <GeographicLib/TransverseMercator.hpp> | | #include <GeographicLib/TransverseMercator.hpp> | |
| | | | |
| | | | |
| skipping to change at line 50 | | skipping to change at line 50 | |
| * | | * | |
| * Example of use: | | * Example of use: | |
| * \include example-OSGB.cpp | | * \include example-OSGB.cpp | |
| **********************************************************************/ | | **********************************************************************/ | |
| class GEOGRAPHICLIB_EXPORT OSGB { | | class GEOGRAPHICLIB_EXPORT OSGB { | |
| private: | | private: | |
| typedef Math::real real; | | typedef Math::real real; | |
| static const std::string letters_; | | static const std::string letters_; | |
| static const std::string digits_; | | static const std::string digits_; | |
| static const TransverseMercator& OSGBTM(); | | static const TransverseMercator& OSGBTM(); | |
|
| static real northoffset_; | | | |
| static bool init_; | | | |
| enum { | | enum { | |
| base_ = 10, | | base_ = 10, | |
| tile_ = 100000, | | tile_ = 100000, | |
| tilelevel_ = 5, | | tilelevel_ = 5, | |
| tilegrid_ = 5, | | tilegrid_ = 5, | |
| tileoffx_ = 2 * tilegrid_, | | tileoffx_ = 2 * tilegrid_, | |
| tileoffy_ = 1 * tilegrid_, | | tileoffy_ = 1 * tilegrid_, | |
| minx_ = - tileoffx_ * tile_, | | minx_ = - tileoffx_ * tile_, | |
| miny_ = - tileoffy_ * tile_, | | miny_ = - tileoffy_ * tile_, | |
| maxx_ = (tilegrid_*tilegrid_ - tileoffx_) * tile_, | | maxx_ = (tilegrid_*tilegrid_ - tileoffx_) * tile_, | |
| | | | |
| skipping to change at line 154 | | skipping to change at line 152 | |
| * - prec = 3, 100m | | * - prec = 3, 100m | |
| * - prec = 4, 10m | | * - prec = 4, 10m | |
| * - prec = 5, 1m | | * - prec = 5, 1m | |
| * - prec = 6, 0.1m | | * - prec = 6, 0.1m | |
| * - prec = 11 (max), 1μm | | * - prec = 11 (max), 1μm | |
| * | | * | |
| * The easting must be in the range [−1000 km, 1500 km) and the | | * The easting must be in the range [−1000 km, 1500 km) and the | |
| * northing must be in the range [−500 km, 2000 km). These bound
s | | * northing must be in the range [−500 km, 2000 km). These bound
s | |
| * are consistent with rules for the letter designations for the grid | | * are consistent with rules for the letter designations for the grid | |
| * system. | | * system. | |
|
| | | * | |
| | | * If \e x or \e y is NaN, the returned grid reference is "INVALID". | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| static void GridReference(real x, real y, int prec, std::string& gridre
f); | | static void GridReference(real x, real y, int prec, std::string& gridre
f); | |
| | | | |
| /** | | /** | |
| * Convert OSGB coordinates to a grid reference. | | * Convert OSGB coordinates to a grid reference. | |
| * | | * | |
| * @param[in] gridref National Grid reference. | | * @param[in] gridref National Grid reference. | |
| * @param[out] x easting of point (meters). | | * @param[out] x easting of point (meters). | |
| * @param[out] y northing of point (meters). | | * @param[out] y northing of point (meters). | |
| * @param[out] prec precision relative to 100 km. | | * @param[out] prec precision relative to 100 km. | |
| * @param[in] centerp if true (default), return center of the grid squa
re, | | * @param[in] centerp if true (default), return center of the grid squa
re, | |
| * else return SW (lower left) corner. | | * else return SW (lower left) corner. | |
| * @exception GeographicErr if \e gridref is illegal. | | * @exception GeographicErr if \e gridref is illegal. | |
| * | | * | |
| * The grid reference must be of the form: two letters (not including I
) | | * The grid reference must be of the form: two letters (not including I
) | |
| * followed by an even number of digits (up to 22). | | * followed by an even number of digits (up to 22). | |
|
| | | * | |
| | | * If the first 2 characters of \e gridref are "IN", then \e x and \e y | |
| | | are | |
| | | * set to NaN and \e prec is set to −2. | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| static void GridReference(const std::string& gridref, | | static void GridReference(const std::string& gridref, | |
| real& x, real& y, int& prec, | | real& x, real& y, int& prec, | |
| bool centerp = true); | | bool centerp = true); | |
| | | | |
| /** \name Inspector functions | | /** \name Inspector functions | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| ///@{ | | ///@{ | |
| /** | | /** | |
| * @return \e a the equatorial radius of the Airy 1830 ellipsoid (meter
s). | | * @return \e a the equatorial radius of the Airy 1830 ellipsoid (meter
s). | |
| | | | |
End of changes. 4 change blocks. |
| 3 lines changed or deleted | | 7 lines changed or added | |
|
| PolygonArea.hpp | | PolygonArea.hpp | |
| | | | |
| skipping to change at line 26 | | skipping to change at line 26 | |
| #include <GeographicLib/Accumulator.hpp> | | #include <GeographicLib/Accumulator.hpp> | |
| | | | |
| namespace GeographicLib { | | namespace GeographicLib { | |
| | | | |
| /** | | /** | |
| * \brief Polygon areas | | * \brief Polygon areas | |
| * | | * | |
| * This computes the area of a polygon whose edges are geodesics using th
e | | * This computes the area of a polygon whose edges are geodesics using th
e | |
| * method given in Section 6 of | | * method given in Section 6 of | |
| * - C. F. F. Karney, | | * - C. F. F. Karney, | |
|
| * <a href="http://dx.doi.org/10.1007/s00190-012-0578-z"> | | * <a href="https://dx.doi.org/10.1007/s00190-012-0578-z"> | |
| * Algorithms for geodesics</a>, | | * Algorithms for geodesics</a>, | |
| * J. Geodesy <b>87</b>, 43--55 (2013); | | * J. Geodesy <b>87</b>, 43--55 (2013); | |
|
| * DOI: <a href="http://dx.doi.org/10.1007/s00190-012-0578-z"> | | * DOI: <a href="https://dx.doi.org/10.1007/s00190-012-0578-z"> | |
| * 10.1007/s00190-012-0578-z</a>; | | * 10.1007/s00190-012-0578-z</a>; | |
| * addenda: <a href="http://geographiclib.sf.net/geod-addenda.html"> | | * addenda: <a href="http://geographiclib.sf.net/geod-addenda.html"> | |
| * geod-addenda.html</a>. | | * geod-addenda.html</a>. | |
| * | | * | |
| * This class lets you add vertices and edges one at a time to the polygo
n. | | * This class lets you add vertices and edges one at a time to the polygo
n. | |
| * The sequence must start with a vertex and thereafter vertices and edge
s | | * The sequence must start with a vertex and thereafter vertices and edge
s | |
| * can be added in any order. Any vertex after the first creates a new e
dge | | * can be added in any order. Any vertex after the first creates a new e
dge | |
| * which is the ''shortest'' geodesic from the previous vertex. In some | | * which is the ''shortest'' geodesic from the previous vertex. In some | |
| * cases there may be two or many such shortest geodesics and the area is | | * cases there may be two or many such shortest geodesics and the area is | |
| * then not uniquely defined. In this case, either add an intermediate | | * then not uniquely defined. In this case, either add an intermediate | |
| | | | |
End of changes. 2 change blocks. |
| 2 lines changed or deleted | | 2 lines changed or added | |
|
| Rhumb.hpp | | Rhumb.hpp | |
| | | | |
| skipping to change at line 101 | | skipping to change at line 101 | |
| { using std::atan; using std::sinh; return atan(sinh(x)); } | | { using std::atan; using std::sinh; return atan(sinh(x)); } | |
| | | | |
| // Use divided differences to determine (mu2 - mu1) / (psi2 - psi1) | | // Use divided differences to determine (mu2 - mu1) / (psi2 - psi1) | |
| // accurately | | // accurately | |
| // | | // | |
| // Definition: Df(x,y,d) = (f(x) - f(y)) / (x - y) | | // Definition: Df(x,y,d) = (f(x) - f(y)) / (x - y) | |
| // See: | | // See: | |
| // W. M. Kahan and R. J. Fateman, | | // W. M. Kahan and R. J. Fateman, | |
| // Symbolic computation of divided differences, | | // Symbolic computation of divided differences, | |
| // SIGSAM Bull. 33(3), 7-28 (1999) | | // SIGSAM Bull. 33(3), 7-28 (1999) | |
|
| // http://dx.doi.org/10.1145/334714.334716 | | // https://dx.doi.org/10.1145/334714.334716 | |
| // http://www.cs.berkeley.edu/~fateman/papers/divdiff.pdf | | // http://www.cs.berkeley.edu/~fateman/papers/divdiff.pdf | |
| | | | |
| static inline real Dlog(real x, real y) { | | static inline real Dlog(real x, real y) { | |
| real t = x - y; | | real t = x - y; | |
| return t ? 2 * Math::atanh(t / (x + y)) / t : 1 / x; | | return t ? 2 * Math::atanh(t / (x + y)) / t : 1 / x; | |
| } | | } | |
| static inline real Dtan(real x, real y) { | | static inline real Dtan(real x, real y) { | |
| real d = x - y, tx = tano(x), ty = tano(y), txy = tx * ty; | | real d = x - y, tx = tano(x), ty = tano(y), txy = tx * ty; | |
| return d ? (2 * txy > -1 ? (1 + txy) * tano(d) : tx - ty) / d : | | return d ? (2 * txy > -1 ? (1 + txy) * tano(d) : tx - ty) / d : | |
| 1 + txy; | | 1 + txy; | |
| | | | |
End of changes. 1 change blocks. |
| 1 lines changed or deleted | | 1 lines changed or added | |
|
| TransverseMercator.hpp | | TransverseMercator.hpp | |
| | | | |
| skipping to change at line 33 | | skipping to change at line 33 | |
| #endif | | #endif | |
| | | | |
| namespace GeographicLib { | | namespace GeographicLib { | |
| | | | |
| /** | | /** | |
| * \brief Transverse Mercator projection | | * \brief Transverse Mercator projection | |
| * | | * | |
| * This uses Krüger's method which evaluates the projection and its | | * This uses Krüger's method which evaluates the projection and its | |
| * inverse in terms of a series. See | | * inverse in terms of a series. See | |
| * - L. Krüger, | | * - L. Krüger, | |
|
| * <a href="http://dx.doi.org/10.2312/GFZ.b103-krueger28"> Konforme | | * <a href="https://dx.doi.org/10.2312/GFZ.b103-krueger28"> Konforme | |
| * Abbildung des Erdellipsoids in der Ebene</a> (Conformal mapping of
the | | * Abbildung des Erdellipsoids in der Ebene</a> (Conformal mapping of
the | |
| * ellipsoidal earth to the plane), Royal Prussian Geodetic Institute,
New | | * ellipsoidal earth to the plane), Royal Prussian Geodetic Institute,
New | |
| * Series 52, 172 pp. (1912). | | * Series 52, 172 pp. (1912). | |
| * - C. F. F. Karney, | | * - C. F. F. Karney, | |
|
| * <a href="http://dx.doi.org/10.1007/s00190-011-0445-3"> | | * <a href="https://dx.doi.org/10.1007/s00190-011-0445-3"> | |
| * Transverse Mercator with an accuracy of a few nanometers,</a> | | * Transverse Mercator with an accuracy of a few nanometers,</a> | |
| * J. Geodesy 85(8), 475--485 (Aug. 2011); | | * J. Geodesy 85(8), 475--485 (Aug. 2011); | |
| * preprint | | * preprint | |
| * <a href="http://arxiv.org/abs/1002.1417">arXiv:1002.1417</a>. | | * <a href="http://arxiv.org/abs/1002.1417">arXiv:1002.1417</a>. | |
| * | | * | |
| * Krüger's method has been extended from 4th to 6th order. The max
imum | | * Krüger's method has been extended from 4th to 6th order. The max
imum | |
| * error is 5 nm (5 nanometers), ground distance, for all positions withi
n 35 | | * error is 5 nm (5 nanometers), ground distance, for all positions withi
n 35 | |
| * degrees of the central meridian. The error in the convergence is 2 | | * degrees of the central meridian. The error in the convergence is 2 | |
| * × 10<sup>−15</sup>" and the relative error in the sca
le | | * × 10<sup>−15</sup>" and the relative error in the sca
le | |
| * is 6 − 10<sup>−12</sup>%%. See Sec. 4 of | | * is 6 − 10<sup>−12</sup>%%. See Sec. 4 of | |
| | | | |
End of changes. 2 change blocks. |
| 2 lines changed or deleted | | 2 lines changed or added | |
|
| TransverseMercatorExact.hpp | | TransverseMercatorExact.hpp | |
| | | | |
| skipping to change at line 23 | | skipping to change at line 23 | |
| #include <GeographicLib/Constants.hpp> | | #include <GeographicLib/Constants.hpp> | |
| #include <GeographicLib/EllipticFunction.hpp> | | #include <GeographicLib/EllipticFunction.hpp> | |
| | | | |
| namespace GeographicLib { | | namespace GeographicLib { | |
| | | | |
| /** | | /** | |
| * \brief An exact implementation of the transverse Mercator projection | | * \brief An exact implementation of the transverse Mercator projection | |
| * | | * | |
| * Implementation of the Transverse Mercator Projection given in | | * Implementation of the Transverse Mercator Projection given in | |
| * - L. P. Lee, | | * - L. P. Lee, | |
|
| * <a href="http://dx.doi.org/10.3138/X687-1574-4325-WM62"> Conformal | | * <a href="https://dx.doi.org/10.3138/X687-1574-4325-WM62"> Conformal | |
| * Projections Based On Jacobian Elliptic Functions</a>, Part V of | | * Projections Based On Jacobian Elliptic Functions</a>, Part V of | |
| * Conformal Projections Based on Elliptic Functions, | | * Conformal Projections Based on Elliptic Functions, | |
| * (B. V. Gutsell, Toronto, 1976), 128pp., | | * (B. V. Gutsell, Toronto, 1976), 128pp., | |
| * ISBN: 0919870163 | | * ISBN: 0919870163 | |
| * (also appeared as: | | * (also appeared as: | |
| * Monograph 16, Suppl. No. 1 to Canadian Cartographer, Vol 13). | | * Monograph 16, Suppl. No. 1 to Canadian Cartographer, Vol 13). | |
| * - C. F. F. Karney, | | * - C. F. F. Karney, | |
|
| * <a href="http://dx.doi.org/10.1007/s00190-011-0445-3"> | | * <a href="https://dx.doi.org/10.1007/s00190-011-0445-3"> | |
| * Transverse Mercator with an accuracy of a few nanometers,</a> | | * Transverse Mercator with an accuracy of a few nanometers,</a> | |
| * J. Geodesy 85(8), 475--485 (Aug. 2011); | | * J. Geodesy 85(8), 475--485 (Aug. 2011); | |
| * preprint | | * preprint | |
| * <a href="http://arxiv.org/abs/1002.1417">arXiv:1002.1417</a>. | | * <a href="http://arxiv.org/abs/1002.1417">arXiv:1002.1417</a>. | |
| * | | * | |
| * Lee gives the correct results for forward and reverse transformations | | * Lee gives the correct results for forward and reverse transformations | |
| * subject to the branch cut rules (see the description of the \e extendp | | * subject to the branch cut rules (see the description of the \e extendp | |
| * argument to the constructor). The maximum error is about 8 nm (8 | | * argument to the constructor). The maximum error is about 8 nm (8 | |
| * nanometers), ground distance, for the forward and reverse transformati
ons. | | * nanometers), ground distance, for the forward and reverse transformati
ons. | |
| * The error in the convergence is 2 × 10<sup>−15</sup>"
, | | * The error in the convergence is 2 × 10<sup>−15</sup>"
, | |
| | | | |
End of changes. 2 change blocks. |
| 2 lines changed or deleted | | 2 lines changed or added | |
|
| Utility.hpp | | Utility.hpp | |
| | | | |
| skipping to change at line 465 | | skipping to change at line 465 | |
| * @tparam IntT the type of the objects in the array (internal). | | * @tparam IntT the type of the objects in the array (internal). | |
| * @tparam bigendp true if the external storage format is big-endian. | | * @tparam bigendp true if the external storage format is big-endian. | |
| * @param[in] str the input stream containing the data of type ExtT | | * @param[in] str the input stream containing the data of type ExtT | |
| * (external). | | * (external). | |
| * @param[out] array the output vector of type IntT (internal). | | * @param[out] array the output vector of type IntT (internal). | |
| * @exception GeographicErr if the data cannot be read. | | * @exception GeographicErr if the data cannot be read. | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| template<typename ExtT, typename IntT, bool bigendp> | | template<typename ExtT, typename IntT, bool bigendp> | |
| static inline void readarray(std::istream& str, | | static inline void readarray(std::istream& str, | |
| std::vector<IntT>& array) { | | std::vector<IntT>& array) { | |
|
| readarray<ExtT, IntT, bigendp>(str, &array[0], array.size()); | | if (array.size() > 0) | |
| | | readarray<ExtT, IntT, bigendp>(str, &array[0], array.size()); | |
| } | | } | |
| | | | |
| /** | | /** | |
| * Write data in an array of type IntT as type ExtT to a binary stream. | | * Write data in an array of type IntT as type ExtT to a binary stream. | |
| * The data in the file is in (bigendp ? big : little)-endian format. | | * The data in the file is in (bigendp ? big : little)-endian format. | |
| * | | * | |
| * @tparam ExtT the type of the objects in the binary stream (external)
. | | * @tparam ExtT the type of the objects in the binary stream (external)
. | |
| * @tparam IntT the type of the objects in the array (internal). | | * @tparam IntT the type of the objects in the array (internal). | |
| * @tparam bigendp true if the external storage format is big-endian. | | * @tparam bigendp true if the external storage format is big-endian. | |
| * @param[out] str the output stream for the data of type ExtT (externa
l). | | * @param[out] str the output stream for the data of type ExtT (externa
l). | |
| | | | |
| skipping to change at line 530 | | skipping to change at line 531 | |
| * @tparam ExtT the type of the objects in the binary stream (external)
. | | * @tparam ExtT the type of the objects in the binary stream (external)
. | |
| * @tparam IntT the type of the objects in the array (internal). | | * @tparam IntT the type of the objects in the array (internal). | |
| * @tparam bigendp true if the external storage format is big-endian. | | * @tparam bigendp true if the external storage format is big-endian. | |
| * @param[out] str the output stream for the data of type ExtT (externa
l). | | * @param[out] str the output stream for the data of type ExtT (externa
l). | |
| * @param[in] array the input vector of type IntT (internal). | | * @param[in] array the input vector of type IntT (internal). | |
| * @exception GeographicErr if the data cannot be written. | | * @exception GeographicErr if the data cannot be written. | |
| **********************************************************************
/ | | **********************************************************************
/ | |
| template<typename ExtT, typename IntT, bool bigendp> | | template<typename ExtT, typename IntT, bool bigendp> | |
| static inline void writearray(std::ostream& str, | | static inline void writearray(std::ostream& str, | |
| std::vector<IntT>& array) { | | std::vector<IntT>& array) { | |
|
| writearray<ExtT, IntT, bigendp>(str, &array[0], array.size()); | | if (array.size() > 0) | |
| | | writearray<ExtT, IntT, bigendp>(str, &array[0], array.size()); | |
| } | | } | |
| | | | |
| /** | | /** | |
| * Parse a KEY VALUE line. | | * Parse a KEY VALUE line. | |
| * | | * | |
| * @param[in] line the input line. | | * @param[in] line the input line. | |
| * @param[out] key the key. | | * @param[out] key the key. | |
| * @param[out] val the value. | | * @param[out] val the value. | |
| * @exception std::bad_alloc if memory for the internal strings can't b
e | | * @exception std::bad_alloc if memory for the internal strings can't b
e | |
| * allocated. | | * allocated. | |
| | | | |
End of changes. 2 change blocks. |
| 2 lines changed or deleted | | 4 lines changed or added | |
|