vtk之【vtkPolyData、vtkCell、vtkPoints】

文章目录

  • 一,vtkPolyData、cell、point
    • 1) 例子
    • 2) vtkPolyData、vtkCell、vtkPoints
  • 二,vtkNew<>与vtkSmartPointer<>的区别:
  • 三,补充

一,vtkPolyData、cell、point

1) 例子

  /*** vtkNew 是一个类模板* vtkNew<> 是一个简单的 RAII(Resource Acquisition Is Initialization)(资源获取即初始化)类模板,用于在堆上创建对象,并负责对象的销毁。使用 vtkNew<> 创建的对象会自动在作用域结束时被销毁,无需手动调用 delete。** 你知道什么是类模板,什么是模板类吗?* 从字面意思看,类模板是一个模板,即class template;模板类是一个类,即 template class。* 简单的来讲:类模板就是一个定义,不能直接拿来用,还需要进行实例化,然后模板类就是类模板的实例化,类中的参数被实际类型所替代;(再简单来讲:没是实例化的叫类模板,实例化后的类模板是模板类)* 即:vtkNew是一个类模板,然后vtkNew<vtkNameColors>是模板类◆ vtkColor3d GetColor3d(const vtkStdString & 	name	):按名称获取颜色。
该名称被视为不区分大小写。颜色作为vtkColor3d类返回。如果找不到颜色,则返回黑色。*/vtkNew<vtkNamedColors> colors;/**** vtkPoints:vtkPoints表示3D点。vtkPoints的数据模型是一个vx-vy-vz三元组数组,可通过(点或单元)id访问。◆ vtkIdType vtkPoints::InsertNextPoint	(	double 	x,double 	y,double 	z )其实还都float的方法,但是cpp在你不指定的情况下,小数都是double类型源码:inline vtkIdType vtkPoints::InsertNextPoint(double x, double y, double z){double p[3] = { x, y, z };return this->Data->InsertNextTuple(p);}//vtkDataArray* Data;       // Array which represents data//InsertNextTuple的定义:
vtkIdType vtkDataArray::InsertNextTuple	(	vtkIdType 	srcTupleIdx,
vtkAbstractArray * 	source 
)	然后这个方法继承自vtkAbstractArray类virtual vtkIdType vtkAbstractArray::InsertNextTuple	(	vtkIdType 	srcTupleIdx,
vtkAbstractArray * 	source 
)		将srcTupleIdx中的元组插入到源数组的末尾。
注意,根据需要执行存储器分配以保持数据。返回插入数据的元组索引。****/vtkNew<vtkPoints> points;//构成图形的四个点points->InsertNextPoint(0.0, 0.0, 0.0);points->InsertNextPoint(1.0, 0.0, 0.0);points->InsertNextPoint(1.0, 1.0, 0.0);points->InsertNextPoint(0.0, 1.0, 0.0);// Create the polygon
/**
*vtkPolygon:表示n边多边形的像元
vtkPolygon是vtkCell的具体实现,用于表示2D n边多边形。多边形不能有任何内部孔,也不能自相交。定义n个点按逆时针方向排列的多边形;不要重复最后一点。
* GetPointIds函数继承自vtkCell类:vtkIdList* vtkCell::GetPointIds	(		)	
返回定义单元格的点ID列表。
vtkIdList* GetPointIds() { return this->PointIds; }void vtkIdList::SetNumberOfIds	(	vtkIdType 	number	)	
:指定此对象要保存的id数。void vtkIdList::SetId	(	vtkIdType 	i,
vtkIdType 	vtkid )
:在位置i设置id。
不做范围检查,所以它比InsertId快一点。确保在使用SetId()之前使用SetNumberOfIds()分配内存。typedef long long vtkIdType;typedef long vtkIdType;typedef int vtkIdType;
void SetId(vtkIdType i, vtkIdType vtkid) VTK_EXPECTS(0 <= i && i < GetNumberOfIds())
{this->Ids[i] = vtkid;
}//解释:VTK_EXPECTS(0 <= i && i < GetNumberOfIds()): 这是一个断言宏,用于在运行时检查条件是否满足。在这里,断言确保传入的索引值 i 大于等于 0 并且小于多边形点索引数组的大小。
**/vtkNew<vtkPolygon> polygon;polygon->GetPointIds()->SetNumberOfIds(4); // make a quadpolygon->GetPointIds()->SetId(0, 0);polygon->GetPointIds()->SetId(1, 1);polygon->GetPointIds()->SetId(2, 2);polygon->GetPointIds()->SetId(3, 3);//如果你对这里有疑问:可以看一下下面的图1与图2/**************vtkCellArray : 对象来表示像元连通性
tkCellArray 用于表示数据集的拓扑结构,它通过一个显式的连接表来存储每个单元所包含的点的标识。在内部,连接表由两个数组表示:Offsets 和 Connectivity。Offsets 是一个长度为 [numCells+1] 的数组,表示每个单元的点在 Connectivity 数组中的起始索引位置。最后一个值始终是 Connectivity 数组的长度。Connectivity 数组存储每个单元的点标识列表。因此,对于包含 2 个三角形、一个四边形和一条线的数据集,内部数组将如下所示:我不太理解下面这个拓扑结构和当前状态的vtkCellArray是什么意思??????????????????????????????????拓扑结构:
单元 0: 三角形 | 点标识:{0, 1, 2}
单元 1: 三角形 | 点标识:{5, 7, 2}
单元 2: 四边形 | 点标识:{3, 4, 6, 7}
单元 3: 线 | 点标识:{5, 8}vtkCellArray(当前状态):
Offsets: {0, 3, 6, 10, 12}
Connectivity: {0, 1, 2, 5, 7, 2, 3, 4, 6, 7, 5, 8}vtkIdType vtkCellArray::InsertNextCell	(	vtkCell * 	cell	)	
作用:Insert a cell object.
Return the cell id of the cell.
源码:
inline vtkIdType vtkCellArray::InsertNextCell(vtkCell* cell){vtkIdList* pts = cell->GetPointIds();return this->Visit(vtkCellArray_detail::InsertNextCellImpl{}, pts->GetNumberOfIds(), pts->GetPointer(0));}******************/vtkNew<vtkCellArray> polygons;polygons->InsertNextCell(polygon);//vtkNew<vtkPolygon> polygon;polygon是vtkNew<vtkPolygon>,但是可以作为vtkCell*类型的参数(因为vtkPolygon是vtkCell的子类)
//总结一下:这两行代码的作用是存储数据集合的拓扑结构,即单元(cell)的连接关系,polygon就是我们写好的拓扑结构// Create a PolyDatavtkNew<vtkPolyData> polygonPolyData;polygonPolyData->SetPoints(points);//将坐标点给到PolydatapolygonPolyData->SetPolys(polygons);//再将这些坐标的拓扑结构给到Polydata(我理解的是坐标的连接顺序)//既然知道了坐标,也知道了坐标怎么连接,那么这个Polydata就算封装完成了//然后就是:通过mapper得到可渲染的图元数据,再通过actor得到可渲染的图元,最后将actor加入到渲染器// Create a mapper and actorvtkNew<vtkPolyDataMapper> mapper;mapper->SetInputData(polygonPolyData);vtkNew<vtkActor> actor;actor->SetMapper(mapper);actor->GetProperty()->SetColor(colors->GetColor3d("Silver").GetData());// VisualizevtkNew<vtkRenderer> renderer;vtkNew<vtkRenderWindow> renderWindow;renderWindow->SetWindowName("Polygon");renderWindow->AddRenderer(renderer);vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;renderWindowInteractor->SetRenderWindow(renderWindow);renderer->AddActor(actor);renderer->SetBackground(colors->GetColor3d("Salmon").GetData());//设置背景颜色renderWindow->Render();renderWindowInteractor->Start();

