【问题标题】:Performant intersection algorithm for Bounding Box with a Line Segment emanating from its center point具有从其中心点发出的线段的边界框的高性能相交算法
【发布时间】:2013-05-16 17:42:35
【问题描述】:

对于 stackoverflow 上列出的类似问题,有许多贴近、有用的答案,但是我还没有找到任何与我的特定情况相匹配的答案。

我需要一种性能高效的算法来计算边界框与从其中心点发出的线段的交点。每个边界框可能有多个线段发射。

根据我的问题的定义,每个线段将与边界框边缘段的一个(除了 4 个点之外,只有一个)相交。

这是一个插图。

我想快速且“廉价”地进行计算:

  1. 线段与哪个边界框边缘相交?

  2. 边和线段的交点是什么?

谢谢。

【问题讨论】:

  • 我假设你已经知道了线的起点和终点以及边界框的大小?你目前使用什么算法,速度太慢了?
  • 为什么不开始计算两条线的交点,这是你在学校学过的。

标签: performance algorithm graphics geometry 2d


【解决方案1】:

令 C 为边界框的中心,P 为线段的另一个端点。令 V = (Vx, Vy) = P - C 为从 C 指向 P 的向量。

让边界框的高度 = 2 * H 和宽度 = 2 * W。W 和 H 是正常高度和宽度的一半,这将使下面的计算更简单。

想法如下:考虑 V 位于第一象限的情况,因此 Vx > 0 且 Vy > 0。然后该线段与顶部或右侧相交。我们可以通过比较 V 的斜率和从盒子中心到右上角的线段的斜率来判断是哪一个。如果斜率较大,则与顶部相交,否则与侧面相交。

因此,如果 V 在第一象限,并且如果 Vy / Vx > H / W,则该段与顶部相交。如果 Vy / Vx

一旦你知道它与哪一边相交,你就可以使用相似的三角形来找出相交点。如果它在 I = (Ix, H) 点与顶部相交,则 Vx / Vy = Ix / H 或 Ix = H * Vx / Vy。如果它在 I = (W, Iy) 点与边相交,则 Vy / Vx = Iy / W 或 Iy = W * Vy / Vx。

同样的方法也适用于其他象限;您只需要跟踪 Vx 和 Vy 的迹象。您可以通过断言返回值满足 sign(Ix) == sign(Vx) 和 sign(Iy) == sign(Vy) 让您的生活更轻松。

还要注意,如果你小心使用符号,你可以避免除法:假设 Vx > 0,Vy / Vx > H / W 等价于 Vy * W > Vx * H。

【讨论】:

    【解决方案2】:

    假设您有一个以 (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
      }
    }
    

    【讨论】:

    • (第一行代码缺少右括号)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 2022-11-12
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多