了解如何找到两个CGRect的交点

4
我是一个编程游戏的程序员,需要检测两个CGRect之间的交叉。我做如下操作:
```objective-c CGRectIntersectsRect(rect1, rect2); ```
这里没有问题。
CGRect rect1 = CGRectMake (x1, y1, a1, b1);
CGRect rect2 = CGRectMake (x2, y2, a2, b2);
if (CGRectIntersectsRect(rect1, rect2))
{
    //do some stuff...
}

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

谢谢!


“点的交汇”具体指什么?正如@H2CO3在评论中所指出的那样,您将有_两个_交点。我将让更加数学思维严谨的人决定是否可以说两个只有一个公共点的矩形相交。 - Monolo
我考虑从两个CGRect中获取一个近似的交点。 - user2057209
1
正如您所知,数字计算机不倾向于执行任何“近似”的操作,因此您需要更加具体。对我来说,这听起来像是您需要一个全新的问题,而不是在这个问题上堆叠一个新的规格。 - Monolo
我知道计算机中没有近似值,但是为了用户体验,计算机语言中的精度可能是近似的。在速度方面,您无法看到交点是否高达两个像素。这就是我所说的近似值。 - user2057209
2个回答

12

例如,我可以使用CGRectIntersectsRect()函数检测交集,然后使用CGRectIntersection()函数获取矩形。例如,我可以将返回矩形的原点作为一个点,对吗? - user2057209
@user2057209 是的,但要注意两个原始矩形的相对位置。在交集的4个点中,只有两个是实际的交点。 - user529758
返回值: 一个矩形,表示两个指定矩形的交集。那么我只有一个矩形可以处理,是吗? - user2057209
1
@user2057209 那个矩形有4个角落,只有其中2个是实际的交点。(在纸上画一下就明白了。) - user529758
啊,好的,我在考虑使用新矩形的起点来获取一个近似的交点。 - user2057209

1
我想我正在尝试做和你一样的事情。我想获取两个矩形之间的重叠部分。我发现CGRectUnion非常有用,因为它给出了包含两个矩形的最小矩形。如果大小大于您的“max”,则知道矩形重叠到右侧或底部。如果原点是负数,则知道矩形重叠到顶部或左侧。我编写了这个函数来给出所需的偏移量以纠正重叠。
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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接