Алгоритм, который определяет отношения между квадратом и прямоугольником - PullRequest
3 голосов
/ 05 февраля 2011

Мне нужно найти алгоритм, который определяет отношения между квадратом и прямоугольником. Он должен быть в состоянии определить, если:

  • Квадрат полностью внутри прямоугольника
  • Квадрат частично внутри (перекрывает) прямоугольник
  • Угол квадрата касается только угла прямоугольника
  • Край квадрата находится на краю прямоугольника

А вот входные данные (данные значения), которые помогут нам извлечь математическую формулу для каждого случая:

  • х координата центра квадрата = квадратX
  • y координата центра квадрата = квадратY
  • ширина квадрата = квадратW
  • x координата центра прямоугольника = recX
  • y координата центра прямоугольника = recY
  • ширина прямоугольника = recW
  • длина прямоугольника = recL

P.S: Размеры прямоугольника всегда больше ширины квадрата.

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

Edit:

Для случая касания углов, вот код, который я написал, и он работает (Math.abs означает абсолютное значение):

((Math.abs(Math.abs(recX-squareX)-(recW+squareW)/2))<=0.001) && ((Math.abs(Math.abs(recY-squareY)-(recL+squareW)/2))<=0.001)

Ответы [ 2 ]

2 голосов
/ 05 февраля 2011

обновлено для парных чисел

double dx = Math.abs(rectX - squareX);
double dy = Math.abs(rectY - squarey);
double dw2 = (rectW + squareW) / 2;
double dh2 = (rectL + squareW) / 2;

if (Double.compare(dx, dw2) == 0 && Double.compare(dy, dh2) == 0)
    return CORNER_TOUCH;
else if (Double.compare(dx, dw2) > 0 || Double.compare(dy, dh2) > 0)
    return OUTSIDE;
else if (Double.compare(dx, dw2) == 0 || Double.compare(dy, dh2) == 0)
    return EDGE_TOUCH;
else if (Double.compare(dx, rectW - dw2) <= 0 &&
        Double.compare(dy, rectL - dh2) <= 0)
    return INSIDE;
else 
    return OVERLAPS;
1 голос
/ 05 февраля 2011
squareX1 = squareX - squareW/2
squareY1 = squareY - squareW/2
squareX2 = squareX + squareW/2
squareY2 = squareY + squareW/2

recX1 = recX - recW/2
recY1 = recY - recL/2
recX2 = recX + recW/2
recY2 = recY + recL/2

inside = squareX1 > recX1 && squareX2 < recX2 && squareY1 > recY1 && squareY2 < recY2
overlaps = squareX1 < recX2 && squareX2 > recX1 && squareY1 < recY2 && squareY2 > recY1

последние два должны быть тривиальными

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...