[英]Python - Checking every item in a list against every other item efficiently
我正在开发一个游戏,其中每个对象都应检查它是否与任何其他对象发生碰撞。 我有一个所有对象的清单,还有一个函数可以确定两个对象是否碰撞并销毁它们。 我正在使用的当前方法效率很低。
for i in list1:
for j in list1:
if collide(i, j):
i.kill()
j.kill()
最初,两个对象被杀死后,我将它们从列表中删除,但是发生了一些碰撞,没有检测到,因此我恢复了此代码。 它可以工作,但是我想要更有效的方法。
首先,这要测试两次,并且还要测试一个对象是否与自身碰撞:
for i in list1:
for j in list1:
if collide(i, j):
i.kill()
j.kill()
这将精确地循环len(list1)**2
次。
一种非常简单的方法将测试次数除以2(并避免针对自身进行测试):
for i,obj1 in enumerate(list1):
for j in range(i+1,len(list1)):
obj2 = list1[j]
if collide(obj1,obj2):
obj1.kill()
obj2.kill()
它利用了collide(obj1,obj2)
与collide(obj2,obj1)
相同的事实。
此时,由于obj1现在已死,您可能想break
内部循环。 但这取决于您想要做什么。
如果准确的碰撞测试很昂贵,则可以考虑进行更粗略的检查(距离,矩形边界,任何快速方法),因此可以丢弃彼此相距太远的项目而无需执行“昂贵”的测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.