作者:光影帽子
链接:https://www.zhihu.com/question/276554643/answer/1039095847
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
泊松盘采样(possion disk sampling)的特点是任何两个点的距离都不会隔得太近。
比如下图,左边是随机生成的点,右边是泊松盘采样生成的点。
算法步骤:
第一步:设定好两个点之间最近的距离r,以及采样点所在空间的维度n,比如2维平面
第二步:在空间里生成足够多的网格,保证不接触的两个网格之间的点的距离大于r,并且网格数量足够多保证每个网格至多只需装一个采样点就能满足采样数量。为了最优化,一般取网格边长为。
第三步:随机生成一个点,再创建两个数组,第一个是处理数组,第二个是结果数组,即最终的输出数组。把这个点放进处理数组中和结果数组中。
第四步:如果处理数组非空,从中随机选择一个点,如下图的红点,并把这个点从处理数组中删除。如果处理数组是空的,直接输出结果数组并结束算法。
第五步:设定最小距离minr,比如r,最大距离maxr,比如2*r。以红点为中心生成一个圆环,如下图灰色圆环,在这个圆环中生成一个采样点,如下图蓝点。
第六步:检测这个蓝点是否与其他点隔得太近,也就是距离小于r,由于之前已经设定好了网格,所以这里只要检查9个网格里的点就行了。如上图浅蓝色点周围的绿色的网格。隔得太近的就取消这个蓝点,否则就保留并放入处理数组和结果数组中。
第七步:设定好采样次数k,比如30。如果经过k次采样后,在圆环里仍然找不到可用的新点,那么就放弃这次采样。然后重复第三步。
当然也可以魔改一下,比如根据图片的不同灰度设置不同的距离r,比如下图