vtk之【vtkPolyData、vtkCell、vtkPoints】

news2024/12/25 0:32:55

文章目录

  • 一,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 quad
  polygon->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 PolyData
  vtkNew<vtkPolyData> polygonPolyData;
  polygonPolyData->SetPoints(points);//将坐标点给到Polydata
  polygonPolyData->SetPolys(polygons);//再将这些坐标的拓扑结构给到Polydata(我理解的是坐标的连接顺序)
 //既然知道了坐标,也知道了坐标怎么连接,那么这个Polydata就算封装完成了

  //然后就是:通过mapper得到可渲染的图元数据,再通过actor得到可渲染的图元,最后将actor加入到渲染器
  // Create a mapper and actor
  vtkNew<vtkPolyDataMapper> mapper;
  mapper->SetInputData(polygonPolyData);

  vtkNew<vtkActor> actor;
  actor->SetMapper(mapper);
  actor->GetProperty()->SetColor(colors->GetColor3d("Silver").GetData());

  // Visualize
  vtkNew<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.coloradmin.cn/o/1066703.html

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

相关文章

【ARM CoreLink 系列 5 -- CI-700 控制器介绍 】

文章目录 1.1 什么是 CI-700?1.1.1 关于 CI-7001.1.2 CI-700 特点1.2 全局配置参数1.2.1 寻址能力1.3 组件和配置1.3.1 CI-700 互联的结构1.3.2 Crosspoint(XP)1.3.3 外部接口1.4 组件(Components)1.1 什么是 CI-700? CI-700是一种AMBA 5 CHI互连,具有可定制的网状拓扑结构…

onlyOfice取消上传文件大小的限制

进入docker容器 docker exec -it 容器名ID bash 编辑配置文件 #如果不能编辑,需安装vim apt-get update apt-get install vim #如果不能安装vim&#xff0c;可以在容器外部编辑配置文件后上传至容器&#xff1a; docker cp /home/file/文件 容器id:/etc/onlyoffice/d…

2023/10/7 -- ARM

【程序状态寄存器读写指令】 1.指令码以及格式 mrs:读取CPSR寄存器的值 mrs 目标寄存器 CPSR&#xff1a;读取CPSR的数值保存到目标寄存器中msr:修改CPSR寄存器的数值msr CPSR,第一操作数:将第一操作数的数值保存到CPSR寄存器中//修改CPSR寄存器&#xff0c;也就表示程序的状…

频敏变阻器 BP4G-31511/06350 BP4G-25010/04563 结构简单、操作方便

BP4G系列频敏变阻器&#xff08;以下简称BP4G&#xff09;适用于14-1000KW绕线型异步感应电机作重载偶尔起动用。它具有结构简单、操作方便、维护容易等优点&#xff0c;是一种理想的电动机起动装置 BP4G系列频敏变阻器(以下简称BP4G)适用于14-1000KW绕线型异步感应电机作重载…

川西旅游网系统-前后端分离(前台vue 后台element UI,后端servlet)

前台&#xff1a;tour_forword: 川西旅游网前端----前台 (gitee.com) 后台&#xff1a;tour_back: 川西旅游网-------后台 (gitee.com) 后端 &#xff1a;tour: 川西旅游网------后端 (gitee.com)

点餐小程序实战教程05-用户注册

上一篇我们讲解了用户身份识别的问题&#xff0c;本篇我们讲解一下注册功能以及审核功能。 1 表单容器 注册功能是使用表单容器完成&#xff0c;表单容器会根据数据源的字段来自动的生成页面&#xff0c;从右侧的组件区拖入表单容器 表单容器需要选择我们创建的用户管理的数…

GaussDB技术解读系列:高安全之密态等值

在第14届中国数据库技术大会&#xff08;DTCC2023&#xff09;的GaussDB“五高两易”核心技术&#xff0c;给世界一个更优选择专场&#xff0c;华为GaussDB首席安全架构师郭亮详细解读了GaussDB的高安全之密态等值技术。 本篇为大家分享GaussDB高安全的关键特性&#xff0c;名字…

2023年【烟花爆竹经营单位主要负责人】考试及烟花爆竹经营单位主要负责人新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 烟花爆竹经营单位主要负责人考试根据新烟花爆竹经营单位主要负责人考试大纲要求&#xff0c;安全生产模拟考试一点通将烟花爆竹经营单位主要负责人模拟考试试题进行汇编&#xff0c;组成一套烟花爆竹经营单位主要负责…

嬴图 | 微距观察从“表数据”到“图数据”的建模过程

前言 随着图数据库技术在工业领域的有效开展和深入应用&#xff0c;在建模时&#xff0c;到底“图数据”与“表数据”有哪些不同&#xff1f;本文&#xff0c;笔者以搭建一个简单的医院信息管理系统为例&#xff0c;具体对比并阐述了用关系型查询语言SQL和图查询语言UQL&#…

