Marching squares & Marching cubes
来源:互联网 发布:dnf总是网络中断 编辑:程序博客网 时间:2024/05/01 06:54
提要
Marching squares 主要是用于从一个地图(用二维数组表示)生成轮廓的算法。Marching cubes则对应的是在空间生成网格的方法。最常见的应用就是天气预报中气压图的生成,还常用于随机地形的生成。
Marching squares
先说算法步骤。
(1) 输入是一个Scalar grid,它是一张二维的表。
这张表可以从一张二维图像生成,也可以从高度图生成等等。每个顶点对应一个Scalar值。
(2) 接下来要做的就是将顶点值和与一个标准值 σ 相减,得到一张 +/- grid。这里令 σ = 5,得到的表如下:
其中被标黑的点叫做Positive点,没有被标黑的叫做Negative点。
(3)接下来是轮廓生成。grid中相邻的四个顶点就是一个cell,对于每一个cell,根据顶点的positive和negative,一共有2^4 = 16种情况。
这16中情况对应于轮廓线的绘制也有16中情况。这里在每个cell的每条边都插入了Midpoint。
通过连接cell的中点,就可以绘制轮廓了。
将第二步生成的 +/- grid生成轮廓线得到结果如下
(4) 通过插值修正轮廓
这里要做的修正主要是通过线性差值将轮廓线绘制得更加精确一些。现在的轮廓线经过的都是cell的midpoint,实际上要经过的是 σ 所在的位置,这个位置通过线性差值就可以取得。最终得到的结果如下
算法的流程归纳如下
算法的伪代码如下:
2D Ambiguity
对于第8和第12种cell,有两种生成轮廓的方式,这样就会产生随机性。
同样的两种分布,会出现两种轮廓
但是,这两种情况并不能说是error,它还是符合轮廓的特性。
Marching cubes
Marching cubes其实就是将算法扩展到三围空间,cell变成了cube。相比于squar划分的16种方法,cube有2^8 = 256 种情况,但是可以简化为下面的22种情况,另外的可以通过旋转来得到。
这个算法常用于生成一些医学图像。
还有一个很有趣的东西叫做Metaballs,用的也是这个算法。
参考
Squares Made for Marching - http://blog.project-retrograde.com/2013/05/marching-squares/
Marching squares Wiki
Marching Squares, partitioning space - http://catlikecoding.com/unity/tutorials/marching-squares/
Metaballs and Marching Squares - http://jamie-wong.com/2014/08/19/metaballs-and-marching-squares/
The Marching cube - http://users.polytech.unice.fr/~lingrand/MarchingCubes/algo.html#msAmb
Metaballs II - http://www.paulsprojects.net/metaballs2/metaballs2.html
- Marching squares & Marching cubes
- Marching Cubes
- Marching Cubes
- Marching Cubes
- Marching Cubes
- Marching squares
- Marching squares (triangle)
- Overview of the Marching Cubes Algorithm
- OpenGL笔记——Marching cubes算法
- 一个极简的Marching Cubes算法实现
- 三维重建移动立方体法(Marching Cubes Algorithm)的查找表的构造
- 我的Fast marching...
- Unity3d Ray Marching
- ray marching shader
- 2D Fast Marching Computations
- My sample of Marching Cube Algorithm
- [OpenGL]课后案例04:Marching-Square程序
- 利用marching square algorithm获取图形轮廓
- [Leetcode 151, Medium] Reverse Words in a String
- JavaScript权威指南_138_第15章_脚本化文档_15.9-HTML表单-概述
- 服务里没有Cryptographic Services怎么办?
- UML——时序图
- ios极光推送使用总结
- Marching squares & Marching cubes
- 算法设计与分析
- 树的直径
- JavaScript权威指南_139_第15章_脚本化文档_15.9-HTML表单-选取表单和表单元素
- Exchange的缓存模式有什么用?
- Android WebView 开发详解(一)
- Android 恢复出厂设置(recovery)
- 由前序(后序)中序构造二叉树
- 让ProgressDialog在setCancelable(false)时按返回键可dismiss