先了解泊松分布,参考链接如下:
1、泊松分布 (Poisson-Disc)算法
2、泊松分布算法图解
3、有人知道泊松盘采样算法吗?看了几天没看懂?
概要
先说明一下功能,这个算法主要是将所有的点采样分布均匀(大概如下图),仔细看了很久理论,没太清楚(可能主要是文字的东西,理解费劲),然后看着那个动画看,直至把动画全看完了,才理解其精髓
泊松盘采样原理
看看下面泊松采样展示的,是不是像个盘子,里面圆半径为r,外面圆半径为2r。
然后随机取一个中心点,然后在r和2r范围内进行采样形成的采样点,采样点有红色、白色、黑色之分,策略分别如下
1、采样点如果周围r范围内有红点或者黑点,则变成白点,说明采样失败;
2、如果半径r范围内没有点则采样成功,变成红色点,说明这个点周围可能还可以进行采样,所以为待确认点;
3、如果在一个红色点的r-2r范围内随机采样K次都是白色点,则说明这个点周围没有办法生成一个合适点了,这个红点就变成黑色点,黑点为确认点,程序后面不会再以它为圆心进行采样了;
如果所有点都变成了黑色则采样完成,程序结束
泊松采样在匹配点抽稀策略上的应用
理解了上述原理,所以这里我打算把它用在匹配算法抽稀上,程序还在编写,其具体策略如下:
提前准备定义的,r半径(最小相隔像素距离)
1、读入所有的匹配点,放入容器all_Vec中,深度拷贝一个完整的容器1
2、定义容器2,主要功能是放所有删除点,与all_Vec容器相差,可以判别所有的任务是否都完成了
3、定义容器3,主要功能是放所有保留点,作为最后的返回容器值
4、以容器1为循环,选取第一个元素为开始点
5、定义容器4,主要功能是放入待确认点
6、将该点加入容器3中,将该点及半径r内所有点从容器1中删除
7、将所有删除点加入容器2中
8、将所有半径为r-2r范围内的点加入到容器4中
9、判断容器4中是否有元素
10、如果容器4中有点则将容器1中的元素清空,将容器4的所有元素赋值给容器1,并且重复4、5、6、7、8、9步骤
11、如果容器4中没有点则进行判断容器2和容器all_Vec中点元素做差,将容器2中与all_Vec容器中不存在的元素形成容器1
12、可以将步骤11写一个函数,返回bool类型,容器1用引用进行返回值,如果元素个数完全相等则返回true,结束程序,输出容器1中的值,如果为false,则循环进行4、5、6、7、8、9步骤
程序写出来是这样的,效果还不错