Как вычислить расстояние от точки до линейного сегмента на сфере?

Если Вы находитесь все еще на поиске на среды тестирования, , CUnitWin32 один для платформы Win32/NT.

Это решает одну фундаментальную проблему что я сталкивающийся с другими средами тестирования. А именно, глобальные / статические переменные находятся в детерминированном состоянии, потому что каждый тест выполняется как отдельный процесс.

25
задан Thomas Owens 19 August 2009 в 12:45
поделиться

4 ответа

Вот мое собственное решение, основанное на идее из , спросите доктора Матема . Буду рад увидеть ваш отзыв.

Сначала отказ от ответственности. Это решение подходит для сфер. Земля не является сферой, и система координат (WGS 84) не предполагает, что это сфера. Так что это всего лишь приближение, и я не могу точно оценить ошибку. Кроме того, для очень малых расстояний, вероятно, также можно получить хорошее приближение, если предположить, что все является просто компланарностью. Опять же, я не знаю, насколько «маленькими» должны быть расстояния.

Теперь к делу. Я назову концы линий A, B и третью точку C. По сути, алгоритм заключается в следующем:

  1. сначала преобразовать координаты в декартовы координаты (с началом в центре Земли) - например, здесь .
  2. Вычислить T, точка на прямой AB, ближайшая к C, используя следующие 3 векторных произведения:

    G = A x B

    F = C x G

    T = G x F

  3. Нормализовать T и умножить на радиус Земли.

  4. Преобразуйте T обратно в долготу \ широту.
  5. Вычислите расстояние между T и C - например, здесь .

Этих шагов достаточно, если вы ищете расстояние между C и большим кругом, определяемым A и B. Если, как и меня, вас интересует расстояние между C и более коротким отрезком линии, вам нужно сделать дополнительный шаг, чтобы убедиться, что T действительно находится на этом отрезке. Если это не так, то ближайшей точкой обязательно будет один из концов A или B - проще всего проверить, какой из них.

В общем, идея трех векторных произведений заключается в следующем. Первый (G) дает нам плоскость большого круга A и B (т.е. плоскость, содержащую A, B и начало координат). Второй (F) дает нам большую окружность, проходящую через C и перпендикулярную G. Тогда T - это пересечение больших окружностей, определяемых F и G, полученное до правильной длины путем нормализации и умножения на R.

] Вот часть кода Java для этого.

Нахождение ближайшей точки на большом круге. Входы и выходы представляют собой массивы длиной 2. Промежуточные массивы имеют длину 3.

double[] nearestPointGreatCircle(double[] a, double[] b, double c[])
{
    double[] a_ = toCartsian(a);
    double[] b_ = toCartsian(b);
    double[] c_ = toCartsian(c);

    double[] G = vectorProduct(a_, b_);
    double[] F = vectorProduct(c_, G);
    double[] t = vectorProduct(G, F);
    normalize(t);
    multiplyByScalar(t, R_EARTH);
    return fromCartsian(t);
}

Нахождение ближайшей точки на отрезке:

double[] nearestPointSegment (double[] a, double[] b, double[] c)
{
   double[] t= nearestPointGreatCircle(a,b,c);
   if (onSegment(a,b,t))
     return t;
   return (distance(a,c) < distance(b,c)) ? a : c;
} 

Это простой метод проверки, находится ли точка T, которая, как мы знаем, находится на том же большом круге, что и A и B, на более короткий отрезок этого большого круга. Однако есть более эффективные методы для этого:

   boolean onSegment (double[] a, double[] b, double[] t)
   {
     // should be   return distance(a,t)+distance(b,t)==distance(a,b), 
     // but due to rounding errors, we use: 
     return Math.abs(distance(a,b)-distance(a,t)-distance(b,t)) < PRECISION;
   }    
19
ответ дан 28 November 2019 в 21:47
поделиться

Кратчайшее расстояние между двумя точками на сфере - это меньшая сторона большого круга, проходящего через две точки. Я уверен, вы это уже знаете. Здесь есть аналогичный вопрос http://www.physicsforums.com/archive/index.php/t-178252.html , который может помочь вам смоделировать это математически.

Я не уверен, как Если честно, вероятно, вы получите закодированный пример этого.

0
ответ дан 28 November 2019 в 21:47
поделиться

Я в основном ищу то же самое прямо сейчас, за исключением того, что, строго говоря, мне не важен сегмент большого круга, а мне просто нужно расстояние до любой точки на полный круг.

Две ссылки, которые я сейчас исследую:

На этой странице упоминается «Поперечное расстояние», которое в основном похоже на то, что вы ищете.

Кроме того, в следующей ветке в списке рассылки PostGIS, похоже, попытка (1) определить ближайшую точку на большом круге с той же формулой, которая используется для линейного расстояния на 2D-плоскости (с помощью PostGIS line_locate_point), а затем (2) вычислить расстояние между этой и третьей точкой сфероида. Я понятия не имею, верен ли шаг (1) математически, но я был бы удивлен.

http: //postgis.refractions. net / pipermail / postgis-users / 2009-July / 023903.html

Наконец, я только что увидел следующую ссылку в разделе «Связанные»:

Функция большого круга расстояния от точки до линии работает неправильно.

0
ответ дан 28 November 2019 в 21:47
поделиться

Попробуйте Расстояние от точки до большого круга , от Ask Dr. Math. Вам по-прежнему нужно преобразовать долготу / широту в сферические координаты и масштаб радиуса Земли, но это кажется хорошим направлением.

3
ответ дан 28 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: