1

我正在尝试为处理中的日光实施实用分析模型并将其投影到 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))));
}
4

1 回答 1

1

我没有尝试过,所以它可能不起作用(取决于我没有详细研究过的公式),但atan你可以使用atan2给出完整 360 度结果的函数来代替。

/// 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)-(atan2((-cos(solarDeclination) * sin(PI * solarTime / 12)),
        (cos(latitude) * sin(solarDeclination) - sin(latitude) * cos(solarDeclination) *
        cos(PI * solarTime / 12.0))));
}

这个函数考虑了分子和分母的符号来决定角度应该在哪个象限。

于 2013-01-04T11:22:58.163 回答