簡體   English   中英

如何均勻分散點而不相互重疊?

[英]How can I evenly scatter points without overlapping each other?

我想基於UIView的寬度和高度,均勻地散射星星來代表UIView中的夜空背景。 每顆恆星必須至少相隔20個像素。

我嘗試了以下方法來生成X和Y點,但效率非常低並最終凍結了應用程序,因為隨機生成的數字太頻繁地與現有數組中的數字太相似,導致它無限循環。

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
}

有沒有更有效的方法來做到這一點?

最簡單的方法是,如果它們需要相隔20個像素,則將您的區域划分為20 x 20格。 在每個20 x 20單元格中隨機放置1顆星,但跳過每隔一列和每行。 所以它看起來像這樣:

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

在上圖中,其中帶有*單元格將具有單個星形。 與無論是細胞-還是| 會是空的。

如果你想變得更復雜,你可以查找Poisson Disc 這是一種更復雜的方法,可以更優雅地實現您想要的效果。 但是,它有點難以理解,並且通常可能是計算密集型的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM