Это «Improvment» к вышеуказанному раствору. Он добавляет информацию о высоте. Кажется, что высота, которую возвращает яблоко, находится в метрах. Не подходит для полета или на орбите или что-то подобное, но будет работать, если кто-то 15 этажей непосредственно над другим человеком, на близлежащей горе и т. Д. Не подвергается обширной проверке. Предполагается, что вы не заботитесь о высоте над чем-то более чем в 20 км. Затем он питается коррекцией высоты, поскольку вы ближе к другому человеку. Так что для двух человек в 20 метрах друг от друга, но на 100 метров выше, вы получите расстояние около 102 метров. Прямо в конце я переключаюсь на км для возвращения. Также найден нан-ошибка в исходном коде.
#define DEG2RAD(degrees) (degrees * 0.01745329251)
#define RADIUS_OF_EARTH 6371000.0
// km
+ (double)getDistanceFromStartCoords:(CLLocationCoordinate2D)start altStart:(double)altStart andEndCoords:(CLLocationCoordinate2D)end altEnd:(double)altEnd;
{
double argument = (cos(DEG2RAD(start.latitude))*
cos(DEG2RAD(end.latitude))*
cos((-1*DEG2RAD(end.longitude))-
(-1*DEG2RAD(start.longitude)))) +
(sin(DEG2RAD(start.latitude))*
sin(DEG2RAD(end.latitude)));
double dist = 0.0;
if (argument < 1.0 && argument > -1.0) // acos will return nan for very small (0) distance
dist = acos(argument)*RADIUS_OF_EARTH;
// else
// NSLog(@"found bug, %f", acos(argument));
// Altitude hack.
// blend in an altitude correction (blend for smoothness)
// add in altitude difference
double altDiff = fabs(altStart - altEnd); // altdiff
double factor = 1.0 - dist/20000.0;
if (factor < 0.0)
factor = 0.0;
dist += sqrt(dist*dist + factor*altDiff*altDiff);
//NSLog(@"distance found, %f", dist);
return dist/1000.0; // return km
}
Я не могу разобрать ваш вопрос. Не могли бы вы добавить некоторые знаки препинания? – mik01aj