我试图编写一个面向对象的程序(作为一种学习练习,我知道可能有更简单的方法),其中珠子围绕由环界定的2D平面。每个珠子是由类球定义的物体。在设置球的初始位置时,我需要检查没有其他球已经放置在相同的x和y坐标处。
#Class for the beads
class ball:
NumbBalls = 0
#Constructor
def __init__(self,Beads):
self.ball = sphere(pos = vector(0,0,0), radius = radiusBall,color=color.red)
ball.NumbBalls += 1
self.ball.pos = self.createInitialPosition(Beads)
#Assign ball its initial position
def createInitialPosition(self,other):
#CODE to compare self.ball.pos and other.ball.pos which returns a unique position coordinate
#Main program
NumbBeads = 100
Beads = []#Create empty list for all the beads
#create balls in random initial positions
Beads = [ball(Beads) for item in range(NumbBeads)]
如果我创建了两个对象bead1和bead2,然后将bead1和bead2作为参数传递,即bead2 = ball(bead1),我可以使用此工作但是如果我生成一个珠子列表并希望所有这些,我该怎么做他们要与自我相比。希望这是有道理的。
答案 0 :(得分:0)
或许不是你正在采用的方法,你应该考虑这些方面的东西(当然,对你的类定义/方法进行必要的修改):
N = 100
initialPositions = []
while len(initialPositions) <= N:
newPosition = generateRandomPosition()
if newPosition in initialPositions:
pass
else:
initialPositions.append(newPosition)
ballList = [ ball(p) for p in initialPositions ]
换句话说,在创建对象之外生成初始位置列表,并在创建过程中执行所需的任何验证/限制。然后只需从该列表中创建对象。如果N
非常大,您可能需要考虑字典(或某种类型的可变集)而不是initialPositions
的列表,以帮助加快成员资格测试,但它仍然是相同的概念...