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有三个点一个三角形,然后添加一个点和一个三角形,数据结构变化如图
添加点和单元后的结果图