使用 numpy 进行碰撞测试
Colission testing with numpy
假设我有一个单元格矩阵和坐标 x
,y
表示 Tetronimo
的左上角单元格和对应于 B
的矩阵一口俄罗斯方块井:
T = [[2,2,2],
[2,0,0],
[0,0,0]]
y,x = (1,0)
B = [[0,0,0,0,0],
[0,0,0,0,0],
[1,0,0,0,0],]
目前我正在使用简单的比较来查找碰撞:
def testCollision(x,y, T, B):
for dx in xrange(3):
for dy in xrange(3):
if T[dy][dx] == 0:
continue
else:
if B[y+dy][x + dx] != 0:
return False
return True
我可以使用 numpy 加快速度吗?
如果我没记错的话,这种形式的东西应该可以工作
return (B[x:x+3,y:y+3] * T).sum() == 0
你应该测试它的正确性;在任何情况下,在 numpy 范例中,它在算法上都是最优的。但是请注意,对诸如此类的小型数组的操作也不是非常有效。仍然比 C 风格的迭代好很多,但是数组抽象的开销会很明显。也就是说,就俄罗斯方块而言,性能首先是一个问题。 ;)
return (B[x:,y:][:3,:3] * T).sum() == 0
顺便说一句,我认为对于这类操作,这是更清晰、更易读的索引;尽管由于构建了另一个视图而略微 (O(1)) 变慢。
假设我有一个单元格矩阵和坐标 x
,y
表示 Tetronimo
的左上角单元格和对应于 B
的矩阵一口俄罗斯方块井:
T = [[2,2,2],
[2,0,0],
[0,0,0]]
y,x = (1,0)
B = [[0,0,0,0,0],
[0,0,0,0,0],
[1,0,0,0,0],]
目前我正在使用简单的比较来查找碰撞:
def testCollision(x,y, T, B):
for dx in xrange(3):
for dy in xrange(3):
if T[dy][dx] == 0:
continue
else:
if B[y+dy][x + dx] != 0:
return False
return True
我可以使用 numpy 加快速度吗?
如果我没记错的话,这种形式的东西应该可以工作
return (B[x:x+3,y:y+3] * T).sum() == 0
你应该测试它的正确性;在任何情况下,在 numpy 范例中,它在算法上都是最优的。但是请注意,对诸如此类的小型数组的操作也不是非常有效。仍然比 C 风格的迭代好很多,但是数组抽象的开销会很明显。也就是说,就俄罗斯方块而言,性能首先是一个问题。 ;)
return (B[x:,y:][:3,:3] * T).sum() == 0
顺便说一句,我认为对于这类操作,这是更清晰、更易读的索引;尽管由于构建了另一个视图而略微 (O(1)) 变慢。