用于查找约束到其父级的矩形的算法

时间:2011-01-01 01:07:26

标签: c++ clipping

基本上我想要做的就是这里说明的: alt text

我从A和B开始,然后B符合A以创建C。

这个想法是,给定TLBR矩形A,B,make C

我还需要知道它是否产生一个空矩形(A在案例之外的B)。

我尝试了这个,但它没有做我想要的事情:

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 个答案:

答案 0 :(得分:3)

在最终条件中,您似乎错误地检查交叉矩形是否为空。

您检查L < R && B < T,但似乎空矩形的条件应为:

L > R || B < T

顺便说一句,您可以使用MinMax函数使代码更简单易读。你有很多这种模式:

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

可以简单地写成

a = Min(x, y);

修改

另一个错误是你采取最大底部和最小顶部。您应该采用最小底部和最大顶部。 (假设矩形对应于屏幕坐标,其中顶部实际上具有较低的 y 值。

答案 1 :(得分:1)

逻辑上,这是两个不同的问题。我先写一个 is_intersected()函数,返回一个合适的布尔值。

如果rects相交,我会执行类似于以下伪代码的剪辑操作:

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);