最小距离移动球 (Python)

Moving balls with minimum distance (Python)

我正在尝试编写一个代码,我可以使用鼠标左键来回移动两个圆圈。大部分代码都可以工作,但我遗漏了一部分;圆圈之间的最小距离应为 100 像素(不允许将它们拉得更近)。我尝试将 while length > 70 与函数 def mouseMoved(self, event) 一起使用,但它没有用。我希望有人能帮助我。

from tkinter import * 
import math

class Circle:
def __init__(self, x, y, radius):
    self.x = x
    self.y = y
    self.radius = radius

def isInside(self, x, y):
    return distance(self.x, self.y, x, y) <= self.radius
              
class MainGUI:
def __init__(self):   
    window = Tk() 
    window.title("Two Balls") 

    self.canvas = Canvas(width = 400, height = 250)
    self.canvas.pack()
    
    self.c1 = Circle(20, 20, 20)
    self.c2 = Circle(120, 50, 20)
    self.canvas.create_line(self.c1.x, self.c1.y, self.c2.x, self.c2.y, tags = "line")      
    self.getLength()

    self.paint(self.c1, "red", "c1")
    self.paint(self.c2, "red", "c2")
  
    self.canvas.bind("<B1-Motion>", self.mouseMoved)
    
    window.mainloop() 

def getLength(self):
    length = round(math.sqrt((self.c1.x-self.c2.x)**2 + (self.c1.y-self.c2.y)**2), 2)
    self.canvas.create_text((self.c1.x+self.c2.x)/2, (self.c1.y+self.c2.y)/2, text = length, tags = "text") 
    return length
    
def mouseMoved(self, event):
    self.canvas.delete("line") 
    self.canvas.delete("text")

    if self.c2.isInside(event.x, event.y):
        self.c2.x = event.x
        self.c2.y = event.y 
            
    self.canvas.delete("c2")
    self.paint(self.c2, "red", "c2")

    if self.c1.isInside(event.x, event.y):
        self.c1.x = event.x
        self.c1.y = event.y 
    
    self.canvas.delete("c1")
    self.paint(self.c1, "red", "c1")

    self.canvas.create_line(self.c1.x, self.c1.y, self.c2.x, self.c2.y, tags = "line")
    self.getLength()

def paint(self, c, color, tags = "stable"):
    self.canvas.create_oval(c.x - c.radius, c.y - c.radius, c.x + c.radius, c.y + c.radius, fill = color, tags = tags)

def distance(x1, y1, x2, y2):
return ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) ** 0.5       
MainGUI()

您需要计算两个圆之间的距离移动其中一个后,只有当距离大于100像素时才执行实际移动:

def mouseMoved(self, event):
    f2 = self.c2.isInside(event.x, event.y)
    f1 = self.c1.isInside(event.x, event.y)

    # Is one of the circles is selected?
    if f1 or f2:
        # calculate the distance between the two circles after one of them is moved
        if f1:
            length = distance(event.x, event.y, self.c2.x, self.c2.y)
        else:
            length = distance(event.x, event.y, self.c1.x, self.c1.y)

        # Only perform the move if the distance > 100 pixels
        if length > 100:
            self.canvas.delete("text")
            self.canvas.delete("line")
            if f2:
                self.c2.x = event.x
                self.c2.y = event.y

                self.canvas.delete("c2")
                self.paint(self.c2, "red", "c2")
            else:
                self.c1.x = event.x
                self.c1.y = event.y

                self.canvas.delete("c1")
                self.paint(self.c1, "red", "c1")

            self.canvas.create_line(self.c1.x, self.c1.y, self.c2.x, self.c2.y, tags="line")
            self.getLength(length)