2012-04-08 2 views
1

Я создаю несколько кругов со случайными позициями. то, что я хочу предотвратить, - это круги, перекрывающиеся друг с другом. поэтому я хочу сравнить вновь созданное значение CGPoint с теми, которые находятся в массиве, и заставить его генерировать новое значение, если значение находится в области радиуса одного из CGPoints.сравнить новое значение CGPoint с значением CGPoint в массиве

Я получил большую часть этого, за исключением перекрывающейся вещи. Я прокомментировал часть из того, что я пробовал, но на самом деле это не работает (ошибочная логика). Я не уверен, как перебирать отдельные значения CGPoint и сравнивать их.

UPDATE: Я изменить код немного больше и добавил проверку, чтобы увидеть, будет ли 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? %@", [email protected]"yes":@"no"); 

      NSLog(@"yPoint: %i - %f", randomNumberY , value.CGPointValue.y); 
      NSLog(@"yPoint ok? %@", [email protected]"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]; 

    } 

} 

ответ

1

Ваш тест должен терпеть неудачу, когда новая точка меньше, чем окружность от любого из существующих точек, так что вы можете использовать основные тригли работать его.

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

Другие вопросы, которые необходимо учитывать, - это сколько раз повторять попытку, чтобы остановить бесконечное количество попыток.

+0

привет, я попытался включить ваш код в мой. но я, похоже, не работал. Хотя я понимаю, что ваш путь определенно более эффективен. я смогу заставить его работать без использования триггера? –

+0

Это псевдокод. Не просто копировать/вставлять. Адаптируйте то, что вы видите там, в свою программу. И нет, вам нужно будет использовать базовую тригонометрию для решения этой проблемы. –

+0

Да, теперь я работаю. благодаря! хотя мне нужно изучить некоторые основные тригг :) –

Смежные вопросы