最小距离移动球 (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)
我正在尝试编写一个代码,我可以使用鼠标左键来回移动两个圆圈。大部分代码都可以工作,但我遗漏了一部分;圆圈之间的最小距离应为 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)