Путевой угол.

Здравствуйте.
Пишу программу для создания расписания из Exel.
Столкнулся вот с такой проблемкой.
Мне нужно высчитать путевой угол между двумя данными аэропортами. Для этого использую формулу:
ctg( b ) = cos(fi1)*tg(fi2)*cosec(l2 — l1) — sin(fi1)*ctg(l2 — l1), взятую тут тыц.
где b — направление ортодромии или путевой угол, fi1 — широта аэропорта откуда летим, l1 — долгота аэропорта откуда летим, fi2 и l2 — куда летим.
После упрощения получил: b = arctg( (cos(fi2) * sin(l2 — l1)) / (cos(fi1) * sin(fi2) — cos(fi2) * sin(fi1) * cos(l2 — l1)) ).

После расчёта получаю следующие рузультаты:
56.273224844637127
-54.710219585068785
-58.049867496061268
5.6723515785769250
-70.479172252844634
-62.100431498667035
35.205859499423546
-25.921513010402307
-5.5618740532924287
78.581146398313294
25.002774624404534
-39.283729837880642
-56.533277937403454
-7.1199568453538635
42.292072487865099
66.158046794857839
72.168125829477290
44.453098381587218
3.5693213209589381
-14.950513395493871

Для таких входящих данных:
EDDV,52.460214011,9.683521986 -> UNNT,55.011666678,82.651666850 =
UEEE,62.093333490,129.771666527 -> UUDD,55.408333540,37.908333242 +360
UIII,52.266666815,104.395000041 -> UUDD,55.408333540,37.908333242 +360
UIII,52.266666815,104.395000041 -> VTBS,13.685716689,100.748949945 +180
UNNT,55.011666678,82.651666850 -> UUDD,55.408333540,37.908333242 +360
UNNT,55.011666678,82.651666850 -> EDDV,52.460214011,9.683521986 +360
UNNT,55.011666678,82.651666850 -> UTDD,38.543333486,68.825000077 +180
UNNT,55.011666678,82.651666850 -> VTBS,13.685716689,100.748949945 +180
URSS,43.445000052,39.948333353 -> UUDD,55.408333540,37.908333242 +360
USMU,66.070000045,76.521666348 -> UUDD,55.408333540,37.908333242 +180
UTDD,38.543333486,68.825000077 -> UNNT,55.011666678,82.651666850 =
UTNU,41.583333425,60.645000190 -> UUDD,55.408333540,37.908333242 +360
UUDD,55.408333540,37.908333242 -> UTNU,41.583333425,60.645000190 +180
UUDD,55.408333540,37.908333242 -> URSS,43.445000052,39.948333353 +180
UUDD,55.408333540,37.908333242 -> UEEE,62.093333490,129.771666527 =
UUDD,55.408333540,37.908333242 -> UIII,52.266666815,104.395000041 =
UUDD,55.408333540,37.908333242 -> UNNT,55.011666678,82.651666850 =
UUDD,55.408333540,37.908333242 -> USMU,66.070000045,76.521666348 =
VTBS,13.685716689,100.748949945 -> UIII,52.266666815,104.395000041 =
VTBS,13.685716689,100.748949945 -> UNNT,55.011666678,82.651666850 +360

Где последний столбик означает, чтобы получить правильный ответ нуно: = — ничего не нуно ответ такой, +360 — добавить 360 и будет правильный ответ, +180 — добавить 180 и будет правильный ответ.

Теперь вопросик: Что делать с формулой чтобы она сразу считала правильно? ну или может что-то дописать надо?
Подскажите плиз emoji

Ответов: 9

Использовать условие ЕСЛИ. А чтоб формула с условием не получилась громоздкой, делай через промежуточный результат. Т.е свои результаты, приведённные выше, вноси в, например, в другой лист, а затем эти данные используй для условия ЕСЛИ в конечной ячейке (ячейке с конечным результатом).

Синтаксис

ЕСЛИ(лог_выражение;значение_если_истина ;значение_если_ложь)

Лог_выражение — это любое значение или выражение, принимающее значения ИСТИНА или ЛОЖЬ. Например, A10=100 — это логическое выражение; если значение в ячейке A10 равно 100, то выражение принимает значение ИСТИНА. В противном случае — ЛОЖЬ. Этот аргумент может быть использован в любом операторе сравнения.

Значение_если_истина — это значение, которое возвращается, если лог_выражение равно ИСТИНА. Например, если этот аргумент — строка «В пределах бюджета» и лог_выражение равно ИСТИНА, тогда функция ЕСЛИ отобразит текст «В пределах бюджета». Если лог_выражение равно ИСТИНА, а значение_если_истина пусто, то возвращается значение 0. Чтобы отобразить слово ИСТИНА, необходимо использовать логическое значение ИСТИНА для этого аргумента. Значение_если_истина может быть формулой.

Значение_если_ложь — это значение, которое возвращается, если лог_выражение равно ЛОЖЬ. Например, если этот аргумент — строка «Превышение бюджета» и лог_выражение равно ЛОЖЬ, то функция ЕСЛИ отобразит текст «Превышение бюджета». Если лог_выражение равно ЛОЖЬ, а значение_если_ложь опущено (то есть после значение_если_истина нет точки с запятой), то возвращается логическое значение ЛОЖЬ. Если лог_выражение равно ЛОЖЬ, а значение_если_ложь пусто (то есть после значение_если_истина стоит точка с запятой с последующей закрывающей скобкой), то возвращается значение 0. Значение_если_ложь может быть формулой.