阿里云/腾讯云国际站账号:腾讯云国际站特效SDK购买

产品介绍 随着直播、短视频业务的爆发式增长&#xff0c;丰富多样的视频特效&#xff0c;自然生动的智能美颜&#xff0c;新奇有趣的贴纸玩法也受到大量关注&#xff0c;为多种视频场景注入了新的生机与活力。腾讯特效 SDK&#xff08;Tencent Effect SDK&#xff09;&#xf…

Node18.x进阶使用总结之MongoDB7.x(三)

Node18.x进阶使用总结之MongoDB7.x 1、MongoDB7.x的安装1.1、下载安装与启动1.2、MongoDB目录1.3、安装MongoDB Shell1.4、设置环境变量1.5、使用MongoDB 2、命令行交互2.1、数据库命令2.2、集合命令2.3、文档命令 3、Mongoose3.1、连接数据库3.2、创建新文档3.3、字段类型3.4、…

vue 百度地图/天地图设置铺满屏幕100%,解决空隙问题

设置100%无效&#xff0c;刷新依然右侧有空隙&#xff0c;解决&#xff1a;min-width: 100vw; <div class"aui-flex-col" style"width: 100%; height:100%"><div id"mapAllCon" style"width: 100%; min-width: 100vw; height: 10…

从0开始python学习-31.selenium 文本输入框、下拉选择框、文件上传、时间插件选择元素定位

目录 1. 纯文本输入框 2. 存在默认值的文本输入 3. 下拉选择框 4. 输入后下拉选择框 5. 文件上传 6. 时间插件 1. 纯文本输入框 driver.find_element(By.XPATH,/html/body/div[2]/td[2]/input).send_keys(测试名称) 2. 存在默认值的文本输入 注意&#xff1a; 1. 这种存…

mkv怎么转换为mp4?

mkv怎么转换为mp4&#xff1f;你是否有过这样的情况&#xff0c;电脑上播放MKV格式的视频文件很流畅&#xff0c;但却无法在手机端或者一些剪辑软件中正常播放以及识别&#xff0c;导致工作效率的降低&#xff1f;这个问题的根本原因在于电脑上的播放器可以兼容MKV格式&#xf…

Java中双冒号“::”到底什么意思

今天给大家分享一个JDK8中的新特性双冒号&#xff1a;”::“&#xff0c;双冒号“::”就是 Java 中的方法引用&#xff0c;是Java 8中的Lambda表达式写法之一&#xff0c;一种执行方法的方法。 在一定程度上简化了我们Java开发的冗余代码。 双冒号(::)使用场景一般有如下6种&a…

物流仓储RFID系统设计案例分享

一、项目背景 为了实现仓储货物管理数字化转型的目标&#xff0c;提升仓储业务自动化和数字化水平&#xff0c;在满足仓储日常需求的基础上&#xff0c;验证物联网和人工智能相关技术能力&#xff0c;为仓储业务的柔性自动化、快速部署和复制提供储备能力。 项目设计目标包括…

c++视觉ROI 区域和ROI 区域图像叠加

ROI 区域提取和ROI 区域图像叠加 ROI 区域提取 #include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image cv::imread("1.jpg");// 检查图像是否成功加载if (image.empty()) {std::cerr << "Error: Could not read the image." …

hadoop集群安装并配置

文章目录 1.安装JDK 环境2.系统配置2.1修改本地hosts文件2.2创建hadoop 用户2.2 设置ssh免密&#xff08;使用hadoop 用户生成&#xff09; 3.安装 hadoop 3.2.43.1 安装hadoop3.1.1 配置Hadoop 环境变量 3.2配置 HDFS3.2.1 配置 workers 文件3.2.2 配置hadoop-env.sh3.2.3 配置…

【数字化转型】10大数字化转型能力成熟度模型01(IOMM)

一、前言 数字化转型是数据化能力建设的目标和价值&#xff0c;作为一个新兴的课题&#xff0c;目前为止并未出现一个统一的数字化转型成熟度模型。不同的企业和机构&#xff0c;根据自身的发展和认知&#xff0c;推出了自己的企业级或者准行业级标准。这些标准具有很强的参考意…

一本没有任何数学公式的自然语言处理入门书

ChatGPT 时代来了&#xff0c;AI 从旧时王谢堂前燕&#xff0c;飞入寻常百姓家。越来越多非 AI 领域 的软件开发者涌进 NLP(自然语言处理)领域。在这个快速发展的时代&#xff0c;如果这些软件开发 者要像读书那样先读 4 年本科、2 年硕士、3 年博士才能搞 AI&#xff0c;风口早…