zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    linux_shell_入门
    Linux下安装jdk
    Linux杂记
    Linux常用命令
    Java 性能优化的五大技巧
    Java异常处理的9个最佳实践
    Java面试:投行的15个多线程和并发面试题
    敏捷持续集成详解
    gitlab系列详解
    git系列讲解
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7092812.html
Copyright © 2011-2022 走看看