我想根据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
}
有更有效的方法吗?
答案 0 :(得分:3)
最简单的方法是,如果它们需要相距20个像素,则将您的区域划分为20 x 20格。在每个20 x 20单元格中随机放置1颗星,但跳过每隔一列和每行。所以它看起来像这样:
*-*-*-*-*
|-|-|-|-|
*-*-*-*-*
|-|-|-|-|
等。在上图中,其中*
的单元格将具有单个星形。具有-
或|
的单元格将为空。
如果您想变得更复杂,可以查看Poisson Disc。这是一种更复杂的方法,可以更优雅地实现您想要的效果。但是,它有点难以理解,并且通常可能是计算密集型的。