知道两个CGRect的交叉点

时间:2013-06-22 19:14:31

标签: ios objective-c intersection detect cgrect

我正在编写游戏,我需要检测两个CGRect之间的交叉点。要做到这一点,我没问题。我喜欢这个:

CGRect rect1 = CGRectMake (x1, y1, a1, b1);
CGRect rect2 = CGRectMake (x2, y2, a2, b2);
if (CGRectIntersectsRect(rect1, rect2))
{
    //do some stuff...
}

所以我没问题。但是,如果有可能知道这两个CGRect的精确交点? 如果可能,怎么样?

谢谢!

2 个答案:

答案 0 :(得分:11)

使用CGRectIntersection() function获取两个相交矩形的公共部分。从该函数调用的结果中,您可以使用CGRectGet[Max|Min][X|Y]() functions计算矩形的边缘。

答案 1 :(得分:1)

我想我正在尝试做同样的事情。我想得到两个rects之间的具体重叠。我发现CGRectUnion非常有用,因为它给出了包含两个rects的最小rect。如果尺寸大于“max”,则表示rect与右侧或底部重叠。如果原点为负,则表示矩形与顶部或左侧重叠。我写了这个函数来给出纠正重叠所需的结果偏移量。

CGPoint GetOffsetBetweenFrames(CGRect maxBounds, CGRect frame)
{
    CGRect frameUnion = CGRectUnion(maxBounds, frame);

    CGPoint offset = CGPointZero;
    if (CGRectGetMinX(frameUnion) < 0)
        offset.x = -frameUnion.origin.x;
    else if (CGRectGetWidth(frameUnion) > CGRectGetWidth(maxBounds))
        offset.x = -(CGRectGetWidth(frameUnion) - CGRectGetWidth(maxBounds));

    if (CGRectGetMinY(frameUnion) < 0)
        offset.y = -frameUnion.origin.y;
    else if (CGRectGetHeight(frameUnion) > CGRectGetHeight(maxBounds))
        offset.y = -(CGRectGetHeight(frameUnion) - CGRectGetHeight(maxBounds));

    return offset;
}

哦,还快速编辑:要将偏移量应用到如下简单:

offset = GetOffsetBetweenFrames(maxBounds, frame);
frame = CGRectOffset(frame, offset.x, offset.y);