Существует множество ресурсов, показывающих, как рассчитать зенит и азимут Солнца, когда заданы время и местоположение.
Однако мне нужно рассчитать место, где солнце находится в зените для заданного времени и даты, а не наоборот. Есть ли более или менее простой способ сделать этот расчет?
Хорошо, я нашел решение - на самом деле оно довольно простое:
Пример кода для Java: (уравнения взяты отсюда ( немецкий))
private static double dateToJulianDate(Date date) {
return date.getTime() / dayMs - 0.5 + J1970;
}
public static HashMap<String, Double> sunPos(Date date)
{
double J = dateToJulianDate(date);
double T = (J - J2000)/36525d;
double M = 2*Math.PI * (0.993133 + 99.997361 * T );
double L = 2*Math.PI * (0.7859453 + M/(2*Math.PI) + (6893.0*Math.sin(M)+72.0*Math.sin(2.0*M)+6191.2*T) / 1296000d);
double e = 2*Math.PI * (23.43929111 + (-46.8150*T - 0.00059*T*T + 0.001813*T*T*T)/3600.0d)/360d;
double DK = Math.asin(Math.sin(e)*Math.sin(L));
double RA = Math.atan(Math.tan(L)*Math.cos(e));
double GMST = Math.abs(getSiderealTime(J,0)%(2*Math.PI));
if(RA < 0) RA = RA + Math.PI;
if(L > Math.PI) RA = RA + Math.PI;
double lat = DK*57.2957795;
double lon = (RA - GMST)*57.2957795;
HashMap<String, Double> ret = new HashMap<String, Double>();
ret.put("lat",lat);
ret.put("lon",lon);
return ret;
}