Algorithm 三角形的skyline算法

Algorithm 三角形的skyline算法,algorithm,data-structures,polygon,Algorithm,Data Structures,Polygon,我试图写一个算法来寻找三角形的上包络线。 通过以下操作,您可以看到矩形的天际线: 我有一个合并两个矩形天际线(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) 现在,我的问题是如何表示三角形,以及如何合并两个三角形的天际线 下面我假设三角形的基线在底部。我还假设所有三角形的上角都

我试图写一个算法来寻找三角形的上包络线。 通过以下操作,您可以看到矩形的天际线:

我有一个合并两个矩形天际线(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)
现在,我的问题是如何表示三角形,以及如何合并两个三角形的天际线


下面我假设三角形的基线在底部。我还假设所有三角形的上角都在基线之上(即,如果从上角笔直向下,则进入三角形内部,而不是外部)。然而,我并不是假设只允许对称三角形

实际上,三角形的合并将给出一个天际线,其中简单的点与线相连。因此三角形天际线的表示可以是点的有序列表(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_i,y_i)-(x_{i+1},y_{i+1})和每个线段(x_j,y_j)-(x_{j+1},y_{j+1})计算它们是否相交,如果相交,则计算其中(这意味着求解两个线性方程组的简单系统)。将交点收集到新列表“交点”中。现在有三个点列表:天际线1、天际线2和交点。由于所有交点都是天际线的一部分,因此将其用作新天际线的基础。(一种特殊情况是,两条天际线在一个间隔上一致,但在这种间隔中,组合的天际线与每个单独的天际线相同,因此仅使用这些间隔的起点和终点作为交点)

现在,对于每一对交叉点(以及第一个交叉点的左侧和最后一个交叉点的右侧),始终会有一条天际线位于另一条上方(除非他们同意,但选择哪一条并不重要)。在从该天际线到组合天际线的间隔中添加点。只需选择一条天际线的任意点(除非交点也是天际线点,否则不应选择该点),即可找到较大的点,并在其x值处检测另一条天际线的高度(如果另一条天际线的某个点也具有相同的x值,则这是y值的简单比较,否则必须对前面和后面的点的y值进行插值)


完成此操作后,您应该有正确的组合天际线。

这听起来像是一个一般编程问题。它是(当前)标记为C++,但我没有看到任何语言特定的东西。甚至没有提到C++。关于表示,我认为它将从简单的线条开始。有没有可能你愿意在你的天际线上进一步详细说明矩形?