VTK利用点云高程渲染点云(+读写文件)

原始数据格式是个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);
}

转:https://blog.csdn.net/u013094443/article/details/48846447

猜你喜欢

转载自blog.csdn.net/eric_e/article/details/84712106
今日推荐