图1.png

图2.png

2) vtkPolyData、vtkCell、vtkPoints

https://vtk.org/doc/nightly/html/classvtkPolyData.html

https://vtk.org/doc/nightly/html/classvtkCell.html

https://vtk.org/doc/nightly/html/classvtkPoints.html

二,vtkNew<>与vtkSmartPointer<>的区别:

举个例子:同样是构造窗口交互器

vtkSmartPointer<>的写法:
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkNew<vtkRenderWindowInteractor>的写法:
vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;

简单的来说 , vtkNew没有引用计数,而vtkSmartPointer有引用计数的机制

vtkNew和vtkSmartPointer都用于VTK(可视化工具包)中对象的创建和管理。但是,两者之间确实存在着一些主要的区别 :

  • vtkNew 用于在堆上创建一个新的 VTK 对象并保持其所有权。当 vtkNew 对象超出范围时,它将删除其相关联的 VTK 对象。但请注意,vtkNew 不支持引用计数

  • 相反,vtkSmartPointer 是一个智能指针,用于维护VTK对象的引用计数。当一个 vtkSmartPointer 指向一个 VTK 对象时,该对象的引用计数增加1。当 vtkSmartPointer 在超出范围或被重新分配到另一个对象时,原来的VTK对象的引用计数减少1。如果VTK对象的引用计数变为0,那么这个对象就会被删除。

