我的游戏有一个机器人,可以用激光杀死僵尸。我一直在浏览论坛寻找这个问题的答案,有些人提到投影是最简单的方法。我还听说,如果你把线段变成实际的无限长线,那会更容易。如果无限指的是一个如此之长的激光,它从屏幕的一角延伸到另一角,那么我可以这样做。你必须记住,这个激光器基本上是一张矩形图片。我的机器人也可以就地旋转,所以我希望激光也能旋转。所以基本上我想知道如何检测僵尸和我的激光之间的碰撞,僵尸将被建模为圆,而我的激光将被建模为线段或无限长的线。
发布于 2015-11-27 17:54:25
慢的方法是“沿着激光运行一个点,检查它是否在僵尸的触手可及范围内”。
def distance(x1, y1, x2, y2):
"""Returns the distance between (x1, y1) and (x2, y2)."""
return math.sqrt((x2 - x1) **2 + (y2 - y1) ** 2)
def check_laser_beam(sx, sy, dx, dy, zombies):
"""Runs a point along a laser beam, checking if it hits any zombie."""
# Start the laser at the origin
lx = sx
ly = sy
# run a point along the laser, until we hit the edge of the screen
while onscreen(lx, ly):
for z in zombies:
if distance(lx, ly, z.x, z.y) < ZOMBIE_SIZE:
return z
return None
这是非常低效的,基本上与僵尸的数量成正比,乘以到屏幕边缘的距离。然而,它足够简单,可以简单地识别为正确。
它还给了我们一个提示,如何更快地解决这个问题。上面的代码所做的是查看波束是否拦截半径为ZOMBIE_SIZE的圆,该圆以任何僵尸为中心。
我们可以将这条线建模为一般的"a_x + b_y = t“,我们可以将圆形僵尸的周长建模为"(x - zx) ** 2+ (y - zy) ** 2= r**2”(只有x和y是变量,zx,zy和r是常量)。这可以转化为一组方程,可以机械地求解。如果你得到两个解,光束肯定会穿过“圆形僵尸”,如果你得到一个解,它只与僵尸相切。如果你没有得到解决方案,它根本不会拦截僵尸。
https://stackoverflow.com/questions/33953395
复制相似问题