如何确定两个矩形在哪一侧相交?

时间:2019-06-11 13:01:20

标签: c# .net winforms

我正在尝试实现一个函数,该函数检测两个矩形是否相交,即它们是否在不使用Rectangle.IntersectsWith函数的情况下“接触”。 这样做的原因是因为我想确定与“英雄”对象发生碰撞的那一侧,但这是行不通的。

public bool[] Collisions(Rectangle hero, Rectangle rect)
{
    bool hitSomethingAbove = false;
    bool hitSomethingBelow = false;
    bool hitSomethingOnTheRight = false;
    bool hitSomethingOnTheLeft = false;

    if (hero.Left < rect.Right) // collision on left side
    {
       hitSomethingOnTheLeft = true;
    }
    if (hero.Right > rect.Left) // collision on right side
    {
       hitSomethingOnTheRight = true;
    }
    if (hero.Top < rect.Bottom) // collision on top
    {
       hitSomethingAbove = true;
    }
    if (hero.Bottom > rect.Top) // collision on bottom
    {
       hitSomethingBelow = true;
    }

    return new bool[] { hitSomethingAbove, hitSomethingBelow, 
        hitSomethingOnTheRight, hitSomethingOnTheLeft };
}

2 个答案:

答案 0 :(得分:0)

您的代码有一个问题,就是所有测试都假定英雄已经相对于另一个矩形处于某个位置。例如:

if (hero.Left < rect.Right) // collision on left side

假设英雄在此检查之前已经在另一个矩形的右边。如果英雄已经在另一个矩形的左侧,则您的测试现在声称该矩形的右侧发生了碰撞(即,根据您的代码注释,英雄的左侧发生了碰撞)。

所以您的逻辑在这里被破坏了。

答案 1 :(得分:0)

我建议使用Rectangle.Intersect方法:

public bool[] Collisions(Rectangle hero, Rectangle rect)
{
    var intersection = Rectangle.Intersect(hero, rect);
    if(intersection.IsEmpty){
        return new []{ false, false, false, false };
    }

    bool hitSomethingAbove = hero.Top == intersection.Top;
    bool hitSomethingBelow = hero.Bottom == intersection.Bottom;
    bool hitSomethingOnTheRight = hero.Right == intersection.Right;
    bool hitSomethingOnTheLeft = hero.Left == intersection.Left;

    return new bool[] 
    { 
        hitSomethingAbove, 
        hitSomethingBelow, 
        hitSomethingOnTheRight, 
        hitSomethingOnTheLeft, 
    };
}