То, что я делаю, это тестирование, чтобы увидеть, каков уровень пересечения между кругом и прямоугольником.Я хотел бы выяснить, находится ли прямоугольник полностью внутри круга, частично пересекает его, или если пересечения вообще нет.
Я прикрепил код, который придумал сегодня, простопроверяет расстояния от центра круга до углов прямоугольника, чтобы определить уровень пересечения.
Что мне интересно, есть ли более эффективный способ сделать это?
РЕДАКТИРОВАТЬ: Вот мой обновленный, рабочий код.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;
}