对stackoverflow上列出的类似问题有许多接近,有用的答案,但我还没有发现任何符合我特定情况的问题。
我需要一种性能有效的算法来计算边界框与从其中心点发出的线段的交集。每个边界框可能有多个线段发射。
根据我的问题的定义,每个线段将与一个边界框边缘线段的一个(除了仅4个点除外)相交。
这是一个例子。
我想快速,计算地“廉价”地计算:
线段与哪个边界框边缘相交?
边缘和线段相交的点是什么?
感谢。
答案 0 :(得分:0)
设C为边界框的中心,P为该网段的另一个端点。设V =(Vx,Vy)= P-C是从C指向P的向量。
让边界框的高度= 2 * H,宽度= 2 * W.W和H是正常高度和宽度的一半,这将使计算更简单。
这是一个想法:考虑V在第一象限中的情况,因此Vx> 0和Vy>然后,该段与顶侧或右侧相交。我们可以通过比较V的斜率和从盒子中心到右上角的片段的斜率来判断哪一个。如果斜率较大,则它与顶部相交,否则它与侧面相交。
因此,如果V在第一象限,并且如果Vy / Vx> H / W段与顶部相交。如果Vy / Vx < H / W,它与侧面相交。如果它们相等,则它与角落相交。
一旦知道它与哪一侧相交,就可以使用类似的三角形来确定交点。如果它在点I =(Ix,H)处与顶部相交,则Vx / Vy = Ix / H或Ix = H * Vx / Vy。如果它与I =(W,Iy)处的边相交,那么Vy / Vx = Iy / W或Iy = W * Vy / Vx。
相同的方法适用于其他象限;你只需要跟踪Vx和Vy的迹象。通过声明返回值满足符号(Ix)==符号(Vx)和符号(Iy)==符号(Vy),可以使您的生活更轻松。
另请注意,如果您对标志小心,可以避免分裂:Vy / Vx&gt; H / W相当于Vy * W&gt; Vx * H,假设Vx> 0
答案 1 :(得分:0)
假设您有一个以(0,0)为中心的方框,边长为2。 假设你有一个从盒子中心辐射的矢量(dx,dy)。 然后计算(xp,yp)光线与边缘相交的点。
它执行两个fabs
,两个比较,一个分区和两个分配。
然后你只需要翻译并缩放到你的特定方格。
if (fabs(dx) > fabs(dy)){
if (dx > 0){
xp = 1; // right side
yp = dy/dx;
} else {
xp = -1; // left side
yp = -dy/dx
}
} else {
if (dy > 0){
yp = 1; // top side
xp = dx/dy;
} else {
yp = -1; // bottom side
xp = -dx/dy
}
}