计算矩形中的重叠,将结果绘制为热图

时间:2017-11-07 08:46:55

标签: python geometry computational-geometry

我有一个矩形列表(坐标为(x0,y0,x1,y1))在某些区域重叠。我想用它们的重叠来绘制它们,并有一个额外的扭曲:每个重叠区域的颜色应该像热图:它们应该变得更暗(或更亮,或更红 - 这并不重要)矩形重叠得越多在那个地区。

这可以通过Pandas轻松完成,但需要O(N_pixels)太多了。应该有一种方法可以做到这一点,其成本取决于矩形的数量,从而加速我数千次。

示例(在熊猫中):

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

coords = [(1, 1, 4, 4), (2, 3, 6, 6), (2, 1, 3,2), (5, 3, 6, 7), (4, 3, 6, 7), (8, -5, 10, -2), (6, 0, 8, 3)]

heatmap = pd.DataFrame()
for box in coords:
    area = pd.DataFrame(1, index=range(box[0], box[2]), columns=range(box[1], box[3]))
    heatmap = heatmap.add(area, fill_value=0)

heatmap = heatmap.fillna(0).astype(int)
with sns.axes_style('white'):
    plt.figure(figsize=(10,10))
    ax = sns.heatmap(heatmap, cmap=plt.cm.jet, xticklabels=100, yticklabels=100)
    ax.set(title="Heatmap of overlapping rectangles")
    plt.show()

显示:

Rectangles Overlap

1 个答案:

答案 0 :(得分:0)

使用扫描算法。

通过增加其上边缘的纵坐标(y轴向下)对矩形进行排序。实现一个活动列表,即一个只包含符合水平线的矩形的列表(当线路断开时处理更新很容易)。

您可以使用二叉搜索树以排序的顺序保持相交矩形的左右端点。

现在,通过扫描列表并计算满足的端点,您可以确定重叠的数量。重建要填充的多边形需要一些额外的工作,但整个过程应该在M(矩形)的时间O(M Log M)内执行。

enter image description here

<强>附录:

有一种非优化但无论如何有用的方法,实施起来非常简单。

如果分别对所有x和所有y的角进行排序,则可以将它们映射到自然,用其等级替换每个值。然后你的游乐场压缩成一个紧凑的光栅图像,其中最小的矩形是一个像素。

要获得重叠计数,只需绘制每个矩形即可。然后,您只需要考虑它们的M²(或者在对齐的情况下更少;在您的示例的情况下,49像素),而不是N²像素的全分辨率图像。绘画工作与压缩坐标中矩形区域的总和成比例。

这个技巧也适用于真实坐标。