项目上需要根据坐标来调整太阳光照,搜了下都是根据时间的,简单实现了一下,这里做个记录,算法不是绝对准确。
void setSunPosition(double lon, double lat)
{
double _lon = lon;
double _lat = lat;
if(mSky)
{
//太阳只会在回归线之间移动
if(_lat > 23.4333333)_lat = 23.4333333;
if(_lat < -23.4333333)_lat = -23.4333333;
double hours = 12.0 - _lon / 180.0*12.0;
//计算一天移动多少纬度,23.4333333*4/365.0,理论上不是匀速是个正弦函数,但是这里当匀速算
double dD = 23.4333333 / 91.25;
//春分时太阳在赤道,即3月21日左右,80天
double days = _lat / dD;
int years = 2023;
days += 80.0
int months;
if(days > 0.0)
{
months = days / 30;
days -= months * 30;
}
else
{
days += 365;
months = days / 30;
days -= months * 30;
years = 2022;
}
DateTime dt(years, months, days, hours);
mSky->setDateTime(dt);
}
}
该代码段展示了一个根据经度和纬度调整太阳光照位置的简单算法。它限制太阳在回归线之间移动,并基于给定的地理位置和当前时间计算太阳的位置。通过设定日期时间和使用Sky对象,该方法可以用于模拟不同时间的日照效果。

2746

被折叠的 条评论
为什么被折叠?



