我正在尝试为处理中的日光实施实用分析模型并将其投影到 2d 画布上。到目前为止一切正常,除了太阳方位角的一个令人讨厌的问题。
当我为一天中的时间设置动画时,太阳会在特定时间跳到对面的位置。发生这种情况是因为方位角从 -90 度变为 +90 度,反之亦然。我不确定这是对纸张的限制,还是我在计算太阳位置时出错了。据我了解,方位角应该在 0 到 360 度之间。
任何人已经实施了 Preetham 论文并且可以帮助我吗?
这是我计算太阳位置的代码。您可以在此处下载完整的处理草图: https ://dl.dropbox.com/u/42247259/PreethamSky.zip
谢谢你的帮助。HG
private void calculateSolarPosition() {
float t = solarTime(standardTime, dayOfYear, standardMeridian, longitude);
float delta = solarDeclination(dayOfYear);
thetaS = angleFromSunToZenith(t, delta, latitude);
phiS = sunAzimuth(t, delta, latitude);
}
/// Returns the solar time at a certain geographic place, day of year and standard time.
private float solarTime(float standardTime, int dayOfYear, float standardMeridian, float longitude) {
return (float)(standardTime + 0.17 * sin(4 * PI * (dayOfYear - 80) / 373) - 0.129 * sin(2 * PI * (dayOfYear - 8) / 355) + 12 * (standardMeridian - longitude) / PI);
}
/// Returns the solar declination. Solar declination is the angle between the rays of the sun and the
/// plane of the earth's equator.
private float solarDeclination(int dayOfYear) {
return (float)(0.4093 * sin(2 * PI * (dayOfYear - 81) / 368.0));
}
/// Returns the angle from the sun to the zenith in rad.
private float angleFromSunToZenith(float solarTime, float solarDeclination, float latitude) {
return (float)(PI / 2 - asin(sin(latitude) * sin(solarDeclination) - cos(latitude) * cos(solarDeclination) * cos(PI * solarTime / 12)));
}
/// Returns the azimuth of the sun in rad. Azimuth is the angle between a line to south and the sun.
private float sunAzimuth(float solarTime, float solarDeclination, float latitude) {
return (float)-(atan((-cos(solarDeclination) * sin(PI * solarTime / 12)) /
(cos(latitude) * sin(solarDeclination) - sin(latitude) * cos(solarDeclination) *
cos(PI * solarTime / 12.0))));
}