RNAInSpace/Сферическое кратчайшее расстояние


Задача

править

Есть координаты двух точек в пространстве. Нужна функция, которая возвращает "расстояние", которое по поверхности сферы более короткое, чем при отклонении от поверхности сферы.

Расстояние между двумя точками на сфере - известно как считать, но вопрос в том, как сделать так, чтобы:

  1. его преобразовать через функцию так, чтобы оно было меньше, чем по прямой
  2. а точнее ПОСТЕПЕННО увеличивалось бы, если отклоняется от траектории по поверхности сферы


Расстояние между точками (x1,y1,z1) и (x2,y2,z2) с нужными свойствами выглядит так:

 r1=sqrt(x1*x1+y1*y1+z1*z1);
 r2=sqrt(x2*x2+y2*y2+z2*z2);
 a=acos((x1*x2+y1*y2+z1*z2)/r1/r2);
 b=ln(r1/r2);
 return sqrt(a*a+b*b);

То есть, мы вычисляем центральный угол между точками, логарифм отношения их расстояний до центра и возвращаем корень из суммы их квадратов. Для точек на сфере «расстояние» будет равно центральному углу между ними, а если мы от сферы отойдём, то расстояние увеличится.

Расстояние между двумя точками на сфере

править
    • Если заданы сферические координаты точки, то переход к декартовым осуществляется по формулам:
       
    • Обратно, от декартовых к сферическим:
       

Если даны сферические координаты двух точек, то расстояние между ними можно найти так:

 

См. также

править