Добрый день. Подскажите пожалуйста, может быть есть скрипт для подсчета астрономического восхода и захода солнца? Планируется ли добавление в функционал расписания включение/отключения по заходу/восходу?
Подскажу примерные формулы (не учитывают сумерки) ... реализацию в скрипте не проверял (просто набил в ответе
)
1. Считаем склонение солнца в день года (подробнее см. в J. A. Duffie and W. A. Beckman, "Solar Engineering of Thermal Processes, 3rd Edition" pp. 13-14, J. Wiley and Sons, New York (2006))
sigma=(23.45*PI/180)*sin(2*PI*(284+_НОМЕР_ДНЯ_ОТ НАЧАЛА_ГОДА_)/365)
Високосные года можно учитывать, а можно и не учитывать (небольшая погрешность в единицы минут получится)
2. Для известной широты места в градусах (далее _L_) считаем угол восхода/заката
sunrise = acos(-tan((_L_*PI/180))*tan(sigma))
3. От истинного полудня отнимается угол восхода/заката (один час это 15 градусов) и получаем время восхода
_ВОСХОД_= 12-sunrise/(15*PI/180)
в полученной дроби целая часть - час восхода
((_ВОСХОД_*60) div 60) - минуты восхода
_ЗАКАТ_= 12+sunrise/(15*PI/180)
в полученной дроби целая часть - час заката
((_ЗАКАТ_*60) div 60) - минуты заката
var
sigma,sunriseAngle,sunrise,sunset: Single;
sunriseHour, sunriseMinutes, sunsetHour, sunsetMinutes : Extended;
begin
// склонение солнца в текущий день года
sigma:=(23.45*PI/180)*sin(2*PI*(284+DayOfTheYear(Now))/365);
// для 45 градусов северной широты угол восхода солнца равен
sunriseAngle:= arccos(-tan((45*PI/180))*tan(sigma));
// угол восхода
sunrise:= 12-sunriseAngle/(15*PI/180);
// угол заката
sunset:=12+sunriseAngle/(15*PI/180);
// искомые часы и минуты
sunriseHour:=Int(sunrise);
sunriseMinutes:=Int((sunrise*60) div 60);
sunsetHour:=Int(sunset);
sunsetMinutes:=Int((sunset*60) div 60);
end.
UPD 3-12-2024Добрался до редактора...
Почему-то
sunriseMinutes:=Int((sunrise*60) div 60);даёт ошибку
incopatible types "SINGLE" and "INTRGER"рабочий код ниже.
var
sigma,sunriseAngle,sunrise,sunset: Single;
sunriseHour,sunriseMinutes,sunsetHour,sunsetMinutes : Extended;
begin
// склонение солнца в текущий день года
sigma:=(23.45*PI/180)*sin(2*PI*(284+DayOfTheYear(Now))/365);
// для 45 градусов северной широты угол восхода солнца равен
sunriseAngle:= arccos(-tan((45*PI/180))*tan(sigma));
// угол восхода
sunrise:= 12-sunriseAngle/(15*PI/180);
// угол заката
sunset:=12+sunriseAngle/(15*PI/180);
// искомые часы и минуты
sunriseHour:=Int(sunrise);
sunriseMinutes:=Int((sunrise-sunriseHour)*60);
sunsetHour:=Int(sunset);
sunsetMinutes:=Int((sunset-sunsetHour)*60);
end.