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); // 五棱柱 这一行注释即可

 

posted @ 2021-10-21 15:17  微~粒  阅读(554)  评论(0)    收藏  举报