检查线条是否穿过2D地图上的墙壁

时间:2012-05-22 18:12:03

标签: c++ map line collision intersect

我有2d地图,我想检查线是否与任何元素发生碰撞。我需要一个函数,可以告诉我线是否与路上的任何对象相交。

看看:

enter image description here

红线不正确(函数应该返回false),绿色是(返回true)。 我的碰撞图是布尔图,其中1表示墙,0表示空格。

怎么样?我已经读过,我需要检查线是否与任何墙相交,但我完全不知道如何在2d地图上执行此操作。

任何回复的Thanx。

3 个答案:

答案 0 :(得分:3)

这取决于你的墙壁是如何表现的。

如果它们是矩形,则查找您的线与表示矩形的4个线段之间的line/segment交点。

如果它们是像素,您可以使用bresenham line算法查看线上的像素是否在这些块上。

答案 1 :(得分:1)

如果你的墙被表示为线段,你可以测试线段的交叉,正如Paul Bourke所描述的那样:http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/

如果您的墙被表示为多边形,您可以将测试线剪切到墙多边形,并查看剪裁结果是否为非空,如Paul Bourke所述:http://local.wasp.uwa.edu.au/~pbourke/geometry/cliplinetopoly/

答案 2 :(得分:-1)

所以,我想象你的细胞是正方形......让我们说它们是单位正方形。所以,如果我有任何坐标,对于像浮点数或双打点这样的点,它们都在单元格中。

  1. 您需要知道哪些单元格是行的端点
  2. 从一个端点直接走到另一个端点,对于每个小区,测试它是否是墙
  3. 找到墙壁时返回false,否则返回true。
  4. 要从一个端点走到另一个端点,您需要计算每个轴的增量(调用delta_x和delta_y,这些值为'int',因为我们在这里讨论的是单元格),即它继续运行的单元格数量垂直和水平。你占据了两者中最大的一个。您将使用该循环的最大值。假设这个值是D = max(delta_x,delta_y),XX和YY是一个端点的单元格的坐标。

    float step = 1.0f / D;
    float current_location = 0.0;
    for (int i = 0; i <= D; ++i, current_location += step)
    {
      int cur_x = XX + current_location * delta_x;
      int cur_y = YY + current_location * delta_y;
      if (intersect_wall(cur_x, cur_y))
        return false;
    }
    return true;
    

    就是这样......让它适应你的功能。