交叉算法

时间:2010-12-04 16:46:58

标签: geometry intersection intersect

我在CSharp项目中有两个对象,它们呈现矩形。现在我想计算一个物体是否与另一个物体相交。物体无法旋转。

我有以下方法:

getX();
getY();
getWidth();
getHeight();

1 个答案:

答案 0 :(得分:2)

虽然 在技术上与其他问题重复,但我建议提供比在那里发布的更优雅的解决方案。

我看待它的方式是从边界框的角度来看。如果边界框比高度和皮肤的总和短于宽度之和,它们必须相交:

// assume we have a class with a constructor like so...
class Rect
{
    ...
    void Rect(int top, int left, int bottom, int right) { ... }
    ...
}

...

private Rect GetBoundingRect(Rect r1, Rect r2)
{
    int left = min(r1.getX(), r2.getX());
    int right = max(r1.getX()+r1.getWidth(), r2.getX()+r2.getWidth());
    int top = min(r1.getY(), r2.getY());
    int bottom = max(r1.getY()+r1.getHeight(), r2.getY()+r2.getHeight());
    return new Rect( top, left, bottom, right );
}

private bool CheckIfIntersect(Rect r1, Rect r2)
{
    Rect bound = GetBoundingRect(r1,r2);
    return (bound.getWidth() < r1.getWidth() + r2.getWidth()) &&
           (bound.getHeight() < r1.getHeight() + r2.getHeight());
}