原始数据格式是个TXT文件,,包含x,y,z坐标,现在想利用点云的高程进行渲染,但是使用vtkSimplePointReader类读取的 x-y-z坐标只能给点云统一指定颜色,而类vtkParticleReader读取的数据形式为x-y-z-a,后来自己从新写了下文件,将x-y-z后面再写个z值作为a,然后实现利用a(也就是原数据的z渲染点云),代码如下:
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkParticleReader.h>
#include <vtkProperty.h>
int main()
{
/*vtkSmartPointer<vtkSphereSource> sphereSoutce = vtkSmartPointer<vtkSphereSource>::New();
sphereSoutce->Update();*/
vtkSmartPointer<vtkParticleReader> sphereSource = vtkSmartPointer<vtkParticleReader>::New();
sphereSource->SetFileName("d:\\01_1.txt");
sphereSource->SetDataByteOrderToBigEndian();
sphereSource->Update();
vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
sphereMapper->SetScalarRange(-2,20);//用来设置标量的最大最小值,修改这个可以看出渲染效果的不同
vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New();
sphereActor->SetMapper(sphereMapper);
sphereActor->GetProperty()->SetPointSize(0.2);
vtkSmartPointer<vtkRenderer> sphereRenderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> sphereRenderWindow = vtkSmartPointer<vtkRenderWindow>::New();
sphereRenderWindow->AddRenderer(sphereRenderer);
vtkSmartPointer<vtkRenderWindowInteractor> sphereIRen = vtkSmartPointer<vtkRenderWindowInteractor>::New();
sphereIRen->SetRenderWindow(sphereRenderWindow);
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
sphereIRen->SetInteractorStyle(style);
sphereRenderer->AddActor(sphereActor);
sphereRenderWindow->Render();
sphereIRen->Start();
return EXIT_SUCCESS;
}
重新写文件还是比较耗时的,继续找找不需要重写文件的方法。
下面是重新写文件的代码:
#include <stdio.h>
#include <math.h>
#include <iostream>
void ReadAPoint(double * pt , FILE *f);
using namespace std;
void main()
{
FILE *fRead,*fWrite;
fRead=fopen(/*"2.txt" */ "d:\\01.txt" , "r");
fWrite = fopen(/*"22.txt"*/ "d:\\01_1.txt" , "w");
double pt[3];
while(!feof(fRead))
{
ReadAPoint(pt,fRead);
fprintf(fWrite,"%lf %lf %lf %lf",pt[0],pt[1],pt[2],pt[2]);
fprintf(fWrite,"\n");
}
fclose(fRead);
fclose(fWrite);
cout<<"Finished!"<<endl;
}
void ReadAPoint(double * pt , FILE *f)
{
int x,y,z;
x=fscanf(f,"%lf",pt);
y=fscanf(f,"%lf",pt+1);
z=fscanf(f,"%lf",pt+2);
}