2012-04-08 10 views
1

Ich erstelle eine Anzahl von Kreisen mit zufälligen Positionen. was ich verhindern will, ist, dass sich die Kreise überlappen. Daher möchte ich den neu generierten CGPoint-Wert mit denen im Array vergleichen und einen neuen Wert generieren lassen, wenn der Wert sich im Radiusbereich eines der CGPoints befindet.Vergleichen Sie den neuen CGPoint-Wert mit einem CGPoint-Wert in Array

Ich habe das meiste davon mit Ausnahme der überlappenden Sache. Ich habe den Teil von etwas, das ich ausprobiert habe, kommentiert, aber das funktioniert nicht wirklich (fehlerhafte Logik). Ich bin mir nicht sicher, wie ich die einzelnen Werte des CGPoint durchlaufen und vergleichen soll.

UPDATE: Ich habe den Code ein wenig mehr geändert und hinzugefügt, um zu sehen, ob der CGPoint überlappt oder nicht. Problem ist, wenn ich etwas versuchen möchte wie

while (!xPointOk || !yPointOk) { 

// generate new values 

} 

Ich falle weiter in eine Endlosschleife.

- (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]; 

    } 

} 

Antwort

1

Ihr Test sollte fehlschlagen, wenn der neue Punkt ist kleiner als der Umfang entfernt von einem der vorhandenen Punkte, damit Sie es grundlegende trig erarbeiten können.

Andere Dinge, die Sie berücksichtigen müssen, sind wie oft Sie versuchen, eine unendliche Anzahl von Wiederholungen zu stoppen.

+0

Hallo, ich habe versucht, Ihren Code in meine zu integrieren. aber ich schien es nicht funktionieren zu lassen. Während ich verstehe, ist Ihr Weg definitiv viel effizienter. Könnte ich es ohne trig benutzen? –

+0

Es ist Pseudocode. Nicht nur kopieren/einfügen. Passen Sie das, was Sie dort sehen, an Ihr Programm an. Und nein, Sie müssen grundlegende Trigonometrie verwenden, um dieses Problem zu lösen. –

+0

Ja, ich habe es jetzt funktioniert. Vielen Dank! obwohl ich einige grundlegende trig lernen muss :) –

Verwandte Themen