三角形的天际线算法

时间:2011-12-04 12:11:38

标签: algorithm data-structures polygon

我正在尝试编写一个算法来查找三角形的上部包络(天际线)。 通过以下您可以看到矩形的天际线: enter image description here

我有一个算法用于合并矩形的两个天际线(L和R),如下所示:

  • 用(x1,x2,h)表示每个矩形,其中h是高度,x2-x1是宽度
  • 通过情侣列表(x,h)
  • 表示每个天际线
  • 对于i = min(L [1] .x,R [1] .x)到max(L [L的大小] .x,R [R的大小] .x)选择max(L [i] .h,R [i] .h)

现在,我的问题是如何表示三角形以及如何合并两个三角形的天际线

任何想法都将受到赞赏

1 个答案:

答案 0 :(得分:3)

在下文中,我假设三角形的底部是基线。我还假设所有三角形都是这样,使得上角位于基线上方(即如果你从上角直接向下,则进入三角形内部而不是外部)。但是,我 假设只允许对称三角形。

实际上,三角形的合并会给出一个简单的点与线连接的天际线。所以三角形天际线的表示可能只是一个有序的点列表(x_i,y_i),其限制是y_0 = 0和y_N = 0,其中N是最后一个点的索引。然后,单个三角形将由三元素列表(x_0,0),(x_1,h),(x2,0)表示,其中x_0和x_2是左端点和右端点(三角形达到0的两个点) ,x_1给出上角的水平位置,h给出高度。

例如,可以按如下方式合并两个天际线:

步骤1:对于来自天际线1和每个线段(x_j,y_j)的每个线段(x_i,y_i) - (x_ {i + 1},y_ {i + 1}) - (x_ {j +1},y_ {j + 1})计算它们是否相交,如果是,则在哪里(这意味着求解一个简单的两个线性方程组)。将交叉点收集到新的交叉点列表中。所以现在你有三个点列表:skyline1,skyline2和十字路口。由于所有十字路口都将成为天际线的一部分,因此将其作为新Skyline的基础。 (特殊情况是两个天际都在一个区间内达成一致,但在这样的区间内,组合天际线无论如何都与每个天线相同,所以只需将这些区间的起点和终点用作交点)

现在,对于每对交叉点(以及第一个交叉点的左侧和最后一个交叉点的右侧),总会有一个正好在另一个交叉点之上的天际线(除非它们一致,但是它没有'你选择的事情)。将该天际线的间隔中的点添加到组合天际线中。你可以通过选择一个天际线的任意点来找出较大的一个(除非交叉点也是一个天际线点,不应该选择一个),并检测另一个天际线的x值(如果是另一个)天际线也有一个相同x值的点,它是y值的简单比较,否则你必须插入前后点的y值。)

这样做之后,你应该有正确的组合天际线。