VTK PolyData数据重构-添加point和cell

Method

对于已有polydata数据添加新增的点和单元并建立拓扑结构,可以利用polydata的两个方法来构建。
 
1. 添加点 point
vtkIdType InsertNextLinkedPoint(double x[3], int numLinks);
参数x[] 表示插入点的坐标,numLinks表示这个点被几个单元所使用(点与几个单元相关联)
返回点插入polydata后该点的id
 
2. 添加单元 cell
vtkIdType InsertNextLinkedCell(int type, int npts, vtkIdType *pts);
参数type表示插入单元的类型,npts表示插入单元所包含点的个数,*pts表示插入单元所包含点的id
返回单元插入polydata后该单元的id

Example:

#include "vtkPolyData.h"
#include "vtkPoints.h"
#include "vtkTriangle.h"
#include "vtkCellArray.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"

int main()
{
    //create a polydata source
    vtkSmartPointer<vtkPoints> points =
        vtkSmartPointer<vtkPoints>::New();
    points->InsertNextPoint(0.0, 0.0, 0.0);
    points->InsertNextPoint(1.0, 0.0, 0.0);
    points->InsertNextPoint(0.0, 1.0, 0.0);
    vtkSmartPointer<vtkTriangle> triangle =
        vtkSmartPointer<vtkTriangle>::New();
    triangle->GetPointIds()->SetNumberOfIds(3);
    triangle->GetPointIds()->SetId(0, 0);
    triangle->GetPointIds()->SetId(1, 1);
    triangle->GetPointIds()->SetId(2, 2);
    vtkSmartPointer<vtkCellArray> cells =
        vtkSmartPointer<vtkCellArray>::New();
    cells->InsertNextCell(triangle);
    vtkSmartPointer<vtkPolyData> polydata =
        vtkSmartPointer<vtkPolyData>::New();
    polydata->SetPoints(points);
    polydata->SetPolys(cells);
    polydata->BuildLinks();//construct topology
    cout << "-Original data-\n" << "Number of points: " << polydata->GetNumberOfPoints() << endl;
    cout << "Number of cells : " << polydata->GetNumberOfCells() << endl;

    //add point and cell
    double p[3] = { 1.0, 1.0, 0.0 };
    vtkIdType pid = polydata->InsertNextLinkedPoint(p, 1);
    vtkIdType ptids[3] = { 1, 2, pid };
    polydata->InsertNextLinkedCell(VTK_TRIANGLE, 3, ptids);
    cout << "\n-Add point and cell-\n" << "Number of points: " << polydata->GetNumberOfPoints() << endl;
    cout << "Number of cells : " << polydata->GetNumberOfCells() << endl;

    //renderer data
    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.5, 0.5);
    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetSize(640, 480);
    renderWindow->Render();
    renderWindow->SetWindowName("Add point and cell");
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderWindow->Render();
    renderWindowInteractor->Start();

    system("pause");
    return EXIT_SUCCESS;
}

Result

polydata有三个点一个三角形,然后添加一个点和一个三角形,数据结构变化如图
数据结构变化
 
添加点和单元后的结果图
添加点和单元后的结果图

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值