Изменить способ хранения длинных / лат:
struct LongLat
{
float
long,
lat,
x,y,z;
}
При создании long / lat также рассчитайте трехмерную точку (x, y, z), которая представляет эквивалентную позицию на единичной сфере с центром в начале координат.
Теперь, чтобы определить, находится ли точка B ближе к точке A, чем точка C, сделайте следующее:
// is B nearer to A than C?
bool IsNearer (LongLat A, LongLat B, LongLat C)
{
return (A.x * B.x + A.y * B.y + A.z * B.z) < (A.x * C.x + A.y * C.y + A.z * C.z);
}
и для получения расстояния между двумя точками:
float Distance (LongLat A, LongLat B)
{
// radius is the size of sphere your mapping long/lats onto
return radius * acos (A.x * B.x + A.y * B.y + A.z * B.z);
}
Вы можете удалить термин 'радиус', эффективно нормализуя расстояния.