所以,在需要使用引用计数机制进行内存管理的情况下,我们通常会选择使用 vtkSmartPointer 而不是 vtkNew。

然后 , vtk的作者 更加支持使用vtkSmartPointer<>
对于 V T K 库中的对象管理,推荐使用 v t k S m a r t P o i n t e r < > 来避免内存泄漏和悬挂指针等问题。 对于VTK库中的对象管理,推荐使用vtkSmartPointer<>来避免内存泄漏和悬挂指针等问题。 对于VTK库中的对象管理,推荐使用vtkSmartPointer<>来避免内存泄漏和悬挂指针等问题。

三,补充

这里还有一篇大佬的文章:把上面的那个搞懂了,下面这个大佬写的网格分割的例子就不那么难理解了

https://blog.csdn.net/liushao1031177/article/details/118151714#comments_29088179

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

策略模式与模板方法结合案例

一、背景 上周在迁移项目MQ工程的时候&#xff0c;重新Review代码&#xff0c;发现有一段代码综合使用了策略模式和模板方法&#xff0c;下面讲解一下具体场景应用的思路。 二、模板方法 策略模式前段时间有一个关于库存具体案例&#xff0c;详见 库存管理与策略模式。 模板…

基于FastAPI的文件上传和下载

基于FastAPI的文件上传和下载 一、前言 为了实现ASR的可视化界面&#xff0c;在各个博客中寻觅了一波找找文件上传和下载的例子&#xff0c;没有找到能完整实现这个功能的&#xff0c;有也只是有一部分&#xff08;菜菜求捞捞&#xff09;&#xff0c;看了甚是烦恼&#xff0…

CMAKE使用记录

CMAKE使用记录 CMake简化了针对同一项目的不同平台、不同编译器的构建过程和编译过程&#xff0c;能够管理各种规模的项目。 CMAKE命令记录 cmake命令说明 语法&#xff1a; # cmake构建项目的编译系统 Generate a Project Buildsystem > cmake [<options>] -B &…

华为云云耀云服务器L实例评测|Ubuntu云锁防火墙安装搭建使用

华为云云耀云服务器L实例评测&#xff5c;Ubuntu安装云锁防火墙对抗服务器入侵和网络攻击 1.前言概述 华为云耀云服务器L实例是新一代开箱即用、面向中小企业和开发者打造的全新轻量应用云服务器。多种产品规格&#xff0c;满足您对成本、性能及技术创新的诉求。云耀云服务器L…

DRM全解析 —— CRTC详解(1)

本文参考以下博文&#xff1a; Linux内核4.14版本——drm框架分析(4)——crtc分析 特此致谢&#xff01; 1. 简介 CRTC实际上可以拆分为CRTC。CRT的中文意思是阴极摄像管&#xff0c;就是当初老电视上普遍使用的显像管&#xff08;老电视之所以都很厚&#xff0c;就是因为它…

基于水循环优化的BP神经网络(分类应用) - 附代码

基于水循环优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于水循环优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.水循环优化BP神经网络3.1 BP神经网络参数设置3.2 水循环算法应用 4.测试结果&#x…

TomCat关键技术

一、Tomcat 是什么 Tomcat 是一个 HTTP 服务器。通过前面的学习,我们知道HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式,同时也通过 ajax 和 Java Socket 分别构造了 HTTP 客户端。HTTP 服务器我们也同样可以通过 Java Socket 来实现. 而 Tomcat 就是基于 J…

烟花爆竹厂如何做到0风险0爆炸事故?AI+视频监控平台给出答案

