欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。

参考资料
https://www.jianshu.com/p/4556ccad58d9
https://blog.csdn.net/qq_21476953/article/details/118440245
https://www.bilibili.com/video/av418836005

作用&性质

作用:可以在一个区域内生成均匀的采样点。
性质:做任意2点距离大于r。以每个点为圆作半径为r的圆,这些圆的并集可以基本覆盖到目标区域。

代码实现


class PoissonDisk {typedef pair<double, double> P;bool inCircle(P a, P b, double r) {a.first -= b.first;a.second -= b.second;return a.first*a.first+a.second*a.second< r*r;}bool isValid(double h, double w, double r,double cellSize,  P newP, vector<vector<int>> &grid, vector<P> &points) {if(newP.first<0 || newP.first>h || newP.second<0 || newP.second>w) return false; //出界// 计算出有可能发生碰撞五乘五格子的上下左右边界int up = max(0, int(newP.first/cellSize)-2);int down = min(int(grid.size()-1), int(newP.first/cellSize)+2);int left = max(0, int(newP.second/cellSize)-2);int right = min(int(grid[0].size()-1), int(newP.second/cellSize)+2);for(int i=up;i<=down;++i) {for(int j=left;j<=right;++j) {if(grid[i][j]<0)continue;if(inCircle(newP, points[grid[i][j]], r)) return false;}}return true;}
public:vector<P> sampling(double h, double w, double r, int numSamplesBeforeReject=30) {srandom(NULL);double cellSize = r/sqrt(2);vector<P> points;vector<P> spawnPoints;vector<vector<int>> grid(ceil(h/cellSize), vector<int>(ceil(w/cellSize),-1)); // 存储格子中是否有生成点,如果有就是大于0,默认-1;// 加入一个种子点spawnPoints.push_back({h/2, w/2});while(!spawnPoints.empty()) {bool candidateAccepted = false;int spawnIndex = rand()%spawnPoints.size();// 每次按种子为中心,从半径r到2r的地带随机选取一点。// 并判断是否可行,可行则退出,并加入到候选生成种子,否继续,直到采样次数用完。for(int i=0;i<numSamplesBeforeReject;++i) {double angle = rand()%360*1.0/360*2*M_PI;// cout<<"pi:"<<angle/M_2_PI<<endl;auto dir = P(sin(angle), cos(angle));auto newP = spawnPoints[spawnIndex];double rl = rand()%1000*1.0/1000*r;newP.first+=dir.first*(rl+r);newP.second+=dir.second*(rl+r);// cout<<newP.first<<"|a|"<<newP.second<<endl;bool res=isValid(h, w, r,cellSize, newP, grid, points);if(res) {candidateAccepted = true;grid[newP.first/cellSize][newP.second/cellSize] = points.size();points.push_back(newP);spawnPoints.push_back(newP);break;}}// 采样次数用完,没有得到可行结果,说明该种不可用,直接删除。if(!candidateAccepted){if(spawnIndex!=spawnPoints.size()-1)spawnPoints[spawnIndex] = spawnPoints[spawnPoints.size()-1];spawnPoints.pop_back();}// cout<<points.size()<<"|"<<spawnPoints.size()<<endl;}return points;}
};

效果


本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。

泊松圆盘采样(Poisson Disk Sampling)代码实现相关推荐

  1. 程序化物件放置(procedural placement)之泊松硬盘采样(poisson disk sampling)

    程序化物件放置(Procedural Placement) 在开放世界游戏中, 很多小物件(物品箱子, 杂物, 草,木桶)的摆放是很耗费工作量的, 靠人工手动摆放是不现实的,为了节省工作量, 工程师探 ...

  2. 泊松圆盘采样(Poisson-Disk Sampling)

  3. 【项目记录】过程内容生成(PCG)与快速泊松碟采样算法实现Unity中的物件摆放

    背景   在当今游戏开发过程中,创建一个内容丰富的虚拟世界一直是一个十分费时的工作.游戏制作者们希望在更短的时间内在游戏中增加更加多样的内容,过程内容生成技术为有限时间内制作复杂的虚拟世界提供了一种解 ...

