pcl+vtk(十二)使用vtkPolyData创建点、线、面(不规则面)、三角带

16 篇文章 3 订阅

一、前言

vtkPlaneSource创建平面,只可以创建平行四边形的平面,根据一个起点和两个终点创建法向量创建平面。但是当有创建多个点围成不规则平面的需求时,该怎么创建显示呢?

在网上查了资料,可以使用vtkPolyData拓扑结构。

二、拓扑结构

下面这篇文章很详细的说明了相关的知识理论,可以参考学习。

VTK 初步 (2) ----- 基本数据结构_vtkcellarray-CSDN博客

三、代码示例

1.点

//点
void Widget::on_point_clicked()
{
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> cellArray = vtkSmartPointer<vtkCellArray>::New();
    vtkIdType pid[12] = {0,1,2,3,4,5,6,7,8,9,10,11};
    points->InsertNextPoint(1, 1, 1);
    points->InsertNextPoint(1, 2, 0);
    points->InsertNextPoint(1, 1, -1);
    points->InsertNextPoint(1, -1, -1);
    points->InsertNextPoint(1, -2, 0);
    points->InsertNextPoint(1, -1, 1);
    points->InsertNextPoint(-1, 1, 1);
    points->InsertNextPoint(-1, 2, 0);
    points->InsertNextPoint(-1, 1, -1);
    points->InsertNextPoint(-1, -1, -1);
    points->InsertNextPoint(-1, -2, 0);
    points->InsertNextPoint(-1, -1, 1);
    cellArray->InsertNextCell(12,pid);

    vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
    polyData->SetPoints(points);
    polyData->SetVerts(cellArray);//点

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polyData);
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->GetProperty()->SetColor((float)255/255, (float)255/255, (float)0/255);
    actor->GetProperty()->SetPointSize(5);
    actor->SetMapper(mapper);

    renderer->AddActor(actor);

    renderer->ResetCamera();
    ui->vtk_widget->GetRenderWindow()->Render();
}

2.线

//线
void Widget::on_line_clicked()
{
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> cellArray = vtkSmartPointer<vtkCellArray>::New();
    vtkIdType pid[13] = {0,1,2,3,4,5,6,7,8,9,10,11,12};
    points->InsertNextPoint(1, 1, 1);
    points->InsertNextPoint(1, 2, 0);
    points->InsertNextPoint(1, 1, -1);
    points->InsertNextPoint(1, -1, -1);
    points->InsertNextPoint(1, -2, 0);
    points->InsertNextPoint(1, -1, 1);
    points->InsertNextPoint(-1, -1, 1);
    points->InsertNextPoint(-1, -2, 0);
    points->InsertNextPoint(-1, -1, -1);
    points->InsertNextPoint(-1, 1, -1);
    points->InsertNextPoint(-1, 2, 0);
    points->InsertNextPoint(-1, 1, 1);
    points->InsertNextPoint(1, 1, 1);
    cellArray->InsertNextCell(13,pid);

    vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
    polyData->SetPoints(points);
    polyData->SetLines(cellArray);//线

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polyData);
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->GetProperty()->SetColor((float)255/255, (float)0/255, (float)255/255);
    actor->GetProperty()->SetLineWidth(3);
    actor->SetMapper(mapper);

    renderer->AddActor(actor);

    renderer->ResetCamera();
    ui->vtk_widget->GetRenderWindow()->Render();
}

3.面

//面
void Widget::on_poly_clicked()
{
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> cellArray = vtkSmartPointer<vtkCellArray>::New();
    vtkIdType pid[6] = {0,1,2,3,4,5};
    points->InsertNextPoint(1, 1, 1);
    points->InsertNextPoint(1, 2, 0);
    points->InsertNextPoint(1, 1, -1);
    points->InsertNextPoint(1, -1, -1);
    points->InsertNextPoint(1, -2, 0);
    points->InsertNextPoint(1, -1, 1);
    cellArray->InsertNextCell(6,pid);

    vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
    polyData->SetPoints(points);
    polyData->SetPolys(cellArray);//面

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polyData);
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->GetProperty()->SetColor((float)0/255, (float)255/255, (float)255/255);
    actor->SetMapper(mapper);

    renderer->AddActor(actor);

    renderer->ResetCamera();
    ui->vtk_widget->GetRenderWindow()->Render();
}

