Делая наивный подход, для каждого набора окружностей вы можете рассчитать расстояние от него до всех других наборов окружностей, которые они вычисляют, если это расстояние больше, чем сумма их радиуса.Таким образом, вы будете знать, если какой-то круг перекрывает другой, тогда сумма радиуса будет меньше расстояния их центра.
Таким образом, вы можете определить некоторую функцию:
import math
def distance(p1, p2):
return math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2)
, и они определяютфункция для перекрытия:
def isoverlapping(circle1, circle2):
sum_of_radius = circle1[2] + circle2[2]
distance_bettwen_circles = distance(circle1, circle2)
return sum_of_radius >= distance_bettwen_circles
Итак, если функция выше возвращает true, вам придется игнорировать меньший круг.Для этого вы можете сделать функцию, которая вычисляет площадь окружностей и возвращает большее:
def greatercircle(circle1, circle2):
area1 = math.pi * circle1[2]
area2 = math.pi * circle2[2]
return circle1 if area1 >= area2 else circle2
, теперь нужно только объединить его в цикл:
output = []
# 1: Iterate over circles array, comparing every position with the others.
for index, circle in enumerate(circles):
# 2: get the other circles in array
another_circles = circles[:index] + circles[index+1:]
for another_circle in another_circles:
# 3: Iterate over the other circles
if isoverlapping(circle, another_circle):
# if an overlap ocurrs then get the greater circle.
# Now this will be the current circle for comparison.
greater = greatercircle(circle, another_circle)
circle = greater
# 4: If this circle is already in output, do not append it.
if circle not in output:
output.append(circle)
print(output)
Надеюсь, чтоэто может помочь вам!