Пример: =ЕСЛИ(A2>89;»A»;ЕСЛИ(A2>79;»B»; ЕСЛИ(A2>69;»C»;ЕСЛИ(A2>59;»D»;»F»))))

Сообщение отредактировал love3k — 17.06.2009 09:23

Цитата(love3k @ 17.06.2009 10:21)
Использовать условие ЕСЛИ. А чтоб формула с условием не получилась громоздкой, делай через промежуточный результат. Т.е свои результаты, приведённные выше, вноси в, например, в другой лист, а затем эти данные используй для условия ЕСЛИ в конечной ячейке (ячейке с конечным результатом).

Синтаксис

ЕСЛИ(лог_выражение;значение_если_истина ;значение_если_ложь)

Лог_выражение — это любое значение или выражение, принимающее значения ИСТИНА или ЛОЖЬ. Например, A10=100 — это логическое выражение; если значение в ячейке A10 равно 100, то выражение принимает значение ИСТИНА. В противном случае — ЛОЖЬ. Этот аргумент может быть использован в любом операторе сравнения.

Значение_если_истина — это значение, которое возвращается, если лог_выражение равно ИСТИНА. Например, если этот аргумент — строка «В пределах бюджета» и лог_выражение равно ИСТИНА, тогда функция ЕСЛИ отобразит текст «В пределах бюджета». Если лог_выражение равно ИСТИНА, а значение_если_истина пусто, то возвращается значение 0. Чтобы отобразить слово ИСТИНА, необходимо использовать логическое значение ИСТИНА для этого аргумента. Значение_если_истина может быть формулой.

Значение_если_ложь — это значение, которое возвращается, если лог_выражение равно ЛОЖЬ. Например, если этот аргумент — строка «Превышение бюджета» и лог_выражение равно ЛОЖЬ, то функция ЕСЛИ отобразит текст «Превышение бюджета». Если лог_выражение равно ЛОЖЬ, а значение_если_ложь опущено (то есть после значение_если_истина нет точки с запятой), то возвращается логическое значение ЛОЖЬ. Если лог_выражение равно ЛОЖЬ, а значение_если_ложь пусто (то есть после значение_если_истина стоит точка с запятой с последующей закрывающей скобкой), то возвращается значение 0. Значение_если_ложь может быть формулой.

Пример: =ЕСЛИ(A2>89;»A»;ЕСЛИ(A2>79;»B»; ЕСЛИ(A2>69;»C»;ЕСЛИ(A2>59;»D»;»F»))))

не не не вы меня не так поняли)
Я пишу на C++, просто расписание оно берёт из экселя)
Да и вопрос в принципе не в этом) Как писать условия я прекрасно знаю)
Вопрос мой про формулу: почему она не считает сразу правильно?

Возможно потому, что тип переменной не «угловой».

Сообщение отредактировал love3k — 17.06.2009 11:07

Цитата(love3k @ 17.06.2009 12:06)
Возможно потому, что тип переменной не «угловой».


Если вы про координаты аэропортов то насколько я понял там широта и долгота в углах?
Может я ошибаюсь?

Может это поможет ссылка

Цитата(love3k @ 17.06.2009 12:21)
Может это поможет ссылка


Спасибо ) Сейсас гляну.

Не там тоже самое написано где я читал и формула абсолютно одинаковая(
Так что вопрос остаётся открытым.
Вот, что откопал в конспектах по навигации (морской правда), но это не важно emoji .

Цитата(Из конспекта)
Курс (путевой угол) получают в четвертном счете:
— первая буква четверти соответствует разности широт (РШ).
— вторая буква четверти соответствует разности долгот (РД).


Т.Е. Возьмем один из ваших примеров. Например UNNT -> UTDD.
И считаем (я оставлю 3 знака после запятой):

РШ = 38,543º — 55,011º = -16,468º = 16,468º к S
РД = 68,825º — 82,651º = -13,826º = 13,826º к W

Значит полученный полученный по формуле путевой угол равный 35,205º будет иметь наименование SW и соответственно располагаться в третьей (от 180º до 270º) четверти. И в переводе в круговую систему будет равен 215,205º (180º + 35,205º).

Вот так вот emoji

Цитата(b00blik @ 18.06.2009 03:23)
Вот, что откопал в конспектах по навигации (морской правда), но это не важно emoji .

Цитата(Из конспекта)
Курс (путевой угол) получают в четвертном счете:
— первая буква четверти соответствует разности широт (РШ).
— вторая буква четверти соответствует разности долгот (РД).


Т.Е. Возьмем один из ваших примеров. Например UNNT -> UTDD.
И считаем (я оставлю 3 знака после запятой):

РШ = 38,543º — 55,011º = -16,468º = 16,468º к S
РД = 68,825º — 82,651º = -13,826º = 13,826º к W

Значит полученный полученный по формуле путевой угол равный 35,205º будет иметь наименование SW и соответственно располагаться в третьей (от 180º до 270º) четверти. И в переводе в круговую систему будет равен 215,205º (180º + 35,205º).

Вот так вот emoji


Спасибо большое уже разобрался.