2D圆形和矩形相交测试

时间:2011-09-25 21:19:59

标签: geometry collision-detection

我正在做的是测试圆形和矩形之间的交叉水平。我想知道矩形是否完全在圆内,部分相交,或者根本没有交叉。

我附上了今天我提出的代码,它只是检查从圆心到矩形角的距离,以确定交叉水平。

我想知道有更有效的方法吗?

修改 这是我更新的工作代码。 fullIntersect是我自己的,我在Circle-Rectangle collision detection (intersection)找到了partialIntersect片段。我打算把它打开,因为我仍然很好奇是否有更好的方法来做到这一点。

    public boolean fullIntersect(float circleX, float circleY, float radius)
    {
        float radsq = radius * radius;
        double xsq = Math.pow(circleX - xPosition, 2);
        double xpwsq = Math.pow(circleX - (xPosition + width), 2);
        double ysq = Math.pow(circleY - yPosition, 2);
        double yphsq = Math.pow(circleY - (yPosition + height), 2);

        if(xsq + ysq > radsq || xsq + yphsq > radsq || xpwsq + yphsq > radsq || xpwsq + ysq > radsq)
            return false;

        return true;

        /* this is what the one if statement does
        double disBotLeft = xsq + ysq;
        double disTopLeft = xsq + yphsq;
        double disTopRight = xpwsq + yphsq;
        double disBotRight = xpwsq + ysq;

        if(disBotRight > radsq) return false;
        if(disBotLeft > radsq) return false;
        if(disTopLeft > radsq) return false;
        if(disTopRight > radsq) return false;

        return true;
        */
    }

    public int intersects(float circleX, float circleY, float radius)
    {
        if(!enabled) return 0;
        double wo2 = width / 2.0d;
        double ho2 = height / 2.0d;

        double circleDistanceX = Math.abs(circleX - xPosition - wo2);
        double circleDistanceY = Math.abs(circleY - yPosition - ho2);

        if (circleDistanceX > (wo2 + radius)) { return 0; }
        if (circleDistanceY > (ho2 + radius)) { return 0; }

        if(fullIntersect(circleX, circleY, radius)) { return 2; }

        if (circleDistanceX <= (wo2)) { return 1; } 
        if (circleDistanceY <= (ho2)) { return 1; }

        double cornerDistance_sq = Math.pow(circleDistanceX - wo2,2) +
                             Math.pow(circleDistanceY - ho2,2);

        return cornerDistance_sq <= (radius*radius) ? 1 : 0;
    }

1 个答案:

答案 0 :(得分:4)

我认为您的代码不考虑这些交叉点:

enter image description here

一旦您增强了代码/问题,我就会删除此答案。