一种基于数据缓存的日照时数计算方法
技术领域
本发明涉及一种日照时数计算方法,特别是一种基于数据缓存的日照时数计算方法。
背景技术
当前的日照分析主要应用于城市规划与建筑学中,以日照时数为主要指标,进行一系列分析。日照分析的主要对象——建筑物一般处于一个复杂的地理场景中,该场景包含大量的地形、地物要素。这些要素都是存在于真实世界中的三维实体,共同构成了一个真三维的日照分析场景。在实际分析过程中,地形要素以及建筑周边的亭台楼阁、植被、古塔等地物要素都对日照光线产生遮挡。因此要在现实世界中进行精确的日照分析模拟,必须考虑场景中众多三维实体的遮挡因素。
在当前的日照分析相关研究领域,学者们主要围绕日照时数计算、日照阴影分析、日照间距计算、地物遮挡分析等问题展开研究。针对场景要素之间的遮挡关系判断这一核心问题,提出了建筑物CAD法、通视分析法、几何光学法等方法。但上述方法在面向场景中众多的地形、地物要素进行分析运算时,效率比较低下。
发明内容
本发明所要解决的技术问题是提供一种基于数据缓存的日照时数计算方法,它解决了现有技术在面向场景中众多的地形、地物要素进行分析运算时计算效率不高的问题。
为解决上述技术问题,本发明所采用的技术方案是:
一种基于数据缓存的日照时数计算方法,其特征在于包含以下步骤:
步骤一:读取场景数据,将存储在外部文件中的场景数据读入内存;
步骤二:设置与日照分析相关的背景信息;
步骤三:计算太阳位置,并生成太阳光线向量;
步骤四:将太阳光线与缓存中的三角形图元进行相交判断,若相交,则该点在该时刻被遮挡,转步骤七;否则转步骤五;
步骤五:将太阳光线与场景中地形/地物要素所构成的三角网进行相交判断,若有相交,转步骤七;若未相交,转步骤六;
步骤六:将日照时数进行叠加;
步骤七:设置缓存中的三角形图元为遮挡三角形;比较当前计算时刻是否超出计算区间,如果是,结束计算,输出结果;否则,转步骤三,进行下一时刻计算;
步骤八:结束计算,输出日照时数的计算结果。
进一步地,所述步骤一中场景数据包含所有地形、地物要素几何实体边界的三角网数据,场景数据在计算机中的数据组织方式是通过计算机编程语言内部实现的内存数据结构。
进一步地,所述步骤二中背景信息包含待测点坐标、经纬度、计算日期、计算时段、离散时间步长信息。
进一步地,所述步骤二中背景信息设置具体为,设置待测点P(X,Y,Z),以及其经度值α和纬度值设置计算的日期Date,起止时段TBegin、TEnd及所需的离散时间步长L,其中8:00<=TBegin<TEnd<=16:00,L取1分钟或5分钟,初始化日照时间起始值SUM=0,计算时刻TX=TBegin,相交三角形TShade为空。
进一步地,所述步骤三太阳位置计算过程为,
根据日期Date计算出太阳的赤纬δ,
δ=23.45×sin|(d-80.25)×(1-d/9500)| (1)
其中,d为所选日期Date到当年元旦的天数差;
循环选取所设定时段中的时刻TX,计算太阳在每一时刻的真太阳时T,
T=TX+|α-120|/15×60 α>120
T=TX-|α-120|/15×60 α<120 (2)
计算太阳时角Ω,Ω=(12/π)×(T-12) (3)
根据公式
计算太阳位置,得到太阳高度角Hs与太阳方位角As,其中,为地理纬度;
基于计算所得到的太阳高度角与方位角,计算太阳的光线向量VectorS(X,Y,Z),根据光线向量,得到沿该向量较远处一点PS(X,Y,Z);
VectorS.X=-cos(Hs)×sin(As);VectorS.Y=sin(Hs)
VectorS.Z=-cos(Hs)×cos(As)
PS.X=P.X+100000×VectorS.X;PS.Y=P.Y+100000×VectorS.Y
PS.Z=P.Z+100000×VectorS.Z (6)。
进一步地,所述步骤四中与三角形图元进行相交判断过程为,判断缓存是否为空,若为空,转步骤五;若不为空,则将光线与缓存中的三角形Triangle按如下方法进行相交判断:
A)取Triangle所包含的三个点,分别赋值给点P0,P1,P2;
B)将点P与点PS,P0,P1,P2分别组合,得到向量Vpq,Vpa,Vpb,Vpc,
C)分别选取Vpq、Vpa、Vpb构造向量三重积u=Triple(Vpq,Vpa,Vpb),具体方法为:
a)将Vpq和Vpa进行叉积运算,生成crossqa(X,Y,Z),
b)将crossqa(X,Y,Z)与Vpb进行点积运算,得到u,
u=crossqa.X×Vpb.X+crossqa.Y×Vpb.Y+crossqa.Z×Vpb.Z (9);
D)利用Vpq、Vpa、Vpc,基于公式(8)与公式(9)构造向量三重积v=Triple(Vpq,Vpa,Vpc);
E)利用Vpq、Vpb、Vpc,基于公式(8)与公式(9)构造向量三重积w=Triple(Vpq,Vpb,Vpc);
F)判断所生成的向量三重积的乘积,如果u×v<0或u×w<0或v×w<0,则光线与三角形没有交点,转步骤五;否则,光线与三角形相交,转步骤G;
G)设置相交的三角形TShade=Triangle;
根据相交结果进行判断,若光线Vector(X,Y,Z)与三角形Triangle相交,则点P(X,Y,Z)此时被三角形Triangle遮挡,转步骤七;否则转步骤五。
进一步地,所述步骤五中将太阳光线与场景中地形/地物要素所构成的三角网进行相交判断过程为,选取场景要素三角网Mesh中的每一个三角形,采用步骤四中的光线与缓存中的三角形Triangle相交判断方法对光线与每一个三角形的相交情况进行判断,若有相交,则该时刻被遮挡,设置缓存中的图元为遮挡三角形Triangle,转步骤七;否则,该时刻未被遮挡,转步骤六。
进一步地,所述步骤六中将日照时数进行叠加具体过程为,设置日照时间SUM=SUM+L,并设置缓存中的三角形为空。
进一步地,所述步骤七具体过程为,设置缓存中的图元为遮挡三角形Triangle,设置TX=TX+L,如果TX<=Tend,则输出日照时间SUM,退出循环,否则转步骤三。
本发明与现有技术相比,具有以下优点和效果:本发明基于数据缓存方法,在光线与场景中大量地形地物进行相交判断之前,先与缓存中的少量要素进行相交判断,减少了光线/要素的相交判断次数,从而有效的提高了算法效率。
附图说明
图1是本发明的一种基于数据缓存的日照时数计算方法的流程图。
具体实施方式
下面结合附图并通过实施例对本发明作进一步的详细说明,以下实施例是对本发明的解释而本发明并不局限于以下实施例。
如图所示,本发明的一种基于数据缓存的日照时数计算方法,包含以下步骤:
一种基于数据缓存的日照时数计算方法,其特征在于包含以下步骤:
步骤一:读取场景数据,将存储在外部文件中的场景数据读入内存,场景数据包含所有地形、地物要素几何实体边界的三角网数据,场景数据在计算机中的数据组织方式是通过计算机编程语言内部实现的内存数据结构。
在Windows 7pro系统下,利用Visual Studio 2010平台,建立C++语言的Win32控制台应用程序,命名为SunAnalysis。本实施例SunAnalysis中采用的数据结构包括Point、Vector3、Triangle、Mesh四部分部分,详细定义如下:
点Point结构体的结构如附图所示,详细结构及代码如下:
向量vector3结构体的结构如附图所示,详细结构及代码如下:
三角形Triangle结构体的结构如附图所示,详细结构及代码如下:
三角网Mesh结构体的结构如附图所示,详细结构及代码如下:
步骤二:设置与日照分析相关的背景信息,背景信息包含待测点坐标、经纬度、计算日期、计算时段、离散时间步长信息。
背景信息设置具体为,设置待测点P(X,Y,Z),以及其经度值α和纬度值设置计算的日期Date,起止时段TBegin、TEnd及所需的离散时间步长L,其中8:00<=TBegin<TEnd<=16:00,L取1分钟或5分钟,初始化日照时间起始值SUM=0,计算时刻TX=TBegin,相交三角形TShade为空。
步骤三:计算太阳位置,并生成太阳光线向量;
太阳位置计算过程为,
根据日期Date计算出太阳的赤纬δ,
δ=23.45×sin|(d-80.25)×(1-d/9500)| (1)
其中,d为所选日期Date到当年元旦的天数差;
循环选取所设定时段中的时刻TX,计算太阳在每一时刻的真太阳时T,
T=TX+|α-120|/15×60 α>120
T=TX-|α-120|/15×60 α<120 (2)
计算太阳时角Ω,Ω=(12/π)×(T-12) (3)
根据公式
计算太阳位置,得到太阳高度角Hs与太阳方位角As,其中,为地理纬度;
基于计算所得到的太阳高度角与方位角,计算太阳的光线向量VectorS(X,Y,Z),根据光线向量,得到沿该向量较远处一点PS(X,Y,Z);
VectorS.X=-cos(Hs)×sin(As);VectorS.Y=sin(Hs)
VectorS.Z=-cos(Hs)×cos(As)
PS.X=P.X+100000×VectorS.X;PS.Y=P.Y+100000×VectorS.Y
PS.Z=P.Z+100000×VectorS.Z (6)。
步骤四:将太阳光线与缓存中的三角形图元进行相交判断,若相交,则该点在该时刻被遮挡,转步骤七;否则转步骤五;
与三角形图元进行相交判断过程为,判断缓存是否为空,若为空,转步骤五;若不为空,则将光线与缓存中的三角形Triangle按如下方法进行相交判断:
A)取Triangle所包含的三个点,分别赋值给点P0,P1,P2;
B)将点P与点PS,P0,P1,P2分别组合,得到向量Vpq,Vpa,Vpb,Vpc,
C)分别选取Vpq、Vpa、Vpb构造向量三重积u=Triple(Vpq,Vpa,Vpb),具体方法为:
a)将Vpq和Vpa进行叉积运算,生成crossqa(X,Y,Z),
b)将crossqa(X,Y,Z)与Vpb进行点积运算,得到u,
u=crossqa.X×Vpb.X+crossqa.Y×Vpb.Y+crossqa.Z×Vpb.Z (9);
D)利用Vpq、Vpa、Vpc,基于公式(8)与公式(9)构造向量三重积v=Triple(Vpq,Vpa,Vpc);
E)利用Vpq、Vpb、Vpc,基于公式(8)与公式(9)构造向量三重积w=Triple(Vpq,Vpb,Vpc);
F)判断所生成的向量三重积的乘积,如果u×v<0或u×w<0或v×w<0,则光线与三角形没有交点,转步骤五;否则,光线与三角形相交,转步骤G;
G)设置相交的三角形TShade=Triangle;
根据相交结果进行判断,若光线Vector(X,Y,Z)与三角形Triangle相交,则点P(X,Y,Z)此时被三角形Triangle遮挡,转步骤七;否则转步骤五。
步骤五:将太阳光线与场景中地形/地物要素所构成的三角网进行相交判断,若有相交,转步骤七;若未相交,转步骤六;
将太阳光线与场景中地形/地物要素所构成的三角网进行相交判断过程为,选取场景要素三角网Mesh中的每一个三角形,采用步骤四中的光线与缓存中的三角形Triangle相交判断方法对光线与每一个三角形的相交情况进行判断,若有相交,则该时刻被遮挡,设置缓存中的图元为遮挡三角形Triangle,转步骤七;否则,该时刻未被遮挡,转步骤六。
步骤六:将日照时数进行叠加,设置日照时间SUM=SUM+L,并设置缓存中的三角形为空。
步骤七:设置缓存中的三角形图元为遮挡三角形;比较当前计算时刻是否超出计算区间,如果是,结束计算,输出结果;否则,转步骤三,进行下一时刻计算。具体为,设置缓存中的图元为遮挡三角形Triangle,设置TX=TX+L,如果TX<=Tend,则输出日照时间SUM,退出循环,否则转步骤三。
步骤八:结束计算,输出日照时数的计算结果。
本说明书中所描述的以上内容仅仅是对本发明所作的举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种修改或补充或采用类似的方式替代,只要不偏离本发明说明书的内容或者超越本权利要求书所定义的范围,均应属于本发明的保护范围。