gpt4 book ai didi

ios - 将新的 CGPoint 值与数组中的 CGPoint 值进行比较

转载 作者:行者123 更新时间:2023-11-29 13:37:44 25 4
gpt4 key购买 nike

我正在生成一些位置随机的圆圈。我要防止的是圆圈相互重叠。所以我想将新生成的 CGPoint 值与数组中的值进行比较,如果该值位于其中一个 CGPoint 的半径区域中,则让它生成一个新值。

除了重叠的东西,我得到了大部分。我已经对我尝试过的部分进行了评论,但这并没有真正起作用(有缺陷的逻辑)。我不确定如何遍历 CGPoint 的各个值并比较它们。

更新:我对代码做了一些更改,并添加了一个检查以查看 CGPoint 是否会重叠。问题是每当我想尝试类似

while (!xPointOk || !yPointOk) {

// generate new values

}

我一直陷入无限循环。

- (void) positionCircles 
{

//generate random Y value within a range
int fromNumberY = 500;
int toNumberY = 950;
int randomNumberY =(arc4random()%(toNumberY-fromNumberY+1))+fromNumberY;

//generate random Y value within a range
int fromNumberX = 0;
int toNumberX = 700;
int randomNumberX = (arc4random()%(toNumberX-fromNumberX+1))+fromNumberX;

//array to hold all the the CGPoints
positionsArray = [[NSMutableArray alloc] init];
CGPoint circlePositionValue;

CGFloat radius = 70;

CGRect position = CGRectMake(randomNumberX,randomNumberY, radius, radius);

[self makeColors];



// create a circle for each color in color array
for (int i = 0; i < [colors count];i++)
{
// generate new position before placing new cirlce
randomNumberX = (arc4random()%(toNumberX-fromNumberX+1))+fromNumberX;
randomNumberY = (arc4random()%(toNumberY-fromNumberY+1))+fromNumberY;

circlePositionValue = CGPointMake(position.origin.x, position.origin.y);

for (NSValue *value in positionsArray) {


BOOL xPointOk = (randomNumberX < value.CGPointValue.x - radius) ||
(randomNumberX > value.CGPointValue.x + radius);

BOOL yPointOk = (randomNumberY < value.CGPointValue.y - radius) ||
(randomNumberY > value.CGPointValue.y + radius);


NSLog(@"xPoint: %i - %f", randomNumberX , value.CGPointValue.x);
NSLog(@"xPoint ok? %@", xPointOk?@"yes":@"no");

NSLog(@"yPoint: %i - %f", randomNumberY , value.CGPointValue.y);
NSLog(@"yPoint ok? %@", yPointOk?@"yes":@"no");
NSLog(@"___");

}

position.origin.x = randomNumberX;
position.origin.y = randomNumberY;
[positionsArray addObject:[NSValue valueWithCGPoint:circlePositionValue]];

Circle *myCircle = [[Circle alloc] initWithFrame:position radius:radius color:[colors objectAtIndex:i]];
myCircle.label.text = [NSString stringWithFormat:@"%i", i];
[self.view addSubview:myCircle];

}

}

最佳答案

当新点小于距任何现有点的圆周时,您的测试应该会失败,因此您可以使用基本三角来计算它。

BOOL far_enough_away = NO;
CGPoint newpoint = CGZeroPoint;
while(!far_enough_away)
{
newpoint = randomisation_thingy();
far_enough_away = YES;
for(NSValue *existing in positionsArray)
{
CGPoint pointb = [existing pointValue];
CGFloat deltay = pointb.y-newpoint.y;
CGFloat deltax = pointb.x-newpoint.x;
CGFloat distance = sqrt(pow(deltax,2) + pow(deltay,2));
//fail if closer than desired radius
if(distance < circumference )
{
//sadness - try again
far_enough_away = NO;
break;
}
}
}
create_a_new_circle_at_point(newpoint);

您需要考虑的其他事情是重试多少次以停止无限次重试。

关于ios - 将新的 CGPoint 值与数组中的 CGPoint 值进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10061722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com