我有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);
答案 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;
}