繁体   English   中英

嵌套列表中的唯一性具有不超过一对重叠的坐标

[英]Uniqueness in nested list to have no more than one overlapping pair of coordinates

因此,我经历了一大堆圆圈, 像这样检测它们重叠的位置,现在我绘制了重叠的圆圈。

但是在拐角处,如箭头所示,我有两个红色的圆圈与一个蓝色的圆圈重叠,但是应该只检测到一个重叠的圆圈。 根据距离,第二个重叠的圆应忽略不计。

如何删除多余的重叠,以便一个红色将始终与一个蓝色重叠,但也将与另一个重叠?

在此处输入图片说明

import matplotlib.pyplot as plt    

# Format is (x1, y1, r1), x2, y2, r2), squared_distance)
circles = (((87, 319, 10), (82, 316, 10), 34),
           ((162, 230, 10), (157, 226, 10), 41),
           ((162, 438, 10), (162, 440, 10), 4),
           ((235, 146, 10), (230, 150, 10), 41),
           ((260, 183, 10), (260, 185, 10), 4),
           ((260, 265, 10), (253, 269, 10), 65),
           ((360, 88, 10), (366, 91, 10), 45),
           ((428, 442, 10), (433, 447, 10), 50), # Two red overlap the same blue
           ((438, 453, 10), (433, 447, 10), 61), # So this one (furthest away) must go
           ((459, 24, 10), (465, 21, 10), 45))

fig, ax = plt.subplots(figsize = (6,6))

ax.set_xlim(0,500)
ax.set_ylim(0,500)

for red, blue, squared_dist in circles:
    x1, y1, r1 = red
    x2, y2, r2 = blue

    c = plt.Circle((x1, y1), r1, color = "red", linewidth = 2, fill = False, alpha = 1)
    ax.add_patch(c)

    c = plt.Circle((x2, y2), r2, color = "blue", linewidth = 2, fill = False, alpha = 1)
    ax.add_patch(c)

ax.arrow(390, 400, 20, 20, head_width=10, head_length=10, fc='k', ec='k')
plt.show()

好吧,所以我用熊猫解决了这个问题。 事实证明,像上面这样的嵌套列表实际上非常容易用作容器。

将原始圆放入数据框:

df = pd.DataFrame(circles, columns = ["red", "blue", "dist"])

              red            blue  dist
0   (87, 319, 10)   (82, 316, 10)    34
1  (162, 230, 10)  (157, 226, 10)    41
2  (162, 438, 10)  (162, 440, 10)     4
3  (235, 146, 10)  (230, 150, 10)    41
4  (260, 183, 10)  (260, 185, 10)     4
5  (260, 265, 10)  (253, 269, 10)    65
6   (360, 88, 10)   (366, 91, 10)    45
7  (428, 442, 10)  (433, 447, 10)    50 
8  (438, 453, 10)  (433, 447, 10)    61 
9   (459, 24, 10)   (465, 21, 10)    45 

然后,如果按距离排序,则只需丢弃重复项即可。

df = df.sort_values("dist").drop_duplicates("red").drop_duplicates("blue").reset_index(drop = True)

屈服

              red            blue  dist
0   (87, 319, 10)   (82, 316, 10)    34
1  (162, 230, 10)  (157, 226, 10)    41
2  (162, 438, 10)  (162, 440, 10)     4
3  (235, 146, 10)  (230, 150, 10)    41
4  (260, 183, 10)  (260, 185, 10)     4
5  (260, 265, 10)  (253, 269, 10)    65
6   (360, 88, 10)   (366, 91, 10)    45
7  (428, 442, 10)  (433, 447, 10)    50
9   (459, 24, 10)   (465, 21, 10)    45

然后删除第8行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM