【问题标题】:Find edge that a rectangle is touching on another rectangle查找一个矩形与另一个矩形接触的边
【发布时间】:2010-10-09 00:38:56
【问题描述】:

给定一个边缘枚举,例如:

none, top, left, bottom, right,

给定 2 个矩形,我如何找到矩形 A 的哪条边与矩形 B 相交?我不需要知道 B 的哪条边撞到了 A 的边,我只需要知道 B 撞到了 A 的哪条边。

我找到了这个算法,但它没有返回特定的边:

bool edgeIntersection( vector2f a, vector2f b, DOUBLEPOINT c, DOUBLEPOINT d )
{
    //one edge is a-b, the other is c-d
    vector2f bminusa;
    vector2f cminusa;
    vector2f cminusd;

    bminusa.x = b.x - a.x;
    bminusa.y = b.y - a.y;

    cminusa.x = c.point[0] - a.x;
    cminusa.y = c.point[1] - a.y;

    cminusd.x = c.point[0] - d.point[0];
    cminusd.y = c.point[1] - d.point[1];

    double det=determinant(bminusa,cminusd);
    double t=determinant(cminusa,cminusd)/det;
    double u=determinant(bminusa,cminusa)/det;
    if ((t<0)||(u<0)||(t>1)||(u>1))return false;
    return true;
}

我上面的算法一一检查每条边,给定 TopLeftA TopLeftB BottomRightA BottomRightB,我怎么做一个只需要调用一次的函数?

谢谢

【问题讨论】:

  • 如果交叉点超过一条边怎么办?
  • @Oli Charlesworth 然后返回找到的第一个边,因为我会尽量确保 area(a) > area(b) 这不应该经常发生
  • 我正在制作一个 GUI API,需要知道鼠标是否触摸到边缘以调整大小
  • 我没有费心去理解那个算法是如何工作的,但是如果它需要做除法,那么你应该避免它。
  • 好吧,这是什么病,取而代之的是 rect a 并制作 4 个矩形条,然后在 rect 中进行点测试,尽管如此,谢谢

标签: c++ algorithm


【解决方案1】:

假设您已使用edgeIntersection 确定已发生交叉点,则:

if (b.x < a.x) return left;
if (b.y < a.y) return top;
if (b.x+b.width > a.x+a.width) return right;
return bottom;

【讨论】:

  • 我上面的算法一个接一个地检查每个边,给定 TopLeftA TopLeftB BottomRightA BottomRightB,我怎么能做一个只需要调用一次的函数?
  • @Milo 有一个函数调用所有 4 个函数,并返回第一个成功的函数。
  • 是的但是4 * 4 = 16次,上面的函数需要调用16次,有没有办法减少这个?
猜你喜欢
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
相关资源
最近更新 更多