我知道有很多关于碰撞检测的帖子,通常是针对在 2D 平面上移动的精灵,但我的问题略有不同。
我正在将圆圈插入 2D 平面。这些圆具有可变半径。我正在尝试优化我在平面内找到一个随机位置的方法,我可以在其中插入一个新圆圈,而不会与飞机上已经存在的任何其他圆圈发生碰撞。现在我正在使用一种非常“未优化”的方法,它只是在平面内生成一个随机点,然后将其与平面上的所有其他圆圈进行检查。
有没有办法优化这个?对于这个特定的应用程序,平面的边界一次只能容纳 20-25 个圆圈,通常存在 5-10 个。如您所料,当圆圈数接近可以容纳的最大值时,您必须测试许多点才能找到一个有效的点。它变得非常缓慢。
注意:safeDistance 是我要添加到平面的圆的半径。
这是代码:
- (CGPoint)getSafePosition:(float)safeDistance {
// Point must be far enough from edges
// Point must be far enough from other sprites
CGPoint thePoint;
BOOL pointIsSafe = NO;
int sd = ceil(safeDistance);
while(!pointIsSafe) {
self.pointsTested++; // DEBUG
// generate a random point inside the plane boundaries to test
thePoint = CGPointMake((arc4random() % ((int)self.manager.gameView.frame.size.width - sd*2)) + sd,
(arc4random() % ((int)self.manager.gameView.frame.size.height - sd*2)) + sd);
if(self.manager.gameView.sprites.count > 0) {
for(BasicSprite *theSprite in self.manager.gameView.sprites) {
// get distance between test point and the sprite position
float distance = [BasicSprite distanceBetweenPoints:thePoint b:theSprite.position];
// check if distance is less than the sum of the min safe distances of the two entities
if(distance < (safeDistance + [theSprite minSafeDistance])) {
// point not safe
pointIsSafe = NO;
break;
}
// if we get here, the point did not collide with the last tested point
pointIsSafe = YES;
}
}
else {
pointIsSafe = YES;
}
}
return thePoint;
}