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