Marching squares & Marching cubes

提要

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 00:51:10

Marching squares & Marching cubes的相关文章

等高线生成算法(转载)

等高线生成算法 输入:离散的采样点坐标和高度值(x_0,y_0,value_0),(x_1,y_1,value_1)......(x_n, y_n, value_n) 输出:等高线图,如下所示 wiki上的Marching squares算法对此有很好的说明,我也是按照wiki上面的步骤来实现这个算法的,下面对该算法的步骤进行简要说明. 输入参数: 1.点的集合(x_0,y_0,value_0),(x_1,y_1,value_1)......(x_n, y_n, value_n) ; 2.高度值

等高线生成算法

输入:离散的采样点坐标和高度值(x_0,y_0,value_0),(x_1,y_1,value_1)......(x_n, y_n, value_n) 输出:等高线图,如下所示 wiki上的Marching squares算法对此有很好的说明,我也是按照wiki上面的步骤来实现这个算法的,下面对该算法的步骤进行简要说明. 输入参数: 1.点的集合(x_0,y_0,value_0),(x_1,y_1,value_1)......(x_n, y_n, value_n) ; 2.高度值数组,即每条等高

MATLAB编程--基础知识

:matlab,数据类型(数值,字符串),选择结构,循环接口,函数,字符串函数和矩阵,文件操作 clc clf clear abort ! diary filename->diary on->diary off which filename editpath a=[0 1+7] b=[a(2) 7 a] 定义了数组a=[0 8]和数组b=[8 7 0 8]. d = [1 2] d(4) = 4 d的值为[1 2 0 4] first:incr:last Angles = (.01:.01:1

Intel® Threading Building Blocks (Intel® TBB) Developer Guide 中文 Parallelizing Data Flow and Dependence Graphs并行化data flow和依赖图

https://www.threadingbuildingblocks.org/docs/help/index.htm Parallelizing Data Flow and Dependency Graphs In addition to loop parallelism, the Intel® Threading Building Blocks (Intel® TBB) library also supports graph parallelism. It's possible to cre

水泡动画模拟(Marching Cubes)

Marching Cubes算法是三维离散数据场中提取等值面的经典算法,其主要应用于医学领域的可视化场景,例如CT扫描和MRI扫描的3D重建等. 算法主要的思想是在三维离散数据场中通过线性插值来逼近等值面,具体如下:三维离散数据场中每个栅格单元作为一个体素,体素的每个顶点都存在对应的标量值.如果体素顶点上的值大于或等于等值面值,则定义该顶点位于等值面之外,标记为“0”:而如果体素顶点上的值小于等值面值,则定义该顶点位于等值面之内,标记为“1”.由于每个体素单元有8个顶点,那么共存在2^8 = 2

移动立方体算法(Marching cubes algorithm)

百度百科: 医学图像三维重建的方法主要有两大类:一类是三维面绘制,另一类是三维体绘制.体绘制能够更真实地反映物体结构,但由于其运算量大,即使利用高性能的计算机也无法满足实际应用中交互操作的需要.因此,面绘制是目前医学图像三维重建的主流算法. ··MarchingCubes(MC)算法是面绘制算法中的经典算法,它是W.Lorensen等人于1987年提出来的一种体素级重建方法.因其原理简单容易实现,得到了广泛的应用. ·MC算法实际上是一个分而治之的方法,因为其将等值面的抽取分布于每一个体素(vo

Marching Cube

GPU-Marching-Cubes An Implementation of the Marching Cubes[1] Algorithm Marching Cubes Matlab The Standford Volume Data Archive BrainWeb: Simulated Brain Database

Fast Marching method

Fast Marching method 跟 dijkstra 方法类似,只不过dijkstra方法的路径只能沿网格,而Fast Marching method的方法可以沿斜线. [Level Set Methods and Fast Marching Methods p94-95 ] 这里u理解为到达点的时间, Fijk理解为在点ijk的流速. 然后就可以跟Boundary Value Formulation对应起来了. [Level Set Methods and Fast Marching

kExercise 5.4 Table of reciprocals, squares, cubes, and fourth powers.

Exercise 5-4. Define a two-dimensional array, data[11][5] , of type double. Initializethe elements in the first column with values from 2.0 to 3.0 inclusive in steps of 0.1.If the first element in a row has value x, populate the remaining elements in