Вот держи. Пришлось малость колхозить, но работает
def motion(angle):
x1 = (c.coords(f)[0] + c.coords(f)[2]) / 2#координата x центра первого круга
y1 = (c.coords(f)[1] + c.coords(f)[3]) / 2#координата y центра первого круга
x2 = (c.coords(f1)[0] + c.coords(f1)[2]) / 2#координата x центра второго круга
y2 = (c.coords(f1)[1] + c.coords(f1)[3]) / 2#координата y центра второго круга
if not math.floor(((x2-x1)**2+(y2-y1)**2)**0.5) == RADIUS2 + RADIUS3:#Вычисляем расстояние между центрами окружностей и если оно равно сумме радиусов окружностей то выходим. Пришлось сделать math.floor() т.к. иногда не сходятся
angle = angle + 0.1
c.coords(f, coords(angle))
root.after(50, lambda: motion(angle))
def motion_1(angle):
x1 = (c.coords(f)[0] + c.coords(f)[2]) / 2#тоже самое
y1 = (c.coords(f)[1] + c.coords(f)[3]) / 2
x2 = (c.coords(f1)[0] + c.coords(f1)[2]) / 2
y2 = (c.coords(f1)[1] + c.coords(f1)[3]) / 2
if not math.floor(((x2-x1)**2+(y2-y1)**2)**0.5) == RADIUS2 + RADIUS3:
angle = angle - 0.1
c.coords(f1, coords_1(angle))
root.after(50, lambda: motion_1(angle))