首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >直线段与圆的碰撞算法

直线段与圆的碰撞算法
EN

Stack Overflow用户
提问于 2015-11-27 16:44:29
回答 1查看 106关注 0票数 0

我的游戏有一个机器人,可以用激光杀死僵尸。我一直在浏览论坛寻找这个问题的答案,有些人提到投影是最简单的方法。我还听说,如果你把线段变成实际的无限长线,那会更容易。如果无限指的是一个如此之长的激光,它从屏幕的一角延伸到另一角,那么我可以这样做。你必须记住,这个激光器基本上是一张矩形图片。我的机器人也可以就地旋转,所以我希望激光也能旋转。所以基本上我想知道如何检测僵尸和我的激光之间的碰撞,僵尸将被建模为圆,而我的激光将被建模为线段或无限长的线。

EN

回答 1

Stack Overflow用户

发布于 2015-11-27 17:54:25

慢的方法是“沿着激光运行一个点,检查它是否在僵尸的触手可及范围内”。

代码语言:javascript
运行
复制
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是常量)。这可以转化为一组方程,可以机械地求解。如果你得到两个解,光束肯定会穿过“圆形僵尸”,如果你得到一个解,它只与僵尸相切。如果你没有得到解决方案,它根本不会拦截僵尸。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33953395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档