1. ВНИМАНИЕ! В течении пары дней +- будет переезд форума на более защищённый сервер. Возможны перебои в работе.
    Скрыть объявление

Правильно найти азимут

Тема в разделе "ПЕСОЧНИЦА", создана пользователем 39dotyt, 5 окт 2013.

  1. Здравствуйте.

    Пишу по мотивам треда.

    Подскажите, пожалуйста, как правильно найти азимут C-C' зная угол C и азимут CA.

    Сейчас использую следующий алгоритм, где point1ToPoint2.azi - азимут AB, meToPoint1.azi - азимут CA, angleA - угол C (беззнаковый), а aziAC - азимут C-C'. Очевидно, что алгоритм неправильный. Но он работает корректно на всех значениях, кроме таких, при которых точка C находится достаточно близко к вектору AB для того, чтобы азиумт CA по модулю стал больше 92, и выполняемое условие стало не верным.

    Код:
    if (Math.abs(point1ToPoint2.azi1) <= 90) {
        if (meToPoint1.azi1 > 0) {
            if (meToPoint1.azi1 >= 90) {
                aziAC = meToPoint1.azi1 - angleA;
            } else {
                aziAC = meToPoint1.azi1 + angleA;
            }
        } else {
            if (meToPoint1.azi1 <= -90) {
                aziAC = meToPoint1.azi1 + angleA;
            } else {
                aziAC = meToPoint1.azi1 - angleA;
            }
        }
    } else {
        if (meToPoint1.azi1 > 0) {
            if (meToPoint1.azi1 >= 90) {
                aziAC = meToPoint1.azi1 + angleA;
            } else {
                aziAC = meToPoint1.azi1 - angleA;
            }
        } else {
            if (meToPoint1.azi1 <= -90) {
                aziAC = meToPoint1.azi1 - angleA;
            } else {
                aziAC = meToPoint1.azi1 + angleA;
            }
        }
    }
    Весь алгоритм приведён по ссылке.
     
  2. В.Шуфотинский

    В.Шуфотинский Модератор Команда форума

    Не проблема ли в радианах, а не градусах?
     
  3. Вы предлагаете использовать радианы вместо градусов? Как это может помочь?
     
  4. tsg

    tsg Форумчанин

    Попробуйте для начала дебагером построчно пройтись, точки останова расставив, используя пограничные значения, на которых алгоритм некорректно отрабатывать начинает
     
    Lex K-G нравится это.
  5. Я знаю на каких значения алгоритм работает некорректно. Написал же. Когда обозначенный верхнем посте угол более 90 (опечатался) по модулю. В этих случаях всё ещё надо (по логике) заходить в ветку < 90, но условие не верно.
    Этот алгоритм вообще неправильный. Так сложилось, что в большинстве случаев он работает корректно.
     
  6. Lex K-G

    Lex K-G Форумчанин

    tsg, Спасибо, давно так не смеялся
    Предложите ей еще. старый добрый sourcer))))
     
    tsg нравится это.
  7. tsg

    tsg Форумчанин

    Lex K-G, вы оулд скул тру программер ;)
     
  8. Дядя Вова

    Дядя Вова Форумчанин

    Это не алгоритм, а кусок программы.
    Нарисуйте подробный алгоритм, тогда станет понятнее всем.
     
  9. stout

    stout Форумчанин

    Вообще-то это алгоритм. Самый что ни на есть настоящий алгоритм.
    Агеев Алгоритмы.jpg
    2 39dotyt, координаты точек известны? Их можно вычислить?
     
    39dotyt нравится это.
  10. Добрый день.

    Координаты точек известны.

    Известен азимут CA и угол C (между вектором CA и искомым вектором CC'). Непонятно как формализовать алгоритм поиска азимута CC'.
     
  11. Lex K-G

    Lex K-G Форумчанин

    39dotyt, может я не понял Вашу задачу, но
    азимут линии СС' (в точке С) получаем сложением азимута линии СА (в точке С) с углом
    между этими линиями, измеренным в точке С.
    Проверяется лишь одно условие:
    В случае, когда результат > 360 градусов вычитаем эти несчастные 360 из результата
    (Если у Вас возможны отрицательные углы, то проверяем еще второе условие, чтобы не было меньше 0)
    Пример
    270d30m99.999999s+100d00m00.000001s = 370d 31 m
    370d31m > 360d
    370d31m-360 = 10d31m
    У Вас проверяются другие условия в алгоритме, Вы не перепутали с вычислением дирекционного угла линии из координат ее конечных точек? (Там получаем арктангенс и проверяем 8 условий)

    Если Ваша задача более сложная, то опишите ее подробно простым человеческим языком,
    как это сделал я... И будет Вам счастье;)
     
    39dotyt нравится это.
  12. Lex K-G, большое спасибо. Возможна ситуация, когда точка C находится как правее, так и левее точки A, то есть иногда угол надо прибавлять к азимуту, а иногда - отнимать. Когда ты рисуешь все возможные ситуации, очевидно, что необходимо сделать. Непонятно, как это правильно формализовать.
     
  13. Lex K-G

    Lex K-G Форумчанин

    Непонятно, какое это может иметь значение... Как бы ни были расположены точки А и С, нам уже известен азимут линии AC из условия задачи. Возможно, Вы имеете ввиду точку C' (правее-левее), но, опять же, по условию задачи мы имеем измеренный горизонтальный угол ACC', так? Что тут формализовывать?.. Простая арифметика и проверка двух условий...
    Скорее всего, Вы нечетко формулируете задачу, т. е. Вам нужен не азимут CC'?
    Прежде чем писать алгоритм, попробуйте ЯСНО и ПОДРОБНО сформулировать начальные условия и цель расчета - это 90% дела.
     
    39dotyt нравится это.
  14. Дядя Вова

    Дядя Вова Форумчанин

    Возможно я отстал от жизни, но алгоритм привык видеть в подобном виде:
     

    Вложения:

    X-Y-H и Lex K-G нравится это.
  15. Lex K-G

    Lex K-G Форумчанин

    Точнее, это блок-схема алгоритма.
    Оффтоп
    (Могу ошибаться, блок-схемы более подходят для процедурных языков, а есть такие, поведение которых трудно представить в виде последовательности действий и проверки условий)
     
    39dotyt нравится это.
  16. В.Шуфотинский

    В.Шуфотинский Модератор Команда форума

    Вы имеете в виду правые и левые углы? Но ведь это совсем другое и они не зависят от положения точек относительно друг друга. Может проще использовать алгоритм, в котором только прибавление (с переходом через 360º)?
     
    39dotyt нравится это.
  17. Не совсем так. Я сразу считал его всегда положительным и брал «внутренний» угол. Немного переделал. Разобрался. Спасибо. Всё работает идеально.
    --- Сообщения объединены, 8 окт 2013, Оригинальное время сообщения: 8 окт 2013 ---
    В.Шуфотинский, большое спасибо, уже решил. Подскажите, как отметить тему, как решённую?
     
  18. В.Шуфотинский

    В.Шуфотинский Модератор Команда форума

    Пусть так и остаётся. Мы такие темы не закрываем. Возможно, вопросы будут ещё или тема уйдёт в "подвал".
     
  19. stout

    stout Форумчанин

    Я не просто так спросил о координатах.
    Вначале байка.
    Задача №1
    Дано: водопроводный кран с водой, чайник, газовая плита и спички.
    Вопрос: как вскипятить воду?
    Решение математика:
    1. Наливаем воду в чайник.
    2. Зажигаем спичку и затем горелку плиты.
    3. Ставим чайник на плиту.
    Задача №2
    Всё тоже самое, только вода уже в чайнике, плита горит.
    Решение математика:
    1. Выливаем воду из чайника.
    2. Гасим плиту.
    3. Тем самым мы свели решаемою задачу к задаче №1, которая была уже решена.
    Это всё к тому, что если координаты известны, то азимут можно найти из решения обратной геодезической задачи.
    http://user.gs.rmit.edu.au/rod/files/publications/Geometric Geodesy B(2010).pdf со стр. 50
    http://kth.diva-portal.org/smash/get/diva2:515798/FULLTEXT01
    бесспорный фаворит — библиотека Geographiclib и
    Geodesic routines from GeographicLib implemented in Java
     
    39dotyt и Lex K-G нравится это.
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление