Один из подходов заключается в перемещении каждого круга от другого при обнаружении перекрытия:
Пока расстояние между двумя центрами меньше суммы двух радиусов, перемещайте каждый круг на a немного в стороне от другого .
# r0, r1, epsilon, Scalars representing radii and a small value
# c0, c1, center Points
# ((c1 - c0) / |c1 - c0|) normalized c0c1 vector away from c1
# ((c0 - c1) / |c1 - c0|) normalized c0c1 vector away from c0
while (r0 + r1) > |c1 - c0|:
c0 = c0 + ((c1 - c0) / |c1 - c0|) * epsilon
c1 = c1 + ((c0 - c1) / |c1 - c0|) * epsilon
Edit : Пример класса Point (python) для удобной арифметики c:
class point:
def __init__(self, x, y):
self.x = x
self.y = y
def __sub__(self, other) -> Vector:
return Vector(self.x - other.x, self.y - other.y)
...