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

  类名称   vtkTriangleFilter  

#include <iostream>
#include <string>
#include <regex>
 
#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 <vtkAutoInit.h>
#include<vtkPNGReader.h>
#include<vtkTexture.h>
#include<vtkPlaneSource.h>
#include<vtkStringArray.h>
#include<vtkPoints.h>

#include<vtkTecplotReader.h>
#include <iostream>
#include "vtkLine.h"
#include "vtkTriangle.h"
#include "vtkPolyLine.h"
#include "vtkQuad.h"
#include "vtkTriangleFilter.h"
#include "vtkFloatArray.h"
#include "vtkLookupTable.h"
#include "vtkPointData.h"



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

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

	const char *url = "D:/vtk/data/wallouttemptimedata.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<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
	vtkSmartPointer<vtkCellArray> vertics = vtkSmartPointer<vtkCellArray>::New();
	vtkIdType pId[1344] = {};
	int num = 0;
	vtkSmartPointer<vtkFloatArray> scalars = vtkSmartPointer<vtkFloatArray>::New();

	while (getline(infile, buf))
	{
		string::size_type n = 0;

		if (trim(buf).size() > 0) {
			string  result = "";
			getStringFormat(buf, result);
			std::vector<std::string> resultArry = split(result, " ");
			double x = stod(resultArry[0]);
			double y = stod(resultArry[1]);
			double z = stod(resultArry[2]);
			double t = stod(resultArry[3]);

			pId[num++] = points->InsertNextPoint(x, y, z);
			// vertics->InsertNextCell(1, pId);

			scalars->InsertTuple1(num,t);

		}
	}
	
	double threshold = 1e-4;

	vtkLookupTable* lut = vtkLookupTable::New();
	lut->SetIndexedLookup(true);
	lut->Build();
	lut->SetTableValue(200, 1.0, 0.0, 0.0, 1);
	lut->SetTableValue(200, 1.0, 1.0, 1.0, 1);
	lut->SetTableValue(200, 1.0, 1.0, 0.0, 1);
	lut->SetTableValue(200, 1.0, 0.0, 0.0, 1);
	lut->SetTableRange(0,256);

	/** /
	for (int j = 0; j < 1342; ) {

	vtkSmartPointer<vtkLine> pLine = vtkSmartPointer<vtkLine>::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<vtkQuad> quad = vtkSmartPointer<vtkQuad>::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<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
	//将几何结构 & 拓扑结构加入到数据集中
	polydata->SetPoints(points);
	//polydata->SetVerts(vertics);
	//polydata->SetLines(vertics);
	polydata->SetPolys(vertics);
	//polydata->(vertics);
	vtkPointData * vtkPointsObj = polydata->GetPointData();
	vtkPointsObj->SetScalars(scalars);

	//四边形网格转三角形网格
	vtkSmartPointer<vtkTriangleFilter> tra = vtkSmartPointer<vtkTriangleFilter>::New();
	tra->SetInputData(polydata);
	tra->Update();

	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();

	// mapper->SetInputData(polydata);
	mapper->SetInputData(tra->GetOutput());
	mapper->ScalarVisibilityOn();
	mapper->SetLookupTable(lut);
	mapper->SetScalarModeToUsePointData();
	mapper->SetColorModeToMapScalars();

	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper); //演员化妆

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

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

	vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::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<std::string> split(std::string str, std::string pattern)
{
	std::string::size_type pos;
	std::vector<std::string> result;
	str += pattern;//扩展字符串以方便操作
	int size = str.size();

	for (int i = 0; i<size; i++)
	{
		pos = str.find(pattern, i);
		if (pos<size)
		{
			std::string s = str.substr(i, pos - i);
			result.push_back(s);
			i = pos + pattern.size() - 1;
		}
	}
	return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小道士写程序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值