Определение, является ли сферический треугольник тупым - PullRequest
1 голос
/ 28 января 2010

Учитывая две точки, A и B, определенные по долготе и широте, я хочу определить, трудно ли мне определить другую точку C между ~ A и B. ~ между ~. Я не имею в виду на линии - это почти наверняка не будет.

Геометрическая схема http://www.freeimagehosting.net/uploads/b5c5ebf480.jpg

На этой диаграмме точка C находится между ~ A и B, потому что она находится между нормалями точек A и B и линией между ними (нормали обозначены тонкой линией). Точка D не находится между ~ A и B, но находится между ~ B и F.

Еще один способ сказать, что я хочу определить, являются ли треугольники ABC и ABD тупыми или нет.

Обратите внимание, что точки будут очень близко друг к другу - обычно в течение 10 секунд от метров.

Я думаю, что закон haversines может помочь, но я не знаю, что такое обратная сторона haversine.

Большое спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 28 января 2010

Если ваши точки очень близки - 10 с метров можно легко квалифицировать - вы можете аппроксимировать их как двумерную задачу и просто рассчитать углы CAB, & theta; и CBA, & phi; (используя точка продукта ). Если оба & theta; и & phi; меньше чем & pi; / 2, ваш C находится "между".

cos (& theta;) = ( AC & middot; AB ) / (| AC | | AB |)

Если это приближение недостаточно для вас, вам потребуется сферическая тригонометрия , что тоже не слишком сложно.

Обратите внимание, что если я правильно понял вашу проблему, вам нужно проверить, являются ли углы CAB и CBA острыми, а не то, что углы ACB тупые или острые.

3 голосов
/ 28 января 2010

Сначала начните с перевода ваших точек в локальную касательную плоскость. Мы будем использовать тот факт, что ваши треугольники намного меньше радиуса Земли. (Касательное пространство таково, что равные дельты в каждой из двух координат соответствуют равным расстояниям)

Это делается путем деления долготы на грех (лат):

A_local_x = A_lat_rads;
A_local_y = A_lon_rads/sin(A_lat_rads);

Тогда

Длина вычислений:

double ABsquared = (A_local_x - B_local_x)*(A_local_x - B_local_x) + (A_local_y - B_local_y)*(A_local_y - B_local_y);
double BCsquared = ..., ACsquared.

Наконец:

bool obtuse = (ABsquared+BCsquared < ACsquared) || (ABsquared+ACsquared < BCsquared); 

Тупой означает, что "это не в пределах линии", как вы говорите. Я не проверяю, является ли треугольник ABC тупым, но являются ли углы в B и в A тупыми. Вот и все.

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

...