三、单元与点集的创建与显示

一、说明 

       vtk在定义数据的时候,必须要定义数据的几何结构与拓扑结构。

       几何结构就是点的坐标

       拓扑结构则是这些点的连接方式

二、程序说明

       创建并显示三角形

三、程序代码

#include <vtkPoints.h>
#include <vtkLine.h>
#include <vtkCellArray.h>
#include <vtkSmartPointer.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL
VTK_MODULE_INIT(vtkInteractionStyle);
int main(int argc, char *argv[])
{
    //创建三个坐标点
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    points->InsertNextPoint ( 1.0, 0.0, 0.0 ); //返回第一个点的ID:0
    points->InsertNextPoint ( 0.0, 0.0, 4.0 ); //返回第二个点的ID:1
    points->InsertNextPoint ( 0.0, 0.0, 0.0 ); //返回第三个点的ID:2

    //每两个坐标点之间分别创建一条线
    //SetId()的第一个参数是线段的端点ID,第二个参数是连接的点的ID
    vtkSmartPointer<vtkLine> line0 = vtkSmartPointer<vtkLine>::New();
    line0->GetPointIds()->SetId ( 0,0 ); 
    line0->GetPointIds()->SetId ( 1,1 );

    vtkSmartPointer<vtkLine> line1 = vtkSmartPointer<vtkLine>::New();
    line1->GetPointIds()->SetId ( 0,1 );
    line1->GetPointIds()->SetId ( 1,2 );

    vtkSmartPointer<vtkLine> line2 = vtkSmartPointer<vtkLine>::New();
    line2->GetPointIds()->SetId ( 0,2 );
    line2->GetPointIds()->SetId ( 1,0 );

    //创建Cell数组,用于存储以上创建的线段
    vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
    lines->InsertNextCell ( line0 );
    lines->InsertNextCell ( line1 );
    lines->InsertNextCell ( line2 );

    vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();

    //将点和线加入到数据集中,前者指定数据集的几何,后者指定其拓扑
    polydata->SetPoints ( points );
    polydata->SetLines ( lines );
    
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polydata);//读取数据用SetInputData
    
    vtkSmartPointer<vtkActor>actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    vtkSmartPointer<vtkRenderer>renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->SetBackground(0, 0, 0);
    renderer->ResetCamera();

    vtkSmartPointer<vtkRenderWindow>rwin = vtkSmartPointer<vtkRenderWindow>::New();
    rwin->AddRenderer(renderer);
    rwin->SetSize(600, 600);
    
    vtkSmartPointer<vtkRenderWindowInteractor>rwinInter =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    rwinInter->SetRenderWindow(rwin);
    rwinInter->Initialize();
    rwinInter->Start();

    return EXIT_SUCCESS;
}
View Code

      显示结果:

     

 

 四、程序分析

        程序数据对象为ploydata, 

       其需要指定几何结构(Points)和拓扑结构(Lines)

       使用的单元类型是vtkLine.

五、修改

      1-使用ploydata显示立方体:

#include <vtkPoints.h>
#include <vtkLine.h>
#include <vtkCellArray.h>
#include <vtkSmartPointer.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL
VTK_MODULE_INIT(vtkInteractionStyle);
int main(int argc, char *argv[])
{

    //显示一个立体形状
    vtkSmartPointer<vtkConeSource>coneSource = vtkSmartPointer<vtkConeSource>::New();
    coneSource->Update();
    polydata = coneSource->GetOutput();
    
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polydata);//读取数据用SetInputData
    
    vtkSmartPointer<vtkActor>actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    vtkSmartPointer<vtkRenderer>renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->SetBackground(0, 0, 0);
    renderer->ResetCamera();

    vtkSmartPointer<vtkRenderWindow>rwin = vtkSmartPointer<vtkRenderWindow>::New();
    rwin->AddRenderer(renderer);
    rwin->SetSize(600, 600);
    
    vtkSmartPointer<vtkRenderWindowInteractor>rwinInter =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    rwinInter->SetRenderWindow(rwin);
    rwinInter->Initialize();
    rwinInter->Start();

    return EXIT_SUCCESS;
}
View Code

       

 

      2-显示四面体的线

