我对python很新,似乎错过了一些东西
我想在pygame显示屏上随机绘制圆圈,但前提是圆圈不要相互重叠
我相信我必须找到所有圆心之间的距离,并且只有在距离大于circle radius * 2
时才绘制它。
我尝试了许多不同的事情,但都没有成功,我总是得到相同的结果 - 圆圈被重叠。
#!/usr/bin/env python
import pygame, random, math
red = (255, 0, 0)
width = 800
height = 600
circle_num = 10
tick = 2
speed = 5
pygame.init()
screen = pygame.display.set_mode((width, height))
class circle():
def __init__(self):
self.x = random.randint(0,width)
self.y = random.randint(0,height)
self.r = 100
def new(self):
pygame.draw.circle(screen, red, (self.x,self.y), self.r, tick)
c = []
for i in range(circle_num):
c.append('c'+str(i))
c[i] = circle()
for j in range(len(c)):
dist = int(math.hypot(c[i].x - c[j].x, c[i].y - c[j].y))
if dist > int(c[i].r*2 + c[j].r*2):
c[j].new()
pygame.display.update()
else:
continue
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
答案 0 :(得分:1)
for
循环已更改为while
循环。它将继续尝试生成圆圈,直到达到目标数量。首先生成一个圆。然后,它使用this answer中的公式检查它是否与任何现有圆相交。
迭代每个现有的圆圈(存储在列表circles
中)并使用公式执行检查。如果公式在任何迭代中的计算结果为any()
,则True
会返回True
。如果它是True
,则意味着它找到了一个交叉点。因此,它继续下一次迭代,再次使用新的圆圈。
circles = []
while len(circles) < circle_num:
new = circle()
if any(pow(c.r - new.r, 2) <=
pow(c.x - new.x, 2) + pow(c.y - new.y, 2) <=
pow(c.r + new.r, 2)
for c in circles):
continue
circles.append(new)
new.new()
pygame.display.update()
答案 1 :(得分:1)
您没有检查所有其他圈子。我添加了一个变量shouldprint
,如果任何其他圆圈太近,则会将其设置为false。
import pygame, random, math
red = (255, 0, 0)
width = 800
height = 600
circle_num = 20
tick = 2
speed = 5
pygame.init()
screen = pygame.display.set_mode((width, height))
class circle():
def __init__(self):
self.x = random.randint(0,width)
self.y = random.randint(0,height)
self.r = 100
def new(self):
pygame.draw.circle(screen, red, (self.x,self.y), self.r, tick)
c = []
for i in range(circle_num):
c.append('c'+str(i))
c[i] = circle()
shouldprint = True
for j in range(len(c)):
if i != j:
dist = int(math.hypot(c[i].x - c[j].x, c[i].y - c[j].y))
if dist < int(c[i].r*2):
shouldprint = False
if shouldprint:
c[i].new()
pygame.display.update()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()