Как стать автором
Обновить

Комментарии 42

Какая боль...

А ведь можно было свести задачу к пересечению плоскостей – и всё стало бы просто, линейно (пардон, почти: из-за сферы квадратное уравнение вылезает) и без всей этой жуткой тригонометриии.

Набросок:

  1. Вычисляем декартовы координаты x, y, z концов "отрезка" (можно принять радиус сферы за 1, можно R – неважно)

  2. "Отрезок" заменяем на плоскость, проходящую через его концы и центр сферы – она задаётся линейным уравнением вида a*x+b*y+c*z = 0

  3. Два таких уравнения (для двух отрезков) задают прямую. Дополняем их уравнением сферы x²+y²+z²=R² и находим координаты двух точек пересечения.

  4. Проверяем, попадает ли одна из двух точек пересечения на оба отрезка (она в плоскости отрезка, так что всё сведётся к проверке знаков векторных произведений, если надо – могу расписать подробнее)

  5. Переводим декартовы координаты в эйлеровы или какие нам нужны.

НЛО прилетело и опубликовало эту надпись здесь

Как-то у Вас всё однозначно. Вопрос же всегда в соотношении точности и скорости. Алгоритмы надо по этому принципу сравнивать, а не "просто"/"сложно".

Любые преобразования крадут точность, да и на скорости положительно не скажутся.

Если исходить из этих характеристик, то точность того что я описал (поска точки пересечения) будет близка к точности алгоритма Винсети, а скорость... ну ассимптотическая сложность логарифмическая

Да, у меня всё однозначно: тригонометрические уравнения – всегда боль, если можно их избежать, всего лишь увеличив число переменных на 1 или 2 – следует это сделать. Посмотрите, к примеру, на 3d-графику: все представляют поворот матрицами или кватернионами, никто не использует углы в вычислениях.

Правда, это всё про решение для шара. Для эллипсоида возникнут сложности – на нём, кажется, ортодромия может не лежать в одной плоскости. И, кстати, возможно, это сломает и ваш алгоритм (требует проверки) – не факт, что можно использовать прямую геодезическую задачу для вычисления координат промежуточной точки: не факт, что угол для промежуточной точки будет таким же, как угол для конечной.

Вы какие-то странные вещи пишете про ортодромию и геодезические задачи.

Мне кажется факт что ортодромии в одной плоскости НЕ лежат. Из этого и исходим... но ничего не сломалось

Прямую геодезическую задачу очень даже можно использовать для вычисления координат это факт - в этом смысл задачи.

То что угол для промежуточной и конечной НЕ совпадёт, так это тоже факт, но что это меняет?!

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

  2. Полученное расстояние разделим пополам, и, применив прямую геодезическую задачу, по найденному ранее углу, и полученному расстоянию, найдём координаты средней точки.

Так вот, если угол для промежуточной точки не тот же, что для конечной – то нельзя в пункте 2 использовать угол из пункта 1. В этом сложность.
(надо проверять, может, для эллипсоида угол и тот же – я не знаю).

Так здесь в обоих случаях же считаем от самой первой точки, только один раз мы берём полную дистанцию (т.е. вычисляем её), а во второй раз 1/2 прикладываем.

Если формулировка вас запутала, предложите вариант - я исправлю

П.С. Если на следующей итерации мы возьмём среднюю точку и конечную - то углы считаем заново

Да нет, формулировка как раз не запутала. Но, кажется, тут действительно нет проблемы, "азимут" будет одним и тем же. Теперь надо проверять алгоритм решения прямой геодезической задачи :-)
Ещё хотел написать: для эллипсоида можно использовать ваш же подход (проверив его) с алгоритмом половинного деления (или лучше заменить его на метод Ньютона), но всё, что только возможно, вычислять в декартовых координатах.

Upd: И да, любопытно, какова будет погрешность вычисления координат точки пересечения, если её вычислять, пренебрегая "сплющенностью" Земли. Возможно, если точности не хватит – выгодней будет вначале найти точку пересечения "на сфере", а потом скорректировать.

Но ведь и так применяется метод половинного деления: он же, насколько я помню, заключается в том, чтобы искать тот подинтревал где функция меняет знак.

  1. Теперь попарно сравним \Delta\varphi_f с \Delta\varphi_m и \Delta\varphi_m с \Delta\varphi_s

    1. ЕСЛИ у \Delta\varphi_f и \Delta\varphi_m разные знаки, ТО \lambda_s=\lambda_m

    2. ЕСЛИ у \Delta\varphi_m и \Delta\varphi_s разные знаки, ТО \lambda_f=\lambda_m