4.多个面

//多个面
void Widget::on_cube_clicked()
{
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> cellArray = vtkSmartPointer<vtkCellArray>::New();
    vtkIdType pid[18] = {0,1,2,
                         0,2,3,
                         0,3,4,
                         0,4,5,
                         0,5,6,
                         0,6,1
                        };
    points->InsertNextPoint(0, 0, 0);
    points->InsertNextPoint(-1, -1, 1);
    points->InsertNextPoint(-1, -2, 0);
    points->InsertNextPoint(-1, -1, -1);
    points->InsertNextPoint(-1, 1, -1);
    points->InsertNextPoint(-1, 2, 0);
    points->InsertNextPoint(-1, 1, 1);
    cellArray->InsertNextCell(18,pid);
    vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
    polyData->SetPoints(points);
    polyData->SetPolys(cellArray);//面

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polyData);
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->GetProperty()->SetColor((float)128/255, (float)128/255, (float)128/255);
    actor->SetMapper(mapper);

    renderer->AddActor(actor);

    renderer->ResetCamera();
    ui->vtk_widget->GetRenderWindow()->Render();
}

5.三角带

//三角带
void Widget::on_strip_clicked()
{
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> cellArray = vtkSmartPointer<vtkCellArray>::New();
    vtkIdType pid[12] = {0,1,2,3,4,5,6,7,8,9,10,11};
    points->InsertNextPoint(1, 1, 1);
    points->InsertNextPoint(1, 2, 0);
    points->InsertNextPoint(1, 1, -1);
    points->InsertNextPoint(1, -1, -1);
    points->InsertNextPoint(1, -2, 0);
    points->InsertNextPoint(1, -1, 1);
    points->InsertNextPoint(-1, 1, 1);
    points->InsertNextPoint(-1, 2, 0);
    points->InsertNextPoint(-1, 1, -1);
    points->InsertNextPoint(-1, -1, -1);
    points->InsertNextPoint(-1, -2, 0);
    points->InsertNextPoint(-1, -1, 1);
    cellArray->InsertNextCell(12,pid);

    vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
    polyData->SetPoints(points);
    polyData->SetStrips(cellArray);//三角带

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polyData);
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->GetProperty()->SetColor((float)255/255, (float)128/255, (float)128/255);
    actor->GetProperty()->SetPointSize(3);
    actor->SetMapper(mapper);

    renderer->AddActor(actor);

    renderer->ResetCamera();
    ui->vtk_widget->GetRenderWindow()->Render();
}

总体

资源见https://download.csdn.net/download/m0_67254672/88955839?spm=1001.2014.3001.5501

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
VTKvtkPolyDataVTK中的一个重要接口,它用于表示和操作多边形数据。vtkPolyData的数据结构包含了顶线段、多边形等几何元素,并且支持属性数据的附加。通过vtkPolyData接口,我们可以进行各种几何操作,如创建、修改、查询和可视化多边形数据。 引用提到了vtkPolyData的重要性,掌握了vtkPolyData的数据结构和相关方法可以更好地理解VTK。这个接口的方法包括添加几何元素、修改属性数据、进行几何操作等,可以通过官方文档或相关教程学习和了解。 如果你想将vtkUnstructuredGrid转换为vtkPolyData,可以参考引用中提供的方法。这个过程涉及重新构建输入vtkPolyData数据的Mesh数据,具体的步骤可以在文章中找到。 另外,引用提供了一篇介绍VTK的文章,可以作为参考。VTK是一个开源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。它的内核是用C构建的,支持多种编程语言的调用,如Java、Tcl/Tk和Python。 总之,VTKvtkPolyData是用于表示和操作多边形数据的接口,可以通过学习相关文档和教程来深入了解其数据结构和方法。同时,可以通过转换方法将其他数据类型转换为vtkPolyData进行处理和可视化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [VTK-vtkPolyData解读](https://blog.csdn.net/qq_40041064/article/details/127959529)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [VTK基础教程(1)- vtkPolyData 介绍](https://blog.csdn.net/qq_35769071/article/details/122671756)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值