三、单元与点集的创建与显示
一、说明
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; }
显示结果:

四、程序分析
程序数据对象为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; }

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; }

纵一苇之所如,临万顷之茫然。

浙公网安备 33010602011771号