Здравствуйте.
Пишу программу для создания расписания из 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 и будет правильный ответ.
Теперь вопросик: Что делать с формулой чтобы она сразу считала правильно? ну или может что-то дописать надо?
Подскажите плиз 
Синтаксис
ЕСЛИ(лог_выражение;значение_если_истина ;значение_если_ложь)
Лог_выражение — это любое значение или выражение, принимающее значения ИСТИНА или ЛОЖЬ. Например, 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
Синтаксис
ЕСЛИ(лог_выражение;значение_если_истина ;значение_если_ложь)
Лог_выражение — это любое значение или выражение, принимающее значения ИСТИНА или ЛОЖЬ. Например, 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
Если вы про координаты аэропортов то насколько я понял там широта и долгота в углах?
Может я ошибаюсь?
Спасибо ) Сейсас гляну.
Так что вопрос остаётся открытым.
— первая буква четверти соответствует разности широт (РШ).
— вторая буква четверти соответствует разности долгот (РД).
Т.Е. Возьмем один из ваших примеров. Например 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º).
Вот так вот
— первая буква четверти соответствует разности широт (РШ).
— вторая буква четверти соответствует разности долгот (РД).
Т.Е. Возьмем один из ваших примеров. Например 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º).
Вот так вот
Спасибо большое уже разобрался.