#include <Windows.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyDataMapper.h>
#include <vtkMarchingCubes.h>
#include <vtkVolume16Reader.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkPolyData.h>
#include <vtkProperty.h>
#include <vtkTriangleFilter.h>
#include <vtkSmoothPolyDataFilter.h>
#include <vtkDecimatePro.h>
#include <vtkSTLWriter.h>
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//读取raw图片
vtkVolume16Reader *reader = vtkVolume16Reader::New();
reader->SetDataDimensions(64, 64);
reader->SetDataByteOrderToLittleEndian();
reader->SetFilePrefix("D://headsq/quarter");
reader->SetImageRange(1, 93);
reader->SetDataSpacing(3.2, 3.2, 1.5);
vtkMarchingCubes *boneExtractor = vtkMarchingCubes::New();
boneExtractor->SetInput((vtkDataObject*)reader->GetOutput());
boneExtractor->SetValue(0, 500);
//将原始拓扑结果全部转化为三角面片结构
vtkTriangleFilter *triangleFilter = vtkTriangleFilter::New();
//设置输入
triangleFilter->SetInput(boneExtractor->GetOutput());
//做简化
vtkDecimatePro *deciFilter = vtkDecimatePro::New();
//设置输入
deciFilter->SetInputConnection(triangleFilter->GetOutputPort());
//简化为原来的10%
deciFilter->SetTargetReduction(0.1);
//保持原始网格拓扑结构
deciFilter->PreserveTopologyOn();
//做平滑
vtkSmoothPolyDataFilter *smoothFilter = vtkSmoothPolyDataFilter::New();
//设置输入
smoothFilter->SetInputConnection(deciFilter->GetOutputPort());
//设置平滑的次数
smoothFilter->SetNumberOfIterations(800);
//开启尖锐特征平滑
smoothFilter->FeatureEdgeSmoothingOn();
vtkPolyDataMapper *boneMapper = vtkPolyDataMapper::New();
//boneMapper->SetInput(triangleFilter->GetOutput());
//boneMapper->SetInput(deciFilter->GetOutput());
boneMapper->SetInput(smoothFilter->GetOutput());
vtkSTLWriter *face = vtkSTLWriter::New();
face->SetInputConnection(smoothFilter->GetOutputPort());
face->SetFileName("d://face.stl");
face->Update();
face->Write();
vtkActor *bone = vtkActor::New();
bone->SetMapper(boneMapper);
bone->GetProperty()->SetDiffuseColor(0.1, 0.94, 0.52);
bone->GetProperty()->SetSpecular(0.3);
bone->GetProperty()->SetSpecularPower(20);
vtkRenderer *ren = vtkRenderer::New();
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren);
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
ren->AddActor(bone);
ren->Render();
iren->Initialize();
iren->Start();
boneExtractor->Delete();
triangleFilter->Delete();
deciFilter->Delete();
smoothFilter->Delete();
face->Delete();
boneMapper->Delete();
bone->Delete();
ren->Delete();
renWin->Delete();
reader->Delete();
iren->Delete();
return 0;
}