2D тесты пересечения окружности и прямоугольника - PullRequest
2 голосов
/ 26 сентября 2011

То, что я делаю, это тестирование, чтобы увидеть, каков уровень пересечения между кругом и прямоугольником.Я хотел бы выяснить, находится ли прямоугольник полностью внутри круга, частично пересекает его, или если пересечения вообще нет.

Я прикрепил код, который придумал сегодня, простопроверяет расстояния от центра круга до углов прямоугольника, чтобы определить уровень пересечения.

Что мне интересно, есть ли более эффективный способ сделать это?

РЕДАКТИРОВАТЬ: Вот мой обновленный, рабочий код.fullIntersect - мой собственный, я нашел фрагмент частичноIntersect на Обнаружение столкновений окружности и прямоугольника (пересечение) .Я собираюсь оставить это открытым, так как мне все еще интересно, есть ли лучший способ сделать это.

    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 Ответ

4 голосов
/ 26 сентября 2011

Я думаю, что ваш код не учитывает эти пересечения:

enter image description here

Я удалю этот ответ, как только вы улучшите свой код / ​​вопрос.

...