  4. 高效生成均匀分布的点:快速泊松碟采样算法实现(Fast Poisson Disc Sampling)

    快速泊松碟采样算法实现(Fast Poisson Disc Sampling) 前(fei)言(hua) 最近在看一些随机地图生成算法,涉及到生成Voronoi图,这需要提前在一个平面内随机生成一堆的 ...

  5. 泊松流(Poisson Flow)生成模型

    又搬来了神器啊~~~ 扩散模型最早来源于物理中的热力学,最近却在人工智能领域大放异彩.还有什么物理理论可以推动生成模型研究的发展呢?最近,来自 MIT 的研究者受到高维电磁理论的启发,提出了一种称作泊 ...

  6. 接受拒绝采样(Acceptance-Rejection Sampling)

    我们所说的抽样,其实是指从一个概率分布中生成观察值(observations)的方法.而这个分布通常是由其概率密度函数(PDF)来表示的.而且, 即使在已知PDF的情况下,让计算机自动生成观测值也不是 ...

  7. 为什么Q-learning不用重要性采样(importance sampling)?

    为什么Q-learning不用重要性采样(importance sampling)? 文章目录 为什么Q-learning不用重要性采样(importance sampling)? 前言: 参考链接: ...

  8. python、turtle实现泊松盘采样

    泊松盘采样算法参考 https://www.jasondavies.com/poisson-disc/ 算法核心要点 以上一次采样点为中心,随机取圆环内点进行采样 采样时需要判断inner范围内是否已 ...

  9. 最远点采样(Farthest Point Sampling)介绍

    最远点采样(Farthest Point Sampling)是一种非常常用的采样算法,由于能够保证对样本的均匀采样,被广泛使用,像3D点云深度学习框架中的PointNet++对样本点进行FPS采样再聚 ...

最新文章

  1. 【操作系统】考研の内存管理方法(看不懂你来打我~!)
  2. mysql delete删除列,在MySQL中删除我的Key列 (Delete my Key column in MySQL)
  3. java中byte装箱和装箱_Java包装类、拆箱和装箱详解
  4. MySQL索引,MySQL中索引的限制?
  5. 实验2-1-5 将x的平方赋值给y (5 分)
  6. 从 Vue 的视角学 React(二)—— 基本语法
  7. hdu 4599 Dice
  8. jquery mini下载_【芒果tv湖南卫视直播】-芒果TV播放器下载v6.3.4 官方正式版
  9. 破解Prezi桌面版30天限制的方法
  10. liteIDE搭建Go Golang 开发环境图文详解
  11. Pytorch中报错RuntimeError: The size of tensor a (60) must match the size of tensor b (56)
  12. 华为热设计工程师待遇_【华为热设计工程师面试】华为的面试是我面试过程中相对简单的一个。-看准网...
  13. Docker问题:ERROR: Pool overlaps with other one on this address space
  14. Please verify you invoked Maven from the correct directory错误解决
  15. snopt matlab,studentSnopt matlab 学生版,求解大规模非线性规划问题 238万源代码下载- www.pudn.com...
  16. springboot状态机模式
  17. 开源软件 | 一款深度学习抠图算法,图像精细分割利器
  18. Re: 酷似抓虾的ruby on rail网站-猫爪
  19. 深信服安服类(安全服务/安全运营工程师)校招2023届面经
  20. 我国土地资源开发利用中存在的主要问题

热门文章

  1. 分享一个联芸MAS0902A四贴跳线,MK8215估计同理,内有固件分享
  2. 计算机系统的能耗和功耗
  3. 处理器 Handler 详解
  4. cuda和Nvidia驱动卸载
  5. 跻身新基建赛道,看充电桩建设乘风破浪
  6. 软件I18N/L10N软件国际化与本地化
  7. linux系统安装tv软件下载,Linux版TeamViewer安装包下载
  8. 压力传感器在消防末端管网监测中的应用
  9. oracle数据库连接加密,oracle 数据库加加密。
  10. U盘连接上网本时显示分区变0字节请问咋才能修复??