如何均匀分散点而不相互重叠?

时间:2017-11-04 15:39:35

标签: ios swift algorithm geometry

我想根据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
}

有更有效的方法吗?

1 个答案:

答案 0 :(得分:3)

最简单的方法是,如果它们需要相距20个像素,则将您的区域划分为20 x 20格。在每个20 x 20单元格中随机放置1颗星,但跳过每隔一列和每行。所以它看起来像这样:

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

等。在上图中,其中*的单元格将具有单个星形。具有-|的单元格将为空。

如果您想变得更复杂,可以查看Poisson Disc。这是一种更复杂的方法,可以更优雅地实现您想要的效果。但是,它有点难以理解,并且通常可能是计算密集型的。