【问题标题】:Check if the line goes through wall on 2D map检查线是否穿过 2D 地图上的墙壁
【发布时间】:2012-05-23 02:38:32
【问题描述】:

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

看看:

红线不正确(函数应该返回假),绿线是(返回真)。 我的碰撞贴图是布尔图,1 代表墙壁,0 代表空白空间。

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

感谢任何回复。

【问题讨论】:

  • 线条是否只在单元格中心有端点,或者它们可以在任何地方?
  • 仅中心。也许将来我会用它做某事,但现在只有中心。

标签: c++ map line collision intersect


【解决方案1】:

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

如果它们是矩形,则在您的线和代表矩形的 4 个线段之间寻找line/segment 交点。

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

【讨论】:

  • 它们是二维数组碰撞图上的位。也许还有更多?我是新手:(
  • 然后使用 Bresenham 算法。诀窍是您必须使用作为单元格坐标的坐标,而不是像素,并且目标不是画线。您知道直线的坐标(起点和终点)。使用 bresenham 算法找出这条线上的所有块。如果这些块中的一个是墙,那么就会发生碰撞。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    所以,我认为您的单元格是正方形...假设它们是单位正方形。所以,如果我有任何坐标,对于像浮点数或双精度点这样的点,它们在单元格中。

    1. 您需要知道线的端点位于哪些单元格中
    2. 从一个端点直接走到另一个端点,并为每个单元测试它是否是一堵墙
    3. 找到墙时返回 false,否则返回 true。

    要从一个端点走到另一个端点,您需要计算每个轴的增量(调用 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;
    

    就是这样...根据您的功能调整它。

    【讨论】:

    • 这是个坏主意。我并不是说我的东西是唯一值得一看的东西,但是这个算法在你会遇到的许多边缘情况下有很多缺陷(例如非常垂直的线,或者长而略微向上)。大体和我的一样:找到线上的像素,然后检查哪一个在碰撞。我提出的算法(bresenham,但还有其他算法)只会更准确,不会出现这个很快就会显示的问题。
    • 我在 3 分钟内就完成了这件事……实际上,我正在使用这种方法来绘制线条,它给出了一个简单而良好的结果。我希望有比这更好的方法!
    • 好吧,我只能说这个效果最好。虽然它很慢,所以我会找到更快的东西......
    猜你喜欢
    • 1970-01-01
    • 2023-02-20
    • 2016-04-24
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多