[ios]多个 CGRect 的 CGRectIntersectsRect

标签: ios Objective-C
发布时间: 2017/3/21 23:21:41
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有 8 UIImageView ,具有随机放置。我为每个生成随机的 x,y pos imageView ,然后我需要检查一下如果任何的 imageViews 相交。如果他们相交,这要追溯到计算 x,y pos 随机 again(do..while 循环)。现在我知道的唯一的方法是 CGRectIntersectsRect ,它只能比较 2 CGRect 。有一种方法可以检查一下所有那些 imageViews 一次相交 (while 条件)?

这里是我已经为之奋斗 3 图像-

 do {

        xpos1 = 60 + arc4random() % (960 - 60 + 1);
        ypos1 = 147 + arc4random() % (577 - 147 + 1);



        xpos2 = 60 + arc4random() % (960 - 60 + 1);
        ypos2 = 147 + arc4random() % (577 - 147 + 1);



        xpos3 = 60 + arc4random() % (960 - 60 + 1);
        ypos3 = 147 + arc4random() % (577 - 147 + 1);

        } while (CGRectIntersectsRect(CGRectMake(xpos1, ypos1,120, 120), CGRectMake(xpos2, ypos2,120, 120)) || CGRectIntersectsRect(CGRectMake(xpos2, ypos2,120,120), CGRectMake(xpos3, ypos3, 120, 120)) || CGRectIntersectsRect(CGRectMake(xpos1, ypos1,120,120), CGRectMake(xpos3, ypos3, 120, 120)) );

    image1.center=CGPointMake(xpos1, ypos1);
    image2.center=CGPointMake(xpos2, ypos2);
    image3.center=CGPointMake(xpos3, ypos3);

解决方法 1:

一个简单的算法将开始与一个矩形,然后迭代找到新与任何以前的不相交的矩形︰

int numRects = 8;
CGFloat xmin = 60, xmax = 960, ymin = 147, ymax = 577;
CGFloat width = 120, height = 120;
CGRect rects[numRects];

for (int i = 0; i < numRects; i++) {
    bool intersects;
    do {
        // Create random rect:
        CGFloat x = xmin + arc4random_uniform(xmax - xmin + 1);
        CGFloat y = ymin + arc4random_uniform(ymax - ymin + 1);
        rects[i] = CGRectMake(x, y, width, height);

        // Check if it intersects with one of the previous rects:
        intersects = false;
        for (int j = 0; j < i; j++) {
            if (CGRectIntersectsRect(rects[i], rects[j])) {
                intersects = true;
                break;
            }
        }

    // repeat until new rect does not intersect with previous rects:
    } while (intersects);
}

这应该回答你的问题 ("如何检查带多个矩形的交集"),但是要注意,此方法并不完美。如果矩形将填充的可用空间的"大部分"和"严重"放置第一个矩形然后算法可能不终止,因为在一些点找不到可受理的矩形。

我不认为这可以发生在你的情况,但你使用的维度与可能会牢记在心。可能的解决方案是数尝试的了,如果时间太长,比从头重新开始。

而且,如果您需要创建许多矩形然后的内部循环 (检查的交集) 问题可采用排序矩形,以便少比较必须作出。

赞助商