01-vtkLine的使用
一、需求
1. 需求 : 根据节点的三维顶点(x,y,z)信息和每条线段的两个端点的节点编号(例如 line1的两个端点是1和4号节节点)
2. 文本文件数据:
1.2.1 线段数据文件 outE2nfile.txt (示例中只给出前三条线段)
![]()
1.2.2 节点数据文件 outPointsFileData.txt (示例中只显示前10个节点数据)

二、代码
void MainFirstWindow::showModel(){ // 数据读取 vtkSmartPointer<vtkPoints> m_points = vtkSmartPointer<vtkPoints>::New(); // 新建存储所有节点数据的类 vtkSmartPointer<vtkCellArray> m_cells = vtkSmartPointer<vtkCellArray>::New(); // 创建存储所有单元数据的类 vtkSmartPointer<vtkCellArray> tree_cells = vtkSmartPointer<vtkCellArray>::New(); // 创建存储单元数据的类 // 读取节点 string pointsFileFullName = "D:/files/outPointsFileData.txt"; // 节点数据文件 TxtFileReader* modelTxtFileReader = new TxtFileReader(); // 创建读取数据的类 modelTxtFileReader->SetPointsFileName(pointsFileFullName); modelTxtFileReader->ReadPointsFile(); // 读取节点数据 // 读取五棱柱所有线单元数据 string cellsFileFullName = "D:/files/outE2nfile.txt"; // 单元数据文件 modelTxtFileReader->SetCellsFileName(cellsFileFullName); modelTxtFileReader->ReadCellsFile(); // 读取单元数据 // 读入树的所有线单元数据 string treeFileFullName = "D:/files/outTreeNum.txt"; TxtFileReader* treeModelTxtFileReader = new TxtFileReader(); treeModelTxtFileReader->SetCellsFileName(treeFileFullName); treeModelTxtFileReader->ReadCellsFile(); // 数据存储 StorePoints* pointsStore = modelTxtFileReader->GetStorePoints(); StoreCells* cellsStore = modelTxtFileReader->GetStoreCells(); StoreCells* treeCellsStore = treeModelTxtFileReader->GetStoreCells(); //读入顶点数据 m_points->SetNumberOfPoints(40); int i = 0; while (i<pointsStore->GetNumberOfPoints()){ double* pointPosition = pointsStore->GetPointPosition(i+1); m_points->SetPoint(i,pointPosition[0], pointPosition[1], pointPosition[2]); // 将坐标存储进顶点类中 i++; } // 读取线单元数据 i= 0; m_cells->SetNumberOfCells(184); // 读入五棱柱的线段数据 while (i<cellsStore->GetNumberOfCells()) { int * cellPoints = cellsStore->GetCellById(i+1); if(i>=0){ vtkSmartPointer<vtkLine> line= vtkSmartPointer<vtkLine>::New(); line->GetPointIds()->SetId(0,cellPoints[0]-1); line->GetPointIds()->SetId(1,cellPoints[1]-1); m_cells->InsertNextCell(line); } i++; } // 读入树的所有线单元数据 tree_cells->SetNumberOfCells(39); i = 0; while (i<treeCellsStore->GetNumberOfCells())//读入树数据 { int * treeCells = treeCellsStore->GetCellById(i+1); int * tcellPoints = cellsStore->GetCellById(treeCells[0]); if(i>=0){ vtkSmartPointer<vtkLine> line= vtkSmartPointer<vtkLine>::New(); line->GetPointIds()->SetId(0,tcellPoints[0]-1); line->GetPointIds()->SetId(1,tcellPoints[1]-1); tree_cells->InsertNextCell(line); } i++; } // 树渲染 vtkSmartPointer<vtkPolyData> t_polyData = vtkSmartPointer<vtkPolyData>::New(); t_polyData->SetPoints(m_points); t_polyData->SetLines(tree_cells); vtkSmartPointer<vtkPolyDataMapper> t_mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); t_mapper->SetInputData(t_polyData); vtkSmartPointer<vtkActor> t_actor = vtkSmartPointer<vtkActor>::New(); t_actor->SetMapper(t_mapper); t_actor->SetOrigin(0,0,0); t_actor->GetProperty()->SetColor(0.1, 1, 0.1); // 五棱柱数据渲染 vtkSmartPointer<vtkPolyData> m_polyData = vtkSmartPointer<vtkPolyData>::New(); m_polyData->SetPoints(m_points); m_polyData->SetLines(m_cells); vtkSmartPointer<vtkPolyDataMapper> m_mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); m_mapper->SetInputData(m_polyData); vtkSmartPointer<vtkActor> m_actor = vtkSmartPointer<vtkActor>::New(); m_actor->SetMapper(m_mapper); m_actor->SetOrigin(0,0,0); m_actor->GetProperty()->SetColor(0.75, 0.75, 0.75);// 图像颜色设置 // 将树和五棱柱渲染效果显示在窗口中 first_renderWindow = ui->qvtkWidget->GetRenderWindow(); renTrangle = vtkSmartPointer<vtkRenderer>::New(); // 创建新舞台 renTrangle->SetBackground(0, 0, 0); renTrangle->AddActor(m_actor); // 五棱柱 renTrangle->AddActor(t_actor); // 树 first_renderWindow->AddRenderer(renTrangle); first_renderWindowInteractor = ui->qvtkWidget->GetRenderWindow()->GetInteractor();// 交互类 first_renderWindowInteractor->SetRenderWindow(first_renderWindow); vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New(); first_renderWindowInteractor->SetInteractorStyle(style); first_renderWindowInteractor->Render(); }
三、显示效果
3.1 绿色标识为树的线段,白色标识为五棱柱的线段

3.2 单独显示五棱柱效果图
上述代码将 renTrangle->AddActor(t_actor); // 树 这一行注释即可

3.3 单独显示树效果图
上述代码将 renTrangle->AddActor(m_actor); // 五棱柱 这一行注释即可


浙公网安备 33010602011771号