2011-02-05 2 views
3

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

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

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

  • х координата центра квадрата = squareX
  • у координаты центра квадрата = squareY
  • ширина площади = squareW
  • х координата центра прямоугольника = recX
  • координату центра прямоугольника = 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

Пожалуйста, разместите код, который вы написали. Люди обычно не любят просто писать свой код для вас. Как бы то ни было, это описание работы, а не вопрос. –

+0

Как точно определены x и y (левый верхний угол, центр, ...)? – lweller

+0

Вы даже попытались решить эту проблему? – ash

ответ

2

обновлено для парных разрядов

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; 
+0

Просто из того факта, что у вас есть инструкция else, которая возвращает OVERLAPS, указывает мне, что это решение неверно ... – Falmarri

+0

Благодарим за ответ. Все работает отлично, за исключением краев и углов. – Dave

+0

@Falmarri, Нет, это просто указывает на то, что вы еще не прочитали решение –

1
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 

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

+0

Это тоже обрабатывает отрицательные координаты? Где мы должны добавить абсолютную ценность? – Dave

+0

это работает как для отрицательных координат тоже – lweller

Смежные вопросы