抱歉,如果我的英语不好(我是法国学生)。
我正在为学校项目工作,想在模拟场景中创建人群移动,包括一些墙壁、喷泉和路灯。我已经完成了几乎所有的工作:创建了AI,可以在2D平面上移动,我的地方已经建模,使用Reynolds' Boid规则(对齐,凝聚,分离)来模拟人类在人群运动中的互动。但我还需要编写一个函数来模拟当人们碰到墙或其他结构物时的物理效应。
但我现在正在初始化(创建)人群,而它并没有正常工作:人群由N个人(代理)组成,其中N的值介于1至5518之间(由于空间限制而设定的最大人数)。以下是代码:
我认为出现了无限循环,但是我无法解决它。为了更好地理解我的代码,这里有一张我在画图中的计划图片,然后第二张图片是我的程序,其中所有代理都在一个独特的地块(x,y)上生成在场所的中心(这不是我想要的,我希望每个人都在独特的地块上,同时通过X坐标移动,然后在Y坐标上加1,然后再通过X坐标移动等等,而且人们不能出现在红色的区域内所以喷泉)。
我不太熟悉字典,所以我将您的第一个函数改为返回每个水块的列表,其结果类似于:
然后,我在我的Foule类中应用了您的第二个函数,但唯一不起作用的是这行代码:
当我执行代码时,我会得到这个错误行:
您真诚的, Axel JOLY
编辑2:
我的代码现在可以工作了,这是结果:
我正在为学校项目工作,想在模拟场景中创建人群移动,包括一些墙壁、喷泉和路灯。我已经完成了几乎所有的工作:创建了AI,可以在2D平面上移动,我的地方已经建模,使用Reynolds' Boid规则(对齐,凝聚,分离)来模拟人类在人群运动中的互动。但我还需要编写一个函数来模拟当人们碰到墙或其他结构物时的物理效应。
但我现在正在初始化(创建)人群,而它并没有正常工作:人群由N个人(代理)组成,其中N的值介于1至5518之间(由于空间限制而设定的最大人数)。以下是代码:
self.agents = []
x = 50
y = 55
X = 0
while X < N:
if x <= 100 and x >= 50 and y <= 165 and y >= 55:
k = 0
while k < 50 and X < N:
for a in range(11):
for b in range(13):
if (x, y) != ((70 + a),(104 + b)):
x += k
agent = UnAgent(x, y)
self.agents.append(agent)
X += 1
k += 1
x = 50
y += 1
我认为出现了无限循环,但是我无法解决它。为了更好地理解我的代码,这里有一张我在画图中的计划图片,然后第二张图片是我的程序,其中所有代理都在一个独特的地块(x,y)上生成在场所的中心(这不是我想要的,我希望每个人都在独特的地块上,同时通过X坐标移动,然后在Y坐标上加1,然后再通过X坐标移动等等,而且人们不能出现在红色的区域内所以喷泉)。
编辑:
嗨@PatrickArtner,感谢您关注我的问题并帮助我!您的回答非常有用,所以我尝试调整您的代码(与我的代码相比真的易懂!),这就是我拥有的内容:
def addMonumentCentral():
'''Bloque la place de (70,104) à (80,116) avec des "briques" '''
L=[]
for a in range(70,81):
for b in range(104,117):
L.append((a,b)) # List of every unique tuple occupied by water
class Foule:
def __init__(self, count, largeur = 150, hauteur = 220):
self.largeur = largeur
self.hauteur = hauteur
self.agents = []
numAg = 0
MonumentCentral = addMonumentCentral()
for y in range(55,166):permise
for x in range(55,101):
if (x,y) not in MonumentCentral:
agent = UnAgent(x, y)
agent.largeur = largeur
agent.hauteur = hauteur
self.agents.append(agent)
numAg += 1ajoutes
if numAg == count:
break
if numAg == count:
break
我不太熟悉字典,所以我将您的第一个函数改为返回每个水块的列表,其结果类似于:
[(...,...),(...,...),...,(...,...)]
,其中每对括号代表二维平面上的水块。然后,我在我的Foule类中应用了您的第二个函数,但唯一不起作用的是这行代码:
if (x,y) not in MonumentCentral:
。在Python中,好像我不能测试包含元组的列表:我是Python的初学者,看起来似乎不起作用,但我不知道如何做与先前相同的事情。当我执行代码时,我会得到这个错误行:
TypeError: argument of type 'NoneType' is not iterable
。您知道如何用一个类似的方法替换测试元组与元组列表的语句吗?您真诚的, Axel JOLY
编辑2:
我的代码现在可以工作了,这是结果:
class Foule:
def __init__(self, count, largeur = 150, hauteur = 220):
self.largeur = largeur
self.hauteur = hauteur
self.agents = []
numAg = 0 # Nombre d'agents ajoutes
MonumentCentral = []
for a in range(70,81):
for b in range(104,117):
MonumentCentral.append((a,b))
for y in range(55,166): # On parcourt selon les y la zone de spawn permise
for x in range(55,101): # On parcourt selon les x la zone de spawn permise
if (x,y) not in MonumentCentral: # On check si c'est bloqué ou non
agent = UnAgent(x, y) # Position de depart
agent.largeur = largeur
agent.hauteur = hauteur
self.agents.append(agent)
numAg += 1 # Iteration pour compter le nombre d'agents ajoutes
if numAg == count: # On casse si on atteint le nombre d'agents voulu
break
if numAg == count: # On casse si on atteint le nombre d'agents voulu
break
很抱歉,这个内容大部分是用法语写的,但现在它已经完美地运作了,从1个代理到5518个代理都没有问题!
x
、y
、k
、X
、N
是什么?这些神奇的数字50
、55
、100
、50
、165
、55
、50
、11
、13
、70
、104
又是什么意思? - Reblochon Masque