【发布时间】:2014-09-07 11:13:26
【问题描述】:
我正在开发一种软件 (Ruby - Sketchup),用于计算城市发展中行人层面的辐射(太阳、天空和周围建筑物)。最终目标是能够创建显示总辐射水平的等高线图。对于总辐射,我的意思是短波(光)和长波(热)。 (给你一个想法:http://www.iaacblog.com/maa2011-2012-digitaltools/files/2012/01/Insolation-Analysis-All-Year.jpg)
我知道有几个现有的软件可以做到这一点,但我需要自己编写,因为这个计算只是更复杂的工作流程的一部分。
(明显的)伪代码如下:
Select and mesh surface for analysis
From each point of the mesh
Cast n (see below) rays in the upper hemisphere (precalculated)
For each ray check whether it is in shade
If in shade => Extract properties from intersected surface
If not in shade => Flag it
loop
loop
loop
上面的方法是蛮力的,但这是我唯一能想到的。计算时间随着精度的四次方(Dx,Dy,Dazimth, Dtilt)而增加。我知道像 radiance 这样的软件使用 Montecarlo 方法来减少光线的数量。
您可以想象,网格特定点的计算精度很大程度上取决于天穹细分的精度。同样,表面上的精度取决于网格的粗糙度。
我正在考虑使用基于计算结果的自适应细化的不同方法。改进可以用于分析的表面和天穹。如果两个相邻点之间的结果差异超过阈值,则将执行细化。这通常在流体模拟中完成,但我找不到任何关于光模拟的内容。
我还想知道是否有算法,例如计算机图形学,可以最大限度地减少计算次数。例如:检查周围环境的最大高度,以便排除某些点的天穹的某些部分。
我不需要极高的准确性,因为我不进行渲染。目前我的首要任务是速度。
对方法有什么建议吗?
谢谢
n 条射线 此刻,我以恒定的方位角和倾斜步长细分天空;这会导致不规则的立体角。还有其他细分(例如 Tregenza)保持恒定的立体角。
编辑:回答 Spektre 提出的重要问题
时间范围。我每年每小时运行一次模拟。天气数据是从 epw 天气文件中提取的。它包含每小时的太阳高度和方位角、直接辐射、漫射辐射、云量(对于大气长波漫射)。我的算法分别计算阴影掩模,然后它使用这个阴影掩模来计算一年中每个小时在表面(和典型行人身上)的辐射。在第二步中,我添加了实际的辐射。在第一步中,我只是收集有关各种表面的几何形状和属性的信息。
太阳路径。不,我没有。见第 1 点
包括来自建筑物的反射?目前还没有,但我计划将其作为基于天空视角因素的整体漫反射短波反射。我现在只考虑来自地面的短波反射。
包括建筑物的散热?绝对没错。这就是我自己编写这段代码的原因。在迪拜,这是关键,因为建筑表面变得非常非常热。
表面反照率?是的,我愿意。在 Skethcup 中,我为每个表面关联了一个字典,在这本字典中,我包含了所有表面属性:温度、发射率等。目前温度是固定的(如果未指定环境温度),但我计划在未来,将其与已计算所有表面温度的建筑动态热模拟的结果相结合。
地图分辨率。分辨率由用户选择,网格由算法生成。在规模方面,我将其用于总体规划。规模从 100mx100m 到 2000mx2000m。我通常倾向于使用 2m 的最小分辨率。限制是内存和模拟时间。我还可以选择使用更精细的网格细化特定区域:例如有餐厅或其他便利设施的区域。
帧率。我不需要制作动画。结果以 VTK 文件导出,并在 Paraview 中可视化并在其中设置动画,以便在演示过程中炫耀 :-)
热和光。是的。短波和长波分开处理。见第 4 点。地理定位仅用于选择正确的天气文件。我不计算所有的辐射分量。我需要的天气文件有测量数据。他们不是很好,但现在已经足够好了。 https://www.lucidchart.com/documents/view/5ca88b92-9a21-40a8-aa3a-0ff7a5968142/0
【问题讨论】:
-
好吧,你问的不是很清楚。但是,你有一个投射阴影的半球,你想知道它们是否在阴影内?
-
我想做的远不止这些。我正在计算地面上的总辐射。像这样link
-
我想说一种更有效的方法是将圆顶的边界投射到 ground/objects 上。 (通过投射我的意思是投影。)地面/物体上的圆顶边界也将是连续的 - 并且其中的所有点都在阴影中......
-
嗯...我不确定我是否理解。我不需要方向来进行投影吗?我需要从各个方向计算整个圆顶产生的辐射。其中一些方向可能处于阴影中,在这种情况下,我会计算来自表面的热辐射。
-
好吧,不管怎样,你还是从每个点投射 n 射线,我假设要创建所有方向的效果......所以你可以选择你的源的 n 个方向,比如太阳的位置等。计算 n 个投射边界,然后进行计算。优化将来自这样一个事实,即您只处理圆顶的边界。而不是像之前那样为每个射线投射处理圆顶上的每个点。
标签: ruby computational-geometry shadow light sketchup