vtk 四边形网格转三角形网格 实例

  类名称   vtkTriangleFilter  

#include 
#include 
#include 
#include "tuex.h"
#include "vtkCylinderSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
#include 
#include
#include
#include
#include
#include
 
#include
#include 
#include "vtkLine.h"
#include "vtkTriangle.h"
#include "vtkPolyLine.h"
#include "vtkQuad.h"
#include "vtkTriangleFilter.h"

//VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType)
using namespace std;
#include 

 string& trim(std::string &);
 string& getStringFormat(std::string &, std::string &result);
 std::vector split(std::string str, std::string pattern);
int main(int agrv, char * agrc) {

	const char *url = "D:/vtk/data/work/points.dat";
	fstream fs;

	ifstream infile;

	infile.open(url, ios::in);
	if (!infile.is_open())
	{
		cout << "读取文件失败" << endl;
		return 0;
	}

	string buf;
	string openFileName;
	int i = 0;

	vtkSmartPointer points = vtkSmartPointer::New();
	vtkSmartPointer vertics = vtkSmartPointer::New();
	vtkIdType pId[1344] = {};
	int num = 0;
 
	while (getline(infile, buf))
	{
		string::size_type n = 0;
		 
		if (trim(buf).size() > 0) {
			string  result = "";
			getStringFormat(buf, result);
			std::vector resultArry = split(result, " ");
			double x = stod(resultArry[0]);
			double y = stod(resultArry[1]);
			double z = stod(resultArry[2]);
			 
			pId[num++] = points->InsertNextPoint(x, y, z);
		   // vertics->InsertNextCell(1, pId);
			 
		}
	}
	/** /
	for (int j = 0; j < 1342; ) {
	
		vtkSmartPointer pLine = vtkSmartPointer::New();
		 pLine->GetPointIds()->SetId(0, pId[j++]);
		 pLine->GetPointIds()->SetId(1, pId[j]);
		 cout << j << endl;
		 vertics->InsertNextCell(pLine);
	}
	/**/

	for (int i = 0; i < 1344-65; i++) {
	 
			vtkSmartPointer quad = vtkSmartPointer::New();
			quad->GetPointIds()->SetId(0, pId[i]);
			quad->GetPointIds()->SetId(1, pId[i+1]);
			quad->GetPointIds()->SetId(2, pId[i + 64+1]);
			quad->GetPointIds()->SetId(3, pId[i + 64]);
		 
			vertics->InsertNextCell(quad);
	 
	}
	 
	vtkSmartPointer polydata = vtkSmartPointer::New();
	//将几何结构 & 拓扑结构加入到数据集中
	polydata->SetPoints(points);
    //polydata->SetVerts(vertics);
	//polydata->SetLines(vertics);
	 polydata->SetPolys(vertics);
	 //polydata->(vertics);
	 
	  
	 //四边形网格转三角形网格
	 vtkSmartPointer tra = vtkSmartPointer::New();
	 tra->SetInputData(polydata);
	 tra->Update();
 
	vtkSmartPointer mapper = vtkSmartPointer::New();

	// mapper->SetInputData(polydata);
    mapper->SetInputData(tra->GetOutput());
	vtkSmartPointer actor = vtkSmartPointer::New();
	actor->SetMapper(mapper); //演员化妆

	vtkSmartPointer renderer = vtkSmartPointer::New();
	renderer->AddActor(actor);//演员放到舞台上
	renderer->SetBackground(1.0, 0.7, 0.5);//设置舞台背景

	vtkSmartPointer renWin = vtkSmartPointer::New();
	renWin->AddRenderer(renderer);//舞台搬进戏院
	renWin->SetSize(640, 480);//戏院大小
	renWin->Render(); //戏院渲染
	renWin->SetWindowName("vtkPipelineDemo");//戏院起名

	vtkSmartPointer interactor = vtkSmartPointer::New();
	interactor->SetRenderWindow(renWin);//与看客交互

	interactor->Initialize();
	interactor->Start();

	return 0;
 
}

string&  getStringFormat(std::string &s, std::string &result) {
 
	string source_string = s;
	string regex_string = "\\s+";
	string replace_string = " ";
	regex r(regex_string);   //regex 表示一个正则表达式类
	result = regex_replace(source_string, r, replace_string);

	return   result;
}


 string& trim(std::string &s)
{
	if (s.empty())
	{
		return s;
	}

	s.erase(0, s.find_first_not_of(" "));
	s.erase(s.find_last_not_of(" ") + 1);
	return s;
} 

 std::vector split(std::string str, std::string pattern)
 {
	 std::string::size_type pos;
	 std::vector result;
	 str += pattern;//扩展字符串以方便操作
	 int size = str.size();

	 for (int i = 0; i

你可能感兴趣的:(VTK,&,ITK,计算机图形学,图像处理)