类名称 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;
}