繁体   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