3

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

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

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

谢谢 !

4

2 回答 2

12

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

于 2013-06-22T19:20:22.703 回答
1

我想我正在尝试做和你一样的事情。我想获得两个矩形之间的特定重叠。我发现 CGRectUnion 非常有用,因为它给出了包含两个矩形的最小矩形。如果尺寸大于您的“最大”,那么您知道矩形与右侧或底部重叠。如果原点为负,则您知道矩形与顶部或左侧重叠。我编写了这个函数来给出纠正重叠所需的偏移量。

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);
于 2014-02-04T17:09:40.060 回答