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

news2024/12/23 20:30:25

一、前言

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();
}

总体

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1251399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux-Ubuntu环境下搭建SVN服务器

Linux-Ubuntu环境下搭建SVN服务器 一、背景二、前置工作2.1确定IP地址保持不变2.2关闭防火墙 三、安装SVN服务器四、修改SVN服务器版本库目录五、调整SVN配置5.1查看需要修改的配置文件5.2修改svnserve.conf文件5.3修改passwd文件&#xff0c;添加账号和密码&#xff08;window…

各种工具的快捷键或命令

前言 这里就存放自己存有的一些小工具的地址以及工具的命令。 正文 零、各种小工具 1、wizTree:磁盘分析工具-分析磁盘的文件夹存储 2、稻壳阅读器&#xff1a;有黑色背景 3、youtube 视频下载&#xff1a;https://zh.savefrom.net/226/ 4、视频录制&#xff1a;Bandica…

lv11 嵌入式开发 GPIO实验 9

目录 1 简介 1.1 GPIO 2 LED实验步骤 2.1 通过电路原理图分析LED的控制逻辑 2.2 通过电路原理图查找LED与Exynos4412的连接关系 2.3 通过数据手册分析GPIO中哪些寄存器可以控制LED 2.4 通过程序去操控对应的寄存器完成对LED的控制 2.4.1 使用寄存器写入…

基于51单片机的交通信号灯系统【程序+proteus仿真+参考论文+AD原理图等16个文件夹资料】

一、项目功能简介 整个设计系统由STC89C52单片机数码管显示模块LED指向灯模块三线八线译码器模块按键模块组成。 具体功能&#xff1a; 1、东西向、南北向依次进行周期通行&#xff0c;默认设置为&#xff1a;东西向直行&#xff08;绿灯&#xff09;时间30秒&#xff0c;左转…

案例精选|聚铭网络流量智能分析审计系统加强南京市溧水区人社局信息安全防护能力

一字排开的社保综合服务窗口、实时滚动的数“智”人社大屏、便捷快速的社保卡自助服务机……每位到溧水市民中心人社大厅进行业务办理的市民对高效的社保服务经办效率赞叹不已。 党的二十大报告提出&#xff0c;健全覆盖全民、统筹城乡、公平统一、安全规范、可持续的多层次社…

AI和人工智能与机器学习全景报告

今天分享的是AI系列深度研究报告&#xff1a;《AI和人工智能与机器学习全景报告》。 &#xff08;报告出品方&#xff1a;appen&#xff09; 报告共计&#xff1a;30页 获取 数据获取仍是AI应用构建团队的主要瓶颈。 原因各不相同。例如&#xff0c;特定用例的数据可能不足…

【数据结构】树与二叉树(廿三):树和森林的遍历——层次遍历(LevelOrder)

文章目录 5.3.1 树的存储结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法5.3.3 树和森林的遍历1. 先根遍历&#xff08;递归、非递归&#xff09;2. 后根遍历&#xff08;递归、非递归&#xff09;3. 森林的遍历4. 层次遍历a. 算法LevelOrderb. 算法解读c. 时间复杂度d.代码…

试写一算法将两个递增有序的带头结点的单链表合并为一个递增有序的带头结点的单链表。(利用原表结点空间)

试写一算法将两个递增有序的带头结点的单链表合并为一个递增有序的带头结点的单链表。 &#xff08;利用原表结点空间&#xff09; 比如现在要将下面两个链表合并&#xff0c;这里是要求利用原表空间 我们先创建一个辅助的链表L3&#xff0c;用p和q分别标记L1和L2的数据元素&…

macOS unlocker 4.0.5 for VMware ESXi 7.0

正文共&#xff1a;555 字 6 图&#xff0c;预估阅读时间&#xff1a;1 分钟 我们前面在macOS上已经折腾了好久了&#xff0c;包括黑苹果的安装&#xff08;老树发新芽&#xff0c;ACER TM4750G装黑苹果&#xff09;、macOS的安装&#xff08;VMware ESXI部署macOS&#xff08…

【React】打包体积分析 source-map-explorer

通过分析打包体积&#xff0c;才能知道项目中的哪部分内容体积过大&#xff0c;方便知道哪些包需要进一步优化。 使用步骤 安装分析打包体积的包&#xff1a;npm i source-map-explorer在 package.json 中的 scripts 标签中&#xff0c;添加分析打包体积的命令对项目打包&…

人工智能面面观

人工智能简介 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使计算机能够模拟和执行人类智能任务的科学和技术领域。它致力于开发能够感知、理解、学习、推理、决策和与人类进行交互的智能系统。人工智能的背景可以追溯到上世纪50…

2023最全的Web自动化测试介绍

做测试的同学们都了解&#xff0c;做Web自动化&#xff0c;我们主要用Selenium或者是QTP。 有的人可能就会说&#xff0c;我没这个Java基础&#xff0c;没有Selenium基础&#xff0c;能行吗&#xff1f;测试虽然属于计算机行业&#xff0c;但其实并不需要太深入的编程知识&…

Mindomo Desktop for Mac免费思维导图软件,助您高效整理思维

思维导图是一种强大的工具&#xff0c;可以帮助我们整理思维、提高记忆力、激发创造力。而Mindomo Desktop for Mac作为一款免费的思维导图软件&#xff0c;能够帮助我们更高效地进行思维整理和项目管理。在本文中&#xff0c;我们将介绍Mindomo Desktop for Mac的功能和优势&a…

数据结构与算法编程题24

中序遍历非递归算法 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct BiTNode {ElemType data;BiTNode* lchild, * rchild; }B…

pop链反序列化 [MRCTF2020]Ezpop1

打开题目 网站源码为 Welcome to index.php <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack It! class Modifier {protected …

IDEA中JDK21控制台打印的中文乱码

IDEA中&#xff0c;使用的JDK21&#xff0c;控制台打印中文乱码&#xff0c;解决办法是重装了一下JDK。 我之前安装的版本是“jdk-21_windows-x64_bin.exe”&#xff0c;我配置了多个JDK环境&#xff0c;所以使用的是安装文件进行安装的。这次解决乱码问题&#xff0c;我重新安…

如何获得微软MVP徽章

要成为微软MVP&#xff0c;需要在特定领域成为专家&#xff0c;并积极参与社区&#xff0c;为其他人提供帮助和支持。以下是一些步骤可以帮助你成为MVP&#xff1a; 在特定领域成为专家&#xff1a;要成为MVP&#xff0c;需要在某个领域具有专业知识和经验。这可以通过阅读相关…

多线程详解(未完结)

文章目录 ⭐️写在前面的话⭐️一、线程简介1.1 进程1.2 线程1.3 多线程和多进程的区别1.4 总结 二、继承实现2.1 继承Thread类例子&#xff1a;网图下载 2.2 实现Runnable接口 (推荐)案例&#xff1a;火车站买票问题案例&#xff1a;龟兔赛跑 2.3 实现Callable接口 (了解即可)…

ArkTs变量类型、数据类型

可以参考官网学习路径学习HarmonyOS第一课|应用开发视频教程学习|HarmonyOS应用开发官网 一、变量 1、ArkTS语言 ArkTS是华为自研的开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等相应的…