Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2010, 19:33   #21
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

вводить надо координату и дату. Остальное считается математически. Вспомните астрономию из школы. Там вычислений то на 5 минут. И результат - одна формула.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 12.01.2010, 20:36   #22
NSV
Форумчанин
 
Аватар для NSV
 
Регистрация: 27.05.2009
Сообщений: 127
По умолчанию

Цитата:
Сообщение от Gambler Посмотреть сообщение
координату и дату
Точнее широту. И ещё там должна быть поправка на летнее время
http://ru.wikipedia.org/
http://planetcalc.ru/300/
http://podlodka.info/content/view/161/207/ - расчет
http://williams.best.vwh.net/sunrise_sunset_example.htm - вот какой-то алгоритм. Не знаю то, не то. В поиске больше встречается азимут, чем время.

Цитата:
формула для расчета восходов и заходов:
cos(t) = -(0.0148 + sin(f)*sin(d)) / (cos(f) * cos(d)),
где t - часовой угол, f - широта, d - склонение. 0.0148 (это синус 51') - вклад от рефракции и размера диска. Если бы его не было, формула была бы гораздо красивее, в правой части было бы -tg(f)*tg(d) *.
Итак, в предельном случае, когда день равен ночи во время солнцестояния, очевидно, t равен 6 часов (90°), cos(t) = 0.
Получаем простое уравнение: sin(f)*sin(-23.5°) = -0.0148, откуда
f = 2.1° (примерно). На этой широте 21 декабря день равен ночи и равен 12 часам.

Но мы не учли еще уравнение времени, которое, например, 21 декабря изменяется на 0.5 минуты за сутки. Из-за этого, в принципе, ничего не меняется, только день и ночь в вышерассмотренном случае будут равны не 12 часам ровно, а 12ч 15 сек.
Источник цитаты

Ещё один калькулятор

И вот(может пригодится)

P.S. Самому тема интересна стала

Последний раз редактировалось NSV; 12.01.2010 в 21:18.
NSV вне форума Ответить с цитированием
Старый 15.05.2022, 16:06   #23
Alexvoskres
Новичок
Джуниор
 
Регистрация: 15.05.2022
Сообщений: 1
По умолчанию Упрощенное вычисление заката и рассвета по дате, подробная инструкция

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

Величина склонения Солнца может быть грубо рассчитана по формуле
Склонение солнца для текущего дня =-23.44 х cos ( 360 / 365 х ( N + 10 ) )
где N это количество дней начиная с 1 января, где 1 января = 0.
Объяснение данной формулы:
23.44 максимальное наклонение земли к плоскости орбиты в крайних точках, это и есть склонение солнца, в день зимнего противостояния со знаком минус и со знаком плюс в день летнего противостояния
360 это градусы полной оборота земли по орбите за 1 год
365 это дней в году
10 дней это количество дней от 21 декабря, дня зимнего солнцестояния, когда наклонение орбиты составляет -23.44 градуса

Вычисление значения N (количества дней прошедших с 1 января) с точки зрения программирования где у нас есть номер месяца и число
Для расчета времени рассвета и заката нам нет смысла учитывать, что в одном месяце 31 день в другом 30, високосные годы и т.д.
Учитывая, что нам нужен грубый расчет, количество дней прошедших с 1 января до текущей даты рассчитаем следующим образом:
Количество дней в году (365)/Количество (12) = среднее количество дней в месяце (30.42)
Теперь в программе, чтобы узнать число дней прошедших с 1 января нам достаточно умножить число полных месяцев прошедших с 1 января на среднее количество дней в месяце и прибавить текущий день месяца
ПРИМЕР:
Например, для 15 мая получится так: Число полных месяцев = май(5 месяц) минус 1 = 4 полных месяца
(4 х 30.42) + 15 дней с начала мая = 136,68 дней с 1 января
Осталось прибавить 10, чтобы получить количество дней с момента зимнего солнцестояния = 146,68
В нашей формуле по сути есть коэффициент соотношения между градусом полного орбиты за год и количеством дней в году 360/365 = 0,9863
Умножаем 146,68х0,9863 =144,67
Косинус от 144,67 = -0,8158 Теперь умножаем на -23,44 и получаем 19.12
Таким образом, по грубым расчетам склонение солнца на 15 мая равно 19.12 (сравнение с более точными данными покажут, что это значение на самом деле больше соответствует 16 мая, но для определения времени захода и восхода это даёт погрешность всего в пару минут, что вполне устраивает для большинства задач)
ТЕПЕРЬ НЕПОСРЕДСТВЕННО РАССЧЕТ ВРЕМЕНИ ВОСХОДА И ЗАКАТА
формула для расчета восходов и заходов:
cos(t) = -(sin(a) + sin(f)*sin(d)) / (cos(f) * cos(d)),
где t - часовой угол, f - широта, d - склонение. sin(a)=0.0148 (это синус -0,83градуса, либо -51') - вклад от рефракции и размера диска. Если бы его не было, формула была бы гораздо красивее, в правой части было бы -tg(f)*tg(d) *.
Поясню, что мы получим cos(t), а для получения непосредственно значение t из косинуса t, надо выполнить операцию арккосинус. При этом значение t – это время в часовых углах, которое нужно будет перевести в обычные часы и минуты. Чтобы получить значение времени рассвета, надо будет затем вычесть полученное время из времени фактического полудня, а для расчета времени заката прибавить к времени полудня полученное число.
Продолжим наш пример:
Координаты Москвы в десятичном формате: 55.75583 северной широты, 37.6173 восточной долготы. Мы также перевели географические координаты в градусы, минуты, секунды — 55°45′20.97″ и 37°37′2.28″.
Десятичный формат широты г.Москва составляет 55.75583
Для нашего примера мы нашли, что 15 марта склонение солнца составило примерно 19.12
Рассчитываем формулу:
cos(t)= -(0.0148+(sin(55.75583)*sin(19.12))/(cos(55.75583)*cos(19.12)))=-0,5242
(Возможно, что 0.0148 должно в этой формуле быть вне дроби деления и складываться с дробью в которой синусы в числителе, а косинусы в знаменателе, экспериментально смотрел по разным месяцам, и так и так работает, даже не смог понять в каком случае меньше погрешность, если кто точно знает эту формулу, напишите, как правильно)
Теперь вычисляем арксосинус из -0,5242, чтобы найти t
Acos(-0,5242)=121.614403246605°
Осталось перевести градусы в часы и минуты. Принцип простой: в сутках 24 часа = 360 градусов. То есть 1 час = 360/24= 15 угловых градусов. Для простоты воспользуемся следующей таблицей:
Перевод мер угла из часовой системы в градусную.
Таблица соотношений между единицами мер угла.
Часовая система Градусная система
1 час (1h) 15 градусов
1 минута (1m) 15 минут (15')
1 секунда (1s) 15 секунд (15")

121.61 градус делим на 15 градусов в одном часе и получаем: 8 часов и остаток 1,61 градус
Теперь остаток надо перевести в минуты. Для этого узнаем сколько одна часовая минута составляет градусов. 1 час = 15 градусов = 60 часовых минут
Значит одна часовая минута равна 15/60 = 0,25 градуса
Чтобы перевести наш остаток в минуты надо наш остаток (1,61) разделить на 0,25
1.61 / 0,25 = 6.4 часовых минут
Мы получили, что время за 8 часов 6 минут до астрономического полудня у нас восход и через 8 часов 6 минут после полудня закат.
Напомню, что чтобы получить значение времени рассвета, надо будет вычесть полученное время из времени астрономического полудня, а для расчета времени заката прибавить к времени полудня полученное число. Более точное время астрономического полудня можно узнать основываясь на долготе того места, для которого идёт расчет применяя формулы, которые я не буду рассматривать, т.к. есть еще два более простых способа: 1) можно грубо, исходя из часового пояса узнать время фактического полудня 2) есть точный метод: зайти в Яндекс, найти свой город и найти среднее время между восходом и закатом – это и будет точное время полудня для вашего города.
Так для Москвы время полудня примерно 12:30. Вычитая 8часов 6 минут из 12:30 мы найдем время рассвета 4:24, а прибавляя к 12:30 8часов 6 минут мы найдём время заката для 15 мая 2022г в районе г.Москва 20:36.

Последний раз редактировалось Alexvoskres; 15.05.2022 в 19:17.
Alexvoskres вне форума Ответить с цитированием
Старый 15.05.2022, 16:51   #24
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

12 лет на труд потратил?
Чтобы учесть високосный год, раз пользуетесь усредненными значениями, достаточно на 48 разделить 1461 (или 365.25 / 12).

Последний раз редактировалось macomics; 15.05.2022 в 17:24.
macomics вне форума Ответить с цитированием
Старый 16.05.2022, 09:43   #25
Foreseen
Техножрец
Форумчанин
 
Аватар для Foreseen
 
Регистрация: 04.07.2014
Сообщений: 289
По умолчанию

Еще можно добавить поправку по высоте над уровнем моря
— Двери есть везде. Просто нужно знать, как в них войти.
Foreseen вне форума Ответить с цитированием
Старый 22.06.2022, 04:27   #26
Tretyak_off
Новичок
Джуниор
 
Регистрация: 22.06.2022
Сообщений: 1
По умолчанию

Попробовал сделать данный расчет, как вы описали. 15 мая вычисления совпадают с вашими, а вот если ставишь июнь и выше, то не совпадают.
Tretyak_off вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Узнать время существования окна SamuraiPro Win Api 10 18.12.2009 15:23
Имитировать восход солнца на Pascal Мент Паскаль, Turbo Pascal, PascalABC.NET 2 24.05.2009 12:38
Как программно узнать время? Bigtyoma Общие вопросы Delphi 4 15.03.2009 05:38
Как узнать время работы программы в паскаль? bullvinkle Помощь студентам 2 26.12.2008 11:20
Как узнать создана ли форма во время работы приложения? Avalonix Общие вопросы Delphi 4 31.05.2008 21:01