我有2d地图,我想检查线是否与任何元素发生碰撞。我需要一个函数,可以告诉我线是否与路上的任何对象相交。
看看:
红线不正确(函数应该返回false),绿色是(返回true)。 我的碰撞图是布尔图,其中1表示墙,0表示空格。
怎么样?我已经读过,我需要检查线是否与任何墙相交,但我完全不知道如何在2d地图上执行此操作。
任何回复的Thanx。
答案 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)
所以,我想象你的细胞是正方形......让我们说它们是单位正方形。所以,如果我有任何坐标,对于像浮点数或双打点这样的点,它们都在单元格中。
要从一个端点走到另一个端点,您需要计算每个轴的增量(调用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;
就是这样......让它适应你的功能。