本文主要是介绍直线与面片同时可视化(VTK),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
思路:将面片与直线同时放入一个对象中
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCellArray.h>
#include <vtkFloatArray.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkInteractorStyleTrackballActor.h>
#include <vtkExtractEdges.h>
#include<vector>
using namespace std;
typedef vtkActorCollection* vtkActorCollection_Array;#include <vtkLine.h>#include <vtkCellData.h>
#include <vtkProperty.h>
#include<vtkPolyLine.h>
#include<vtkLineSource.h>
#include<vtkDataSetMapper.h>
struct mypoint3d
{double x;double y;double z;
};vtkSmartPointer<vtkDataSetMapper> Creatline(mypoint3d p1, mypoint3d p2)
{vtkSmartPointer<vtkLineSource> lineSource = vtkSmartPointer<vtkLineSource>::New();double pp1[3] = { p1.x, p1.y, p1.z };double pp2[3] = { p2.x, p2.y, p2.z };lineSource->SetPoint1(pp1);lineSource->SetPoint2(pp2);lineSource->Update();vtkSmartPointer<vtkDataSetMapper> line_mapper =vtkSmartPointer<vtkDataSetMapper>::New();line_mapper->SetInputConnection(lineSource->GetOutputPort());return line_mapper;
}int main()
{int i;//(1)构建立方体对象int cube_numberpoints = 8;float cube_x[8][3] = { { 0, 0, 0 }, { 1, 0, 0 }, { 1, 0, 1 }, { 0, 0, 1 }, { 0, 1, 0 }, { 1, 1, 0 }, { 1, 1, 1 }, { 0, 1, 1 } };vtkIdType cube_pts[6][4] = { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 2, 3, 7, 6 }, { 1, 0, 4, 5 }, { 0, 4, 7, 3 }, { 1, 2, 6, 5 } };vtkPolyData *cube = vtkPolyData::New();vtkCellArray *cube_polys = vtkCellArray::New();vtkFloatArray *cube_scalars = vtkFloatArray::New();vtkPoints *cube_points = vtkPoints::New();for (i = 0; i < cube_numberpoints; i++)//将点出入到点集容器中{cube_points->InsertPoint(i, cube_x[i]);}//6个面片,每个面片由4个点构成for (i = 0; i < 6; i++){cube_polys->InsertNextCell(4, cube_pts[i]);}for (i = 0; i < 8; i++){cube_scalars->InsertTuple1(i, i);}//接下来就开始了VTK的pipeline流程。cube->SetPoints(cube_points);cube->SetPolys(cube_polys);//cube->GetPointData()->SetScalars(cube_scalars);可以不显示颜色vtkExtractEdges *cube_extract = vtkExtractEdges::New();cube_extract->SetInputData(cube);vtkPolyDataMapper *cube_mapEdges = vtkPolyDataMapper::New();cube_mapEdges->SetInputConnection(cube_extract->GetOutputPort());cube_mapEdges->SetScalarVisibility(0);vtkActor *edgeActor = vtkActor::New();edgeActor->SetMapper(cube_mapEdges);edgeActor->VisibilityOn();vtkPolyDataMapper *cube_Mapper = vtkPolyDataMapper::New();cube_Mapper->SetInputData(cube);cube_Mapper->SetScalarRange(0, 1);//构建完立方体//(2)开始绘制线段//float cube_x[8][3] = { { 0, 0, 0 }, { 1, 0, 0 }, { 1, 0, 1 }, { 0, 0, 1 }, //{ 0, 1, 0 }, { 1, 1, 0 }, { 1, 1, 1 }, { 0, 1, 1 } };vector<vtkSmartPointer<vtkDataSetMapper>> lines;vtkSmartPointer<vtkDataSetMapper> temp;mypoint3d p1, p2, p3, p4, p5, p6, p7, p8;p1.x = 0; p1.y = 0; p1.z = 0;p2.x = 1; p2.y = 0; p2.z = 0;p3.x = 1; p3.y = 0; p3.z = 1;p4.x = 0; p4.y = 0; p4.z = 1;p5.x = 0; p5.y = 1; p5.z = 0;p6.x = 1; p6.y = 1; p6.z = 0;p7.x = 1; p7.y = 1; p7.z = 1;p8.x = 0; p8.y = 1; p8.z = 1;temp = Creatline(p1, p2); lines.push_back(temp);temp = Creatline(p1, p4); lines.push_back(temp);temp = Creatline(p1, p5); lines.push_back(temp);temp = Creatline(p2, p3); lines.push_back(temp);temp = Creatline(p2, p6); lines.push_back(temp);temp = Creatline(p3, p4); lines.push_back(temp);temp = Creatline(p3, p7); lines.push_back(temp);temp = Creatline(p4, p8); lines.push_back(temp);temp = Creatline(p5, p6); lines.push_back(temp);temp = Creatline(p5, p8); lines.push_back(temp);temp = Creatline(p6, p7); lines.push_back(temp);temp = Creatline(p7, p8); lines.push_back(temp);//(3)开始添加直线与立方体// cube_Mapper与line_mappervtkRenderer *renderer = vtkRenderer::New();//添加立方体vtkActor *cube_Actor = vtkActor::New();cube_Actor->SetPosition(0, 0, 0);cube_Actor->SetMapper(cube_Mapper);cube_Actor->GetProperty()->SetColor(0, 0, 1);renderer->AddActor(cube_Actor);//添加直线//12条直线for (int i = 0; i < lines.size(); i++){vtkActor *lineActor = vtkActor::New();lineActor->SetMapper(lines[i]);lineActor->GetProperty()->SetColor(0, 1, 0);lineActor->GetProperty()->SetLineWidth(2);renderer->AddActor(lineActor);}vtkCamera *camera = vtkCamera::New();camera->SetPosition(1, 1, 1);camera->SetFocalPoint(0, 0, 0);vtkRenderWindow *reWin = vtkRenderWindow::New();reWin->AddRenderer(renderer);vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();iren->SetRenderWindow(reWin);renderer->SetActiveCamera(camera);renderer->ResetCamera();renderer->SetBackground(0, 1, 1);reWin->SetSize(300, 300);reWin->Render();iren->Initialize();iren->Start();return 0;}
这篇关于直线与面片同时可视化(VTK)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!