如何对伪3D建筑物进行排序/绘制,使其不会在视觉上重叠

时间:2011-07-17 04:18:44

标签: algorithm map drawing

我在地图上有建筑物的矢量数据,并希望它们看起来是挤压的,具体取决于已知的高度。

我知道这是一项常见任务,但我找不到任何令人满意的解决方案。

我在mapnik中看到了实现,它们使用多边形中所有顶点的最小Y进行简单排序。结果,大多数都是正确的,但有些仍然重叠(约2-3%)。

Buildings overlap if sorted just by minimum Y

在大多数情况下,只需很好地对结构进行排序(以某种方式?)并以适当的顺序绘制它们(对于上述情况,此序列将为3-2-1)。

在更复杂的情况下,当多边形是凹的并且彼此太靠近时,每个墙和帽(屋顶)应该分开绘制(见下文)。

enter image description here

更新:

因此,有两种要绘制的细分:墙和帽。墙段很容易订购(最小Y)。我无法弄清楚如何订购上限。

谢谢。

1 个答案:

答案 0 :(得分:2)

在直墙的情况下,很容易按深度排序。只考虑它们的直线段基数。请注意,每条线将平面分为两部分,其中一部分更靠近观察者,另一部分更远。对于任何段A,调用较近的部分A +和更远的部分A-。现在,对于任何两个段A和B,至少有一个命题成立:

  1. 完全在于B +
  2. 完全在于B -
  3. B完全位于A -
  4. B完全位于A +
  5. 一段与视线平行,另一段完全在左侧或完全在右侧
  6. A和B相交
  7. 在案例1和案例3中,B应在A之前绘制(A可能会封闭B,但B可能不会封闭A);在案例(2)和(4)A之前的B;在案例5中,没关系;普通墙壁不应出现6。

    您现在可以对墙进行拓扑排序,并从最远到最近绘制它们。

    对于屋顶,这对于凹形建筑物是不可能的,因为屋顶的一部分可能被遮挡了同一屋顶的另一部分的墙壁遮挡。想象一下,从其侧面可以看到一个低U形建筑,在U的中间有一座高塔。塔楼将被U型屋顶遮挡并遮挡,所以无论你绘制它们的顺序如何,图片都将是错。

    因此,您必须将凹形屋顶细分为凸多边形。然后应该很容易按照相同的原则将它们与墙壁一起排序。

    另一种方法是使用Z缓冲区,这使您无需考虑顺序。我的印象是,如今你可以在最低功耗的手机显卡上获得Z缓冲。