Алгоритм нахождения прямоугольника, ограниченного его родителем - PullRequest
3 голосов
/ 01 января 2011

В основном то, что я хочу сделать, проиллюстрировано здесь: alt text

Я начинаю с A и B, затем B соответствует A для создания C.

Идея заключается вПрямоугольники TLBR A, B, делают C

Мне также нужно знать, создает ли он пустой прямоугольник (B вне случая A).

Я пробовал это, но он просто не делаетЯ хочу:

if(clipRect.getLeft() > rect.getLeft())
    L = clipRect.getLeft();
else
    L = rect.getLeft();

if(clipRect.getRight() < rect.getRight())
    R = clipRect.getRight();
else
    R = rect.getRight();

if(clipRect.getBottom() > rect.getBottom())
    B = clipRect.getBottom();
else
    B = rect.getBottom();

if(clipRect.getTop() < rect.getTop())
    T = clipRect.getTop();
else
    T = rect.getTop();

if(L < R && B < T)
{
    clipRect = AguiRectangle(0,0,0,0);
}
else
{
    clipRect = AguiRectangle::fromTLBR(T,L,B,R);
}

Спасибо

Ответы [ 2 ]

3 голосов
/ 01 января 2011

Вы, похоже, ошиблись в конечном условии, проверяя, является ли прямоугольник пересечения пустым.

Вы проверяете L < R && B < T, но похоже, что условие для пустого прямоугольника должно быть:

L > R || B < T.

Кстати, вы можете сделать свой код немного проще и легче читать, используя функции Min и Max. У вас много этого паттерна:

if (x < y)
    a = x;
else
    a = y;

Который можно записать просто как

a = Min(x, y);

Редактировать

Другая ошибка в том, что вы берете максимальное дно и минимальное дно. Вы должны взять минимальное и максимальное дно. (Предполагая, что прямоугольники соответствуют координатам экрана, где верх фактически имеет более низкие значения y .

1 голос
/ 01 января 2011

По логике, это две разные проблемы. Сначала я написал бы функцию is_intersected () , возвращающую соответствующее логическое значение.

Если канавки пересекаются, я бы затем выполнил операцию клипа, похожую на следующий псевдокод:

C.left.x = max(A.left.x, B.left.x);
C.right.x = min(A.right.x, B.right.x);

C.left.y = max(A.left.y, B.left.y);
C.right.y = min(A.right.y, B.right.y);
...