большое расстояние круга переполнение стека

Я включил код (сейчас) для формулы большого круга. Код работает до тех пор, пока к одному из латов / лонгов не будет прикреплен S / E в качестве соответствующих направлений (я пытался использовать S / E в качестве «отрицательных направлений»). Любая помощь очень ценится!

#include <iostream>
#include <math.h>
#include "lat.hpp"#include <string>

#define PI 3.14159265double greatCircleDistance(double lat1, double long1, char latDir1 ,
char longDir1, double lat2, double long2,
char latDir2, char longDir2)
{
double dLat;
double dLong;

latDirectionCheck(latDir1, lat1);
latDirectionCheck(latDir2, lat2);
longDirectionCheck(longDir1, long1);
longDirectionCheck(longDir2, long2);

dLat = (lat1 - lat2) ;
dLong = (long1 - long2);

positivify(dLat);
positivify(dLong);
positivify(lat1);
positivify(lat2);

//convert all numbers to Rad
dLat = convertRadians(dLat);
dLong = convertRadians(dLong);
lat1 = convertRadians(lat1);
lat2 = convertRadians(lat2);

double R = 3959.9;
double num1 = sin(dLat/2);
double num2 = sin(dLong/2);double a = pow(num1,2) + cos(lat1) * cos(lat2) *
pow(num2,2);
double c = 2 * atan2(sqrt(a), sqrt(1-a));
double d = R * c;
return d;
}

double latDirectionCheck(char check, double convert) {
if(check == 'S')
convert = -convert;
return convert;
}

double longDirectionCheck(char check, double convert) {
if(check == 'E')
convert = -convert;
return convert;
}

double positivify(double num) {
if (num < 0)
num = num*(-1);
return num;
}

bool compareFarDistance(double num1, double num2) {
bool statement = false;
if(num1 > num2)
statement = true;
return statement;
}

bool compareCloseDistance(double num1, double num2) {
bool statement = false;
if(num1 < num2)
statement = true;
return statement;
}
double convertRadians(double num) {
num = PI*(num/180);
return num;
}

double convertDegrees(double num) {
num = 180 * (num/PI);
return num;

}

Входные данные: 23.4356/S 46.4731/W

Расстояние выхода: 4335.48

0

Решение

Вы не используете возвращаемые значения различных функций проверки направления или функции позитивизации, и они принимают свои параметры по значению. Так что они не имеют никакого эффекта. Вам нужно либо передать их параметры по ссылке, либо использовать их возвращаемые значения. В противном случае они вычисляют значение и возвращают его в код, который его игнорирует.

1

Другие решения

Помимо ошибок программирования (см. @David Schwartz), ваш подход несовершенен тем, что вы потеряете слишком много точности; особенно когда конечные точки являются ближайшими. (Очень просто, смешивая pow с тригонометрическими функциями это рецепт чрезмерной потери точности в плавающей точке).

Вы должны использовать Винсенти вместо этого. Увидеть http://en.wikipedia.org/wiki/Vincenty%27s_formulae.

И используйте M_PI, если ваш компилятор поддерживает его, или определите PI с пределом двойной точности.

0

По вопросам рекламы [email protected]