RNAInSpace/Сферическое кратчайшее расстояние
Задача
[править]Есть координаты двух точек в пространстве. Нужна функция, которая возвращает "расстояние", которое по поверхности сферы более короткое, чем при отклонении от поверхности сферы.
Расстояние между двумя точками на сфере - известно как считать, но вопрос в том, как сделать так, чтобы:
- его преобразовать через функцию так, чтобы оно было меньше, чем по прямой
- а точнее ПОСТЕПЕННО увеличивалось бы, если отклоняется от траектории по поверхности сферы
Ответ
[править]Расстояние между точками (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);
То есть, мы вычисляем центральный угол между точками, логарифм отношения их расстояний до центра и возвращаем корень из суммы их квадратов. Для точек на сфере «расстояние» будет равно центральному углу между ними, а если мы от сферы отойдём, то расстояние увеличится.
Расстояние между двумя точками на сфере
[править]- Если заданы сферические координаты точки, то переход к декартовым осуществляется по формулам:
- Обратно, от декартовых к сферическим:
- Если заданы сферические координаты точки, то переход к декартовым осуществляется по формулам:
Если даны сферические координаты двух точек, то расстояние между ними можно найти так: