问题:
有128个三角单元,知道每个单元上节点的坐标,如何用vtk画出来,问题出在polyData上。在下不知所措,请教各位。
void vtkPlotCell(int node_num, int cell_num, double (*node)[2], int (*cell)[3], double *sol)
{
vtkSmartPointer<vtkCellArray> triangles = vtkSmartPointer<vtkCellArray>::New();
vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
for (int m = 0; m < cell_num; m++) {
int i = cell[m][0];
int j = cell[m][1];
int k = cell[m][2];
double xi = node[i][0];
double yi = node[i][1];
double zi = sol[i];
double xj = node[j][0];
double yj = node[j][1];
double zj = sol[j];
double xk = node[k][0];
double yk = node[k][1];
double zk = sol[k];
cout<<"i: "<<"x = "<<xi<<" y = "<<yi<<" z = "<<zi<<endl;
cout<<"j: "<<"x = "<<xj<<" y = "<<yj<<" z = "<<zj<<endl;
cout<<"k: "<<"x = "<<xk<<" y = "<<yk<<" z = "<<zk<<endl;
points->InsertNextPoint(xi, yi, zi);
points->InsertNextPoint(xj, yj, zj);
points->InsertNextPoint(xk, yk, zk);
vtkSmartPointer<vtkPoints> points_temp = vtkSmartPointer<vtkPoints>::New();
points_temp->InsertNextPoint(xi, yi, zi);
points_temp->InsertNextPoint(xj, yj, zj);
points_temp->InsertNextPoint(xk, yk, zk);
vtkSmartPointer<vtkTriangle> triangle = vtkSmartPointer<vtkTriangle>::New();
triangle->GetPointIds()->SetId(0,0);
triangle->GetPointIds()->SetId(1,1);
triangle->GetPointIds()->SetId(2,2);
triangles->InsertNextCell(triangle);
}
polyData->SetPoints(points);
polyData->SetPolys(triangles);
cout<<"cell_num = "<<cell_num<<endl;
cout<<"There are "<< polyData->GetNumberOfCells()<<" cells."<<endl;
cout<<"There are "<< polyData->GetNumberOfPoints()<<" points."<<endl;
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
//下面是显示mapper
#if VTK_MAJOR_VERSION <= 5
mapper->SetInput(polyData);
#else
mapper->SetInputData(polyData);
#endif
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetPointSize(1.0);
actor->GetProperty()->SetColor(1.0, 1.0, 1.0);
renderer->AddActor(actor);
renderer->SetBackground(0.0,0.0,0.0);
//display xyz-axes
vtkSmartPointer<vtkCubeAxesActor> cubeAxesActor = vtkSmartPointer<vtkCubeAxesActor>::New();
cubeAxesActor->SetBounds(polyData->GetBounds());
cubeAxesActor->SetCamera(renderer->GetActiveCamera());
cubeAxesActor->GetTitleTextProperty(0)->SetColor(1.0, 0.0, 0.0);
cubeAxesActor->GetLabelTextProperty(0)->SetColor(1.0, 0.0, 0.0);
cubeAxesActor->GetTitleTextProperty(1)->SetColor(0.0, 1.0, 0.0);
cubeAxesActor->GetLabelTextProperty(1)->SetColor(0.0, 1.0, 0.0);
cubeAxesActor->GetTitleTextProperty(2)->SetColor(0.0, 0.0, 1.0);
cubeAxesActor->GetLabelTextProperty(2)->SetColor(0.0, 0.0, 1.0);
cubeAxesActor->DrawXGridlinesOn();
cubeAxesActor->DrawYGridlinesOn();
cubeAxesActor->DrawZGridlinesOn();
#if VTK_MAJOR_VERSION == 6
cubeAxesActor->SetGridLineLocation(VTK_GRID_LINES_FURTHEST);
#endif
#if VTK_MAJOR_VERSION > 6
cubeAxesActor->SetGridLineLocation(cubeAxesActor->VTK_GRID_LINES_FURTHEST);
#endif
cubeAxesActor->XAxisMinorTickVisibilityOff();
cubeAxesActor->YAxisMinorTickVisibilityOff();
cubeAxesActor->ZAxisMinorTickVisibilityOff();
renderer->AddActor(cubeAxesActor);
renderer->GetActiveCamera()->Azimuth(30);
renderer->GetActiveCamera()->Elevation(30);
renderer->ResetCamera();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindow->Render();
renderWindowInteractor->Start();
}
有128个三角单元,知道每个单元上节点的坐标,如何用vtk画出来,问题出在polyData上。在下不知所措,请教各位。
void vtkPlotCell(int node_num, int cell_num, double (*node)[2], int (*cell)[3], double *sol)
{
vtkSmartPointer<vtkCellArray> triangles = vtkSmartPointer<vtkCellArray>::New();
vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
for (int m = 0; m < cell_num; m++) {
int i = cell[m][0];
int j = cell[m][1];
int k = cell[m][2];
double xi = node[i][0];
double yi = node[i][1];
double zi = sol[i];
double xj = node[j][0];
double yj = node[j][1];
double zj = sol[j];
double xk = node[k][0];
double yk = node[k][1];
double zk = sol[k];
cout<<"i: "<<"x = "<<xi<<" y = "<<yi<<" z = "<<zi<<endl;
cout<<"j: "<<"x = "<<xj<<" y = "<<yj<<" z = "<<zj<<endl;
cout<<"k: "<<"x = "<<xk<<" y = "<<yk<<" z = "<<zk<<endl;
points->InsertNextPoint(xi, yi, zi);
points->InsertNextPoint(xj, yj, zj);
points->InsertNextPoint(xk, yk, zk);
vtkSmartPointer<vtkPoints> points_temp = vtkSmartPointer<vtkPoints>::New();
points_temp->InsertNextPoint(xi, yi, zi);
points_temp->InsertNextPoint(xj, yj, zj);
points_temp->InsertNextPoint(xk, yk, zk);
vtkSmartPointer<vtkTriangle> triangle = vtkSmartPointer<vtkTriangle>::New();
triangle->GetPointIds()->SetId(0,0);
triangle->GetPointIds()->SetId(1,1);
triangle->GetPointIds()->SetId(2,2);
triangles->InsertNextCell(triangle);
}
polyData->SetPoints(points);
polyData->SetPolys(triangles);
cout<<"cell_num = "<<cell_num<<endl;
cout<<"There are "<< polyData->GetNumberOfCells()<<" cells."<<endl;
cout<<"There are "<< polyData->GetNumberOfPoints()<<" points."<<endl;
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
//下面是显示mapper
#if VTK_MAJOR_VERSION <= 5
mapper->SetInput(polyData);
#else
mapper->SetInputData(polyData);
#endif
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetPointSize(1.0);
actor->GetProperty()->SetColor(1.0, 1.0, 1.0);
renderer->AddActor(actor);
renderer->SetBackground(0.0,0.0,0.0);
//display xyz-axes
vtkSmartPointer<vtkCubeAxesActor> cubeAxesActor = vtkSmartPointer<vtkCubeAxesActor>::New();
cubeAxesActor->SetBounds(polyData->GetBounds());
cubeAxesActor->SetCamera(renderer->GetActiveCamera());
cubeAxesActor->GetTitleTextProperty(0)->SetColor(1.0, 0.0, 0.0);
cubeAxesActor->GetLabelTextProperty(0)->SetColor(1.0, 0.0, 0.0);
cubeAxesActor->GetTitleTextProperty(1)->SetColor(0.0, 1.0, 0.0);
cubeAxesActor->GetLabelTextProperty(1)->SetColor(0.0, 1.0, 0.0);
cubeAxesActor->GetTitleTextProperty(2)->SetColor(0.0, 0.0, 1.0);
cubeAxesActor->GetLabelTextProperty(2)->SetColor(0.0, 0.0, 1.0);
cubeAxesActor->DrawXGridlinesOn();
cubeAxesActor->DrawYGridlinesOn();
cubeAxesActor->DrawZGridlinesOn();
#if VTK_MAJOR_VERSION == 6
cubeAxesActor->SetGridLineLocation(VTK_GRID_LINES_FURTHEST);
#endif
#if VTK_MAJOR_VERSION > 6
cubeAxesActor->SetGridLineLocation(cubeAxesActor->VTK_GRID_LINES_FURTHEST);
#endif
cubeAxesActor->XAxisMinorTickVisibilityOff();
cubeAxesActor->YAxisMinorTickVisibilityOff();
cubeAxesActor->ZAxisMinorTickVisibilityOff();
renderer->AddActor(cubeAxesActor);
renderer->GetActiveCamera()->Azimuth(30);
renderer->GetActiveCamera()->Elevation(30);
renderer->ResetCamera();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindow->Render();
renderWindowInteractor->Start();
}