3

基本上我想要做的在这里说明: 替代文字

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

这个想法是,给定 TLBR 矩形 A,B,使 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);
}

谢谢

4

2 回答 2

3

在检查相交矩形是否为空的最终条件中,您似乎有一个错误。

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

L > R || B < T.

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

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

可以简单地写成

a = Min(x, y);

编辑

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

于 2011-01-01T01:14:44.113 回答
1

从逻辑上讲,这是两个不同的问题。我会首先编写一个返回适当布尔值的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);
于 2011-01-01T01:41:25.463 回答