/**********************************************************************

  文件名: 3.2_TriangleGeometryLines.cpp
  Copyright (c) 张晓东, 罗火灵. All rights reserved.
  更多信息请访问: 
    http://www.vtkchina.org (VTK中国)
    http://blog.csdn.net/www_doling_net (东灵工作室) 

**********************************************************************/

#include <vtkPoints.h>
#include <vtkLine.h>
#include <vtkCellArray.h>
#include <vtkCellType.h>
#include <vtkSmartPointer.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkConeSource.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL
VTK_MODULE_INIT(vtkInteractionStyle);
int main(int argc, char *argv[])
{
    //创建三个坐标点
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    points->InsertNextPoint ( 1.0, 0.0, 0.0 ); //返回第一个点的ID:0
    points->InsertNextPoint ( 0.0, 0.0, 4.0 ); //返回第二个点的ID:1
    points->InsertNextPoint ( 0.0, 0.0, 0.0 ); //返回第三个点的ID:2
    points->InsertNextPoint ( 0.0, 2.0, 0.0); //返回第三个点的ID:3
    //每两个坐标点之间分别创建一条线
    //SetId()的第一个参数是线段的端点ID,第二个参数是连接的点的ID
    vtkSmartPointer<vtkLine> line0 = vtkSmartPointer<vtkLine>::New();
    line0->GetPointIds()->SetId ( 0,0 ); 
    line0->GetPointIds()->SetId ( 1,1 );

    vtkSmartPointer<vtkLine> line1 = vtkSmartPointer<vtkLine>::New();
    line1->GetPointIds()->SetId ( 0,1 );
    line1->GetPointIds()->SetId ( 1,2 );

    vtkSmartPointer<vtkLine> line2 = vtkSmartPointer<vtkLine>::New();
    line2->GetPointIds()->SetId ( 0,2 );
    line2->GetPointIds()->SetId ( 1,0 );

    vtkSmartPointer<vtkLine> line3 = vtkSmartPointer<vtkLine>::New();
    line3->GetPointIds()->SetId(0, 0);
    line3->GetPointIds()->SetId(1, 3);
    vtkSmartPointer<vtkLine> line4 = vtkSmartPointer<vtkLine>::New();
    line4->GetPointIds()->SetId(0, 3);
    line4->GetPointIds()->SetId(1, 1);
    vtkSmartPointer<vtkLine> line5 = vtkSmartPointer<vtkLine>::New();
    line5->GetPointIds()->SetId(0, 3);
    line5->GetPointIds()->SetId(1, 2);
    //创建Cell数组,用于存储以上创建的线段
    vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
    //vtkSmartPointer<> lines = vtkSmartPointer<vtkCellArray>::New();
    lines->InsertNextCell ( line0 );
    lines->InsertNextCell ( line1 );
    lines->InsertNextCell ( line2 );
    lines->InsertNextCell (line3);
    lines->InsertNextCell (line4);
    lines->InsertNextCell (line5);
    vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();

    //将点和线加入到数据集中,前者指定数据集的几何,后者指定其拓扑
    polydata->SetPoints ( points );
    polydata->SetLines ( lines );

    //显示一个立体形状
    /*vtkSmartPointer<vtkConeSource>coneSource = vtkSmartPointer<vtkConeSource>::New();
    coneSource->Update();
    polydata = coneSource->GetOutput();*/
    
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polydata);
    
    vtkSmartPointer<vtkActor>actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    vtkSmartPointer<vtkRenderer>renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->SetBackground(0.5, 0, 0);
    renderer->ResetCamera();

    vtkSmartPointer<vtkRenderWindow>rwin = vtkSmartPointer<vtkRenderWindow>::New();
    rwin->AddRenderer(renderer);
    rwin->SetSize(600, 600);
    vtkSmartPointer<vtkRenderWindowInteractor>rwinInter =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    rwinInter->SetRenderWindow(rwin);
    rwinInter->Initialize();
    rwinInter->Start();

    return EXIT_SUCCESS;
}
View Code

       

 

     

    

      

posted @ 2020-03-15 16:50  星光夜  阅读(39)  评论(0)    收藏  举报