由于烟花爆竹具有易燃易爆风险&#xff0c;稍有不慎就会发生严重事故&#xff0c;而烟花爆竹厂区作为大量烟花爆竹存放地点&#xff0c;厂区面积大、工作人员杂乱&#xff0c;甚至有很多厂区原料存放不当&#xff0c;给日常的安全管理带来极大的压力&#xff0c;利用信息化手段…

普通交换机可以改成POE供电吗?

PoE交换机是一种可以通过网线为远程设备提供网络供电的交换机。它是PoE供电系统中常见的供电设备。然而&#xff0c;假如一个交换机本身没有PoE功能&#xff0c;是否可以通过添加一个PoE供电模块来为接入点提供供电呢&#xff1f; 事实上是可行的&#xff0c;简单地说就是利用了…

【轻松玩转MacOS】基本操作篇

引言 本文是系列的开篇&#xff0c;我将为大家介绍MacOS的基本操作。对于初次接触MacOS的用户来说&#xff0c;掌握这些基本操作是必不可少的。无论是启动和关机&#xff0c;还是使用键盘和鼠标&#xff0c;或者是快捷键的使用&#xff0c;这些基本操作都是你开始使用MacOS的第…

Cocos Creator3.8 项目实战(七)Listview 控件的实现和使用

滚动列表在游戏中也很常见&#xff0c;比如排行榜 、充值记录等&#xff0c;在这些场景中&#xff0c;都有共同的特点&#xff0c; 那就是&#xff1a;数据量大 &#xff0c; 结构相同。 在cocoscreator 中&#xff0c;没有现成的 Listview 控件&#xff0c; 无奈之下&#xff…

NEFU数字图像处理(1)绪论

一、简介 1.1什么是数字图像 图像是三维场景在二维平面上的影像。根据其存储方式和表现形式&#xff0c;可以将图像分为模拟图像和数字图像两大类 图像处理方法&#xff1a;光学方法、电子学方法 模拟图像&#xff1a;连续的图像数字图像&#xff1a;通过对时间上和数值上连续…

【拿完年终奖后】想要转行网络安全,一定不要错过这个时间段。

网络安全&#xff0c;作为当下互联网行业中较为热门的岗位&#xff0c;薪资可观、人才需求量大&#xff0c;作为转行必考虑。 在这里奉劝所有零基础想转行&#xff08;入门&#xff09; 网络安全的朋友们 在转行之前&#xff0c;一定要对网络安全行业做一个大概了解&#xf…

Java卷上天,可以转行干什么?

小刚是某名企里的一位有5年经验的高级Java开发工程师&#xff0c;每天沉重的的工作让他疲惫不堪&#xff0c;让他萌生出想换工作的心理&#xff0c;但是转行其他工作他又不清楚该找什么样的工作 因为JAVA 这几年的更新实在是太太太……快了&#xff0c;JAVA 8 都还没用多久&am…

【算法|动态规划No.13】leetcode LCR 166. 珠宝的最高价值

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

计算机视觉——飞桨深度学习实战-起始篇

后面我会直接跳到实战项目&#xff0c;将计算机视觉的主要任务和目标都实现一遍&#xff0c;但是需要大家下去自己多理解和学习一下。例如&#xff0c;什么是深度学习&#xff0c;什么是计算机视觉&#xff0c;什么是自然语言处理&#xff0c;计算机视觉的主要任务有哪些&#…

121-宏免杀

CS生成宏&上线 生成宏 1.cs生成宏&#xff0c;如下图操作 2.点击复制宏代码&#xff0c;保存下来 cs上线 注&#xff1a;如下操作使用的是word&#xff0c;同样的操作也适用于Excel 1.新建一个word文档&#xff0c;使用word打开。点击文件—— 2.更多——选项—— 3.自定义…

(三)行为模式:8、状态模式(State Pattern)(C++示例)

目录 1、状态模式&#xff08;State Pattern&#xff09;含义 2、状态模式的UML图学习 3、状态模式的应用场景 4、状态模式的优缺点 &#xff08;1&#xff09;优点 &#xff08;2&#xff09;缺点 5、C实现状态模式的实例 1、状态模式&#xff08;State Pattern&#x…

大数据软件项目的验收流程

大数据软件项目的验收流程是确保项目交付符合预期需求和质量标准的关键步骤。以下是一般的大数据软件项目验收流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.项目验收计划制定&#xff1a; 在…