/usr/include/marble/MarbleMath.h is in libmarble-dev 4:17.12.3-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | //
// This file is part of the Marble Virtual Globe.
//
// This program is free software licensed under the GNU LGPL. You can
// find a copy of this license in LICENSE.txt in the top directory of
// the source code.
//
// Copyright 2007 Torsten Rahn <tackat@kde.org>
// Copyright 2007 Inge Wallin <ingwa@kde.org>
//
#ifndef MARBLE_MARBLEMATH_H
#define MARBLE_MARBLEMATH_H
#include <QtGlobal>
#include "GeoDataCoordinates.h"
#include <cmath>
namespace
{
const qreal a1 = 1.0/6.0;
const qreal a2 = 1.0/24.0;
const qreal a3 = 61.0/5040;
const qreal a4 = 277.0/72576.0;
const qreal a5 = 50521.0/39916800.0;
const qreal a6 = 41581.0/95800320.0;
const qreal a7 = 199360981.0/1307674368000.0;
const qreal a8 = 228135437.0/4184557977600.0;
const qreal a9 = 2404879675441.0/121645100408832000.0;
const qreal a10 = 14814847529501.0/2043637686868377600.0;
const qreal a11 = 69348874393137901.0/25852016738884976640000.0;
const qreal a12 = 238685140977801337.0/238634000666630553600000.0;
const qreal a13 = 4087072509293123892361.0/10888869450418352160768000000.0;
const qreal a14 = 454540704683713199807.0/3209350995912777478963200000.0;
const qreal a15 = 441543893249023104553682821.0/8222838654177922817725562880000000.0;
const qreal a16 = 2088463430347521052196056349.0/102156677868375135241390522368000000.0;
}
namespace Marble
{
/**
* @brief This method calculates the shortest distance between two points on a sphere.
* @brief See: http://en.wikipedia.org/wiki/Great-circle_distance
* @param lon1 longitude of first point in radians
* @param lat1 latitude of first point in radians
* @param lon2 longitude of second point in radians
* @param lat2 latitude of second point in radians
*/
inline qreal distanceSphere( qreal lon1, qreal lat1, qreal lon2, qreal lat2 ) {
qreal h1 = sin( 0.5 * ( lat2 - lat1 ) );
qreal h2 = sin( 0.5 * ( lon2 - lon1 ) );
qreal d = h1 * h1 + cos( lat1 ) * cos( lat2 ) * h2 * h2;
return 2.0 * atan2( sqrt( d ), sqrt( 1.0 - d ) );
}
/**
* @brief This method calculates the shortest distance between two points on a sphere.
* @brief See: http://en.wikipedia.org/wiki/Great-circle_distance
*/
inline qreal distanceSphere( const GeoDataCoordinates& coords1, const GeoDataCoordinates& coords2 ) {
qreal lon1, lat1;
coords1.geoCoordinates( lon1, lat1 );
qreal lon2, lat2;
coords2.geoCoordinates( lon2, lat2 );
// FIXME: Take the altitude into account!
return distanceSphere( lon1, lat1, lon2, lat2 );
}
/**
* @brief This method roughly calculates the shortest distance between two points on a sphere.
* @brief It's probably faster than distanceSphere(...) but for 7 significant digits only has
* @brief an accuracy of about 1 arcmin.
* @brief See: http://en.wikipedia.org/wiki/Great-circle_distance
*/
inline qreal distanceSphereApprox( qreal lon1, qreal lat1, qreal lon2, qreal lat2 ) {
return acos( sin( lat1 ) * sin( lat2 ) + cos( lat1 ) * cos( lat2 ) * cos( lon1 - lon2 ) );
}
/**
* @brief This method is a fast Mac Laurin power series approximation of the
* @brief inverse Gudermannian. The inverse Gudermannian gives the vertical
* @brief position y in the Mercator projection in terms of the latitude.
* @brief See: http://en.wikipedia.org/wiki/Mercator_projection
*/
inline qreal gdInv( qreal x ) {
const qreal x2 = x * x;
return x
+ x * x2 * ( a1
+ x2 * ( a2 + x2 * ( a3 + x2 * ( a4 + x2 * ( a5
+ x2 * ( a6 + x2 * ( a7 + x2 * ( a8 + x2 * ( a9
+ x2 * ( a10 + x2 * ( a11 + x2 * ( a12 + x2 * ( a13
+ x2 * ( a14 + x2 * ( a15 + x2 * ( a16 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) );
}
}
/**
* @brief This method is a fast Mac Laurin power series approximation of the
* Gudermannian. The Gudermannian gives the latitude
* in the Mercator projection in terms of the vertical position y.
* See: http://en.wikipedia.org/wiki/Mercator_projection
*/
inline qreal gd( qreal x ) {
/*
const qreal x2 = x * x;
return x
- x * x2 * ( a1
- x2 * ( a2 - x2 * ( a3 - x2 * ( a4 - x2 * ( a5
- x2 * ( a6 - x2 * ( a7 - x2 * ( a8 - x2 * ( a9
- x2 * ( a10 - x2 * ( a11 - x2 * ( a12 - x2 * ( a13
- x2 * ( a14 - x2 * ( a15 - x2 * ( a16 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) );
*/
return atan ( sinh ( x ) );
}
#endif
|