Различие знаков говорит о том, что пересечение произошло на этом участке, между соответствующими значениями долготы. Алгоритм рекурсивно продолжается, переходим на ШАГ 2.

Вспомнился мультик: "Лучше день потерять… Запомни: лучше день потерять, потом за пять минут долететь."

Так и тут, лучше преобразования сначала и в конце сделать, зато все основные вычисления без тригонометрии в векторах делать, точнее будет.

Что вы несёте? На чём вообще основано это утверждение что тригонометрия снижает как-то точность?

На опыте и оценках погрешностей вычислений.

Тогда от Филдсовской премии вас отделяет один шаг. Доказательство того, что тригонометрические функции врут - перевернёт мир вычислений

Врут не тригонометрические функции, а численные вычисления с ограниченной точностью.

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

А какая область применения?

Для какой задачи важна эллиптичность Земли? И какая ошибка будет если ей пренебречь?

Мы использовали для триангуляции, применяли жадный алгоритм триангуляции, а он основан на поиске пересечений.

Если грубо, то я хотел чтобы алгоритм разбивал на треугольники как в первом примере (слева), а он разбивал как во втором (справа).

Это ещё красивый пример, на самом деле всё было гораздо хуже, получались треугольники с углами 170° , 7°, 3°, и высота у них была несколько метров при длине основания в несколько километров.

Тогда решили всеми правдами и неправдами повысить точность.

П.С. от проблемы полностью не избавились, но триангуляция стала строиться иначе

П.П.С. мы в итоге остановились на упрощении до сферы, но наработки остались

Точность от всей этой тригонометрии сильно страдает. В статье есть оптимистическая фраза

можно использовать координаты любой из двух пересекающихся линий - значение совпадёт

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

Для вычисления на сфере есть гугловская библиотека S2 geometry, рекомендую глянуть как они это считают. Там оценивается точность, выбирается порядок вычислений дающий меньшую погрешность, и иногда все равно вынуждено использующую exact float для получения достаточно точного результата. Правда, она только для правильной сферы.

Совпадут на сфере, решение же аналитическое, если не совпали - значит ошибка в расчётах. С чего вообще в тригонометрии точность страдает?

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

П.С. я не понял что значит "правильная сфера".

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

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

Можно очень аккуратно использовать тригонометрию, рассчитывая и указывая как в ГОСТ получаемую точность вычислений. Главное не считать это "аналитической" формулой, и понимать что не любая правильная с аналитической точки зрения формула даст такую же точность в любой точке глобуса.

"Аналитическая" формула для пересечения на сфере у вас падает с делением на ноль если один из отрезков идёт строго вдоль меридиана, или если скажем результат попал на 90 градусов долготы. Уже это должно наводить на мысли что и рядом с этими точками точность вычислений сильно страдает.

Вектора обычно лучше хотя бы тем, что избегают таких выделенных значений.

Не падают, для этого есть проверки. Получается что пишем if и вектора теряют преимущества?

Так нет проверок, ни здесь, ни на GitHub. Но попробуйте добавить проверки, попробуйте, очень интересно будет посмотреть.

Выше же был намек - просто добавить в SpheroidLongitude проверку и специальный случай для coord12.LonR == coord11.LonR и подобных случаев не поможет, численная неустойчивость очевидно останется.

Заколебал уже. Мне посыл: "давайте избавляться от тригонометрии ибо неточно, а для этого завезём ещё больше тригонометрии на преобразование координат, но аккуратно" - непонятен.

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

Ну отличный метод, вместо того чтобы учиться чему-то - минусовать карму пытающимся объяснить основы численных методов и показать очевидные ошибки. Это лучший способ избавиться от численной неустойчивости формул :)

Вы не пытаетесь объяснять, вы делаете набросы, так что метод норм

Особенно приятно услышать про "набросы" от человека начинающего общение с "Что вы несёте?", когда он сам не понял простейших вещей.

Ну да ладно, оставайтесь с "аналитической" формулой, для которой за минуту легко придумать очевидный пример, где она выдаст ошибку на десятки градусов широты :).

я так понял "очевидного примера" не последует?!

UPD (немного проясню свою позицию, видимо вы меня не понимаете):

Вы пишете про "очевидные примеры", пишете как точнее, а как нет, но это строго ИМХО. Экстраординарные утверждения требуют экстраординарных доказательств, иначе это наброс, поэтому не удивляйтесь тому что услышьте в ответ "Что вы несёте?".

Я Вам пишу про то, что есть явное противоречие, потому что трансформация сама требует тригонометрии, а Вы отвечаете про "аккуратно можно", а потом говорите что я вам несправедливо ставлю минус.

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

И не исключаю что моя реализация может содержать ошибки, буду значит стараться "аккуратно" использовать тригонометрия, а не избавляться от неё.

Это для вас это были экстраординарные утверждения, для людей сколько-нибудь работавших с численными методами на практике - очевидные. Поэтому первый совет и был - учиться у умных людей (было предложено учиться у Гугла, там умные люди, - была упомянута S2 geometry, в ней подробные комментарии когда какой метод вычислений, когда и почему выбран, и оценки ошибок). Писать лекцию в комментариях я не собирался и после откровенного хамства и минусования кармы точно не буду.

Пример очевиден, выше дважды описано как его сконструировать, и ошибка в десятки градусов проверена на коде из GitHub.

Да да, конечно, - очередной наброс. Зачем приводить пример с конкретными координатами, когда можно сказать что "обиделся, и вообще всё очевидно"?!

Но нам то нужен эллипсоид, ибо Земля сплюснута.

Если точнее, то Земля - геоид, а не эллипсоид.

Земля то конечно геоид, но математической формулой геоид не описать, поэтому эллипсоид принят как наиболее близкий к поверхности геоида

Почему это не описать? Если вы не знаете такой формулы - это не значит невозможно, нет никаких причин для этого.

А кто-то смог? Можно как-то ознакомиться хоть.

А причины есть, - неравномерное распределение масс Земли. Измерить геоид в каждой конкретной точке возможно, и возможно построить 3D модель. Можно даже сделать математическую формулу которая будет лишь апроксимацией для конкретного региона, но не более.

П.С. да и зачем, мы же координаты считаем а не гравитационный потенцииал?

Не знаю, геодезией не интересуюсь. Но знаю, что кватернионы в том числе и для подобного рода задач были придуманы, и для множества достаточно простых моделей готовых формул в сети не найти. В 2D, например, я самостоятельно выводил формулы в комплексных числах для механизма Чебышева и промежуточных фигур между окружностью и правильными многоугольниками. Тоже вроде всем давно хорошо известные модели, а готовых формул не нашлось.

Ну геоид - "подобный Земле", это по сути ни о чем не говорит.
Если хочется просто и элегантно, нужно сводить к эллипсоиду или уж тогда просто фигячить модель на реальных данных с заданной точностью.

И да, я его придумал потому что не смог нагуглить, может он где‑то и без меня описан был, может за эти 7 лет кто‑то написал что‑то похожее, а может я придумал какую‑то фигню, которую умные люди изобретать не станут...

Вот есть статья 2017 года про алгоритм для поиска пересечения двух ортодромий: https://www.researchgate.net/publication/321358300_Intersection_and_point-to-line_solutions_for_geodesics_on_the_ellipsoid

Спасибо.

В своё оправдание скажу что я выложил своё решение в июне 2017 года (и это уже готовый результат, понятно что потом ещё приводился в какой-то более менее приемлемый вид):

А этот документ от 29 марта 2018 (если это не перезалив):

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

Но в целом да, они описывают тот же самый итеративный подход, с той разницей, что я для решения геодезических задач применяю алгоритмы Винсенти, а они сводят всё к сфере и применяют Cotangent four-part formulae чтобы это ни значило.

(where we will use a suitable value for the radius of the sphere R as e.g. the semimajor axis of the ellipsoid)

...

Now we resort to a rarely used formula of spherical trigonometry known as cotangent four-part formula

На мой взгляд это странно, если сводить всё к сфере - то итерационный алгоритм не нужен.

Простите, не смог внимательно прочитать вашу статью, но, если не ошибаюсь, вы пропустили одно ключевое свойство:

Rsin(A)=cte, где А - азимут, а R - радиус параллели.

В точке пересечения параллель будет одна, и, следовательно, её радиус тоже. Азимут вычисляется из прямой геодезической проблемы многими приложениями, отсюда же значение константы (радиус начальной параллели нам известен).

Не совсем понял куда это свойство можно применить

А начиная с каких расстояний имеет смысл начинать использовать ортодромию вместо плоских прямых? На расстонии пары километров ошибка незначительна, а когда она накапливается достаточно?

Ну как вариант можем опираться на вычисление длин параллелей.

Например для сферы (без учёта эллиптического сжатия, для упрощения), если я ни где не ошибся в расчётах, то:

  • 45 параллель имеет длину 28337 км

  • 46 параллель - 27838 км

т.е. разница 499 км, или примерно 1.4 км на каждый градус отложенный вдоль параллели.

В прямоугольных координатах эта разница теряется, тут уже сами решайте готовы ли вы к такой погрешности в 1,4 км на каждый градус.

При том чем выше - тем больше погрешность, если между 45 и 46 параллелями различие в длине 499 км, то между 46 и 47 уже - 507, соответственно погрешность будет нарастать.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации