2017-11-04 3 views
1

Ich möchte Sterne gleichmäßig streuen, um einen Hintergrund des nächtlichen Himmels in einer UIView darzustellen, basierend auf der Breite und Höhe der UIView. Jeder Stern muss mindestens 20 Pixel voneinander entfernt sein.Wie kann ich Punkte gleichmäßig verteilen, ohne sich zu überlappen?

Ich habe Folgendes versucht, um die X- und Y-Punkte zu generieren, aber es ist sehr ineffizient und endet mit dem Einfrieren der App, weil zu oft die zufällig generierten Zahlen denen im bestehenden Array zu ähnlich sind, so dass es unendlich wiederholt .

func generateRandomNumber(maxValue: UInt32, uniquePoints: Set<Int>) -> Int { 
    let randomNumber = Int(arc4random_uniform(maxValue)) 

    for point in uniquePoints { 
     if(abs(randomNumber - point) < 20) { 
      return generateRandomNumber(maxValue, uniquePoints) 
     } 
    } 

    return randomNumber 
} 

Gibt es eine effizientere Möglichkeit, dies zu tun?

+0

[Generierung von zufälligen Punkten mit definierten Min- und Max-Distanzen] (https://stackoverflow.com/questions/8930796/generative-random-points-with-defined-minimum-and-maximum- distance) | [Wählen Sie zufällige Punkte innerhalb des Gitternetzes, um die Mindest-/Höchstdistanzanforderungen zu erfüllen] (https://gamedev.stackexchange.com/questions/96586/how-to-select-random-points-within-grid-meeting-min-max-distance- Anforderungen-fr) –

Antwort

3

Der einfachste Weg, wenn sie 20 Pixel voneinander entfernt sein müssen, ist Ihre Fläche in 20 x 20 Quadrate zu teilen. Fügen Sie nach dem Zufallsprinzip 1 Stern in jede 20 x 20 Zelle ein, überspringen Sie jedoch jede zweite Spalte und Zeile. So würde es so aussehen:

*-*-*-*-* 
|-|-|-|-| 
*-*-*-*-* 
|-|-|-|-| 

usw. In der obigen Abbildung, Zellen mit einem * in ihnen einen einzigen Stern hätten. Zellen mit entweder - oder | wären leer. Wenn Sie komplizierter werden möchten, können Sie Poisson Disc nachschlagen. Dies ist eine kompliziertere Methode, die das erreicht, was Sie eleganter erreichen möchten. Es ist jedoch etwas schwieriger zu verstehen und kann oft rechenintensiv sein.

Verwandte Themen