Уникальность во вложенном списке, чтобы иметь не более одной перекрывающейся пары координат - PullRequest
0 голосов
/ 04 мая 2018

Итак, я прошел целую кучу кругов, определяя, где они перекрываются , как это , и теперь я построил круги, которые перекрываются.

Но в углу, как я показал стрелкой, у меня есть два красных круга, перекрывающих один синий, но должно быть обнаружено только одно перекрытие. Второе перекрытие круга следует игнорировать, исходя из расстояния.

Как убрать дополнительное перекрытие, чтобы один красный всегда перекрывал один синий, а также наоборот?

enter image description here

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()

1 Ответ

0 голосов
/ 06 мая 2018

Хорошо, я решил проблему с помощью панд. Оказывается, что вложенный список, подобный приведенному выше, на самом деле очень удобен для работы в качестве контейнера.

Взятие исходных кругов и их преобразование в кадр данных:

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 удаляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...