CGRectIntersectsRect用于多个CGRect

时间:2014-03-21 08:22:21

标签: ios objective-c

我有8 UIImageView,必须随机放置。我为每个imageView生成一个随机的x,y pos,然后我需要检查imageViews是否有任何交叉。如果它们相交,则会再次计算随机x,y pos(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);

2 个答案:

答案 0 :(得分:2)

一个简单的算法是从一个矩形开始,然后迭代地找到新的矩形 不与之前的任何一个相交:

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);
}

这应该回答你的问题(&#34;如何检查多个矩形的交叉点&#34;), 但请注意,这种方法并不完美。如果矩形会填充多少&#34;的 可用空间和第一个矩形被放置&#34;严重&#34;然后算法可能不会 终止,因为它在某些时候找不到允许的矩形。

我不认为您的案例中使用的维度会发生这种情况,但您可能会这样做 心里。一个可能的解决方案可能是计算所做的尝试次数,以及是否 这比从头开始需要的时间太长了。

此外,如果你必须创建许多矩形,那么内部循环(检查 ()可以通过对矩形进行排序来改进,以便进行较少的比较 做成。

答案 1 :(得分:0)

假设您已生成点

 CGFloat x = (CGFloat) (arc4random() % (int) self.view.bounds.size.width);
CGFloat y = (CGFloat) (arc4random() % (int) self.view.bounds.size.height);
CGPoint point=CGPointMake(x, y);
while ([self checkPointExist:point]) {
     x = (CGFloat) (arc4random() % (int) self.view.bounds.size.width);
    y = (CGFloat) (arc4random() % (int) self.view.bounds.size.height);
    point=CGPointMake(x, y);

}

-(BOOL)checkPointExist:(CGPoint)point{
for(UIView *aView in [self.view subviews])
{
    if(CGRectContainsPoint(aView.frame, point))
    {
        return TRUE;//    There is already imageview. generate another point
    }
}
return FALSE;

}