Marching Cubes
来源:互联网 发布:mac地址能不能修改 编辑:程序博客网 时间:2024/04/18 18:36
MarchingCubes建模是三维可视化库VTK建模算法之一。该建模方法采用空间分解的方法,对空间体元进行不断的切割处理,最后得到一个由规则体构成的非规则复杂物体的近似。这种方法包括有物体的内在信息,从而实现体数据的表达。
MC方法求等值面的算法流程:
① 将三维离散规则数据场分层读入内存;
② 扫描两层数据,逐个构造体元,每个体元中的8个角点取自相邻的两层;
③ 将体元每个角点的函数值与给定的等值面C作比较,根据比较结果,构造该体元的状态表;
④ 根据状态表,得到将与等值面有角点的体元边界;
⑤ 通过线性插值方法,计算出体元边界与等值面的交点;
⑥ 利用中心差分方法,求出体元各角点处的法向量,再通过线性插值方法,求出三角形各顶点处的法向量;
<7> 根据各三角面片各顶点的坐标值及法向量绘制等值面图像。
VTK官网给出的例子
#include "stdafx.h"#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle); #include <vtkActor.h>#include <vtkRenderer.h>#include <vtkImageData.h>#include <vtkSphereSource.h>#include <vtkVoxelModeller.h>#include <vtkRenderWindow.h>#include <vtkSmartPointer.h>#include <vtkMarchingCubes.h>#include <vtkPolyDataMapper.h>#include <vtkDICOMImageReader.h>#include <vtkRenderWindowInteractor.h>int _tmain(int argc, _TCHAR* argv[]){// std::string folder = "C:\\Users\\yorktal03\\Desktop\\ZYH\\data\\MarchingMan";vtkSmartPointer<vtkSphereSource> sphere = vtkSphereSource::New();sphere->SetPhiResolution(20);sphere->SetThetaResolution(20);sphere->Update();double bounds[6];// GetBounds()// Return a pointer to the geometry bounding box in the form (xmin,xmax, ymin,ymax, zmin,zmax). // THIS METHOD IS NOT THREAD SAFE. sphere->GetOutput()->GetBounds(bounds);/*for (unsigned int i = 0; i < 6; i += 2){double range = bounds[i + 1] - bounds[i];bounds[i] = bounds[i] - .1 * range;bounds[i + 1] = bounds[i + 1] + .1 * range;}*/vtkSmartPointer<vtkVoxelModeller> voxelModeller = vtkVoxelModeller::New();voxelModeller->SetSampleDimensions(50, 50, 20);voxelModeller->SetModelBounds(bounds);voxelModeller->SetScalarTypeToFloat();voxelModeller->SetMaximumDistance(.1);voxelModeller->SetInputConnection(sphere->GetOutputPort());voxelModeller->Update();vtkSmartPointer<vtkImageData> volume = vtkSmartPointer<vtkImageData>::New();volume->DeepCopy(voxelModeller->GetOutput());/*vtkSmartPointer<vtkDICOMImageReader> imgs = vtkDICOMImageReader::New();imgs->SetDirectoryName(folder.c_str());imgs->Update();volume->DeepCopy(imgs->GetOutput());*/vtkSmartPointer<vtkMarchingCubes> surface = vtkMarchingCubes::New();surface->SetInputData(volume);surface->ComputeNormalsOn();surface->SetValue(0, 0.5);vtkSmartPointer<vtkPolyDataMapper> mapper = vtkPolyDataMapper::New();mapper->SetInputConnection(surface->GetOutputPort());mapper->ScalarVisibilityOff();vtkSmartPointer<vtkActor> actor = vtkActor::New();actor->SetMapper(mapper);vtkSmartPointer<vtkRenderer> ren = vtkRenderer::New();ren->AddActor(actor);ren->SetBackground(0.1, .2, .3);vtkSmartPointer<vtkRenderWindow> renWin = vtkRenderWindow::New();renWin->AddRenderer(ren);renWin->Render();vtkSmartPointer<vtkRenderWindowInteractor> irenwin = vtkRenderWindowInteractor::New();irenwin->SetRenderWindow(renWin);irenwin->Start();return 0;}两种不同的输入数据,一种是绘制一个球体:
一种是从DICOM图像列;
读取图像然后显示图像好像没有什么麻烦,只是绘制立体图以及参数的设置还是需要学习的。
voxelModeller :将无规则的数据集转化为体素表示。
体素(voxel),是体积元素(volumepixel)的简称。vtkVoxelModeller默认输出的图像是 VTK_BIT 图像,但是MC不支持这个类型的图像,所以SetScalarTypeToFloat()得到一个Float的图像。
当然这边也有其他比较复杂的例子
0 0
- Marching Cubes
- Marching Cubes
- Marching Cubes
- Marching Cubes
- Marching squares & Marching cubes
- Overview of the Marching Cubes Algorithm
- OpenGL笔记——Marching cubes算法
- 一个极简的Marching Cubes算法实现
- 三维重建移动立方体法(Marching Cubes Algorithm)的查找表的构造
- Marching squares
- 我的Fast marching...
- Unity3d Ray Marching
- ray marching shader
- Marching squares (triangle)
- 2D Fast Marching Computations
- Colored Cubes
- Risky cubes
- Perfect Cubes
- 动态工厂模式---(3)
- Cookie和session区别
- Ubuntu16.04安装串口调试工具gtkterm
- ScrollerView中嵌套多个ListView,ListView都展示出
- 顺序表应用3:元素位置互换之移位算法
- Marching Cubes
- 前清时期坐过堂
- Codeforces Round #305 (Div. 1) A. Mike and Frog(数学)
- android studio 提高编译的速度,安装apk过慢问题解决
- 警告 libpng warning: iCCP: known incorrect sRGB profile
- 自适应布局,响应式布局以及rem,em区别
- Android Material Design系列之主题样式介绍说明等
- windows下eclipse连接hadoop
- 删数