【VTK】基础知识分析

很高兴在雪易的CSDN遇见你 ,给你糖糖

欢迎大家加入雪易社区-CSDN社区云 


前言

本文分享VTK基础操作技术,记录vtk编程中常用的接口,变量等的创建及使用方法希望对各位小伙伴有所帮助!

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的点赞就是我的动力(^U^)ノ~YO

目录

前言

 1. vtkDoubleArray参数的创建

2. 已知方向v1,v2,计算法向量n

3. 计算点到有限直线的距离

4. 计算vtkPolygon的法线

5. vtkPlaneCollection的声明和遍历

6. 遍历不同类型的Cell

7. 三角形条带生成三角形规则

8. 实体与Surface的区别

9. vtkPriorityQueue 优先队列

10. 计算polygon的面积

11. vtkPolyData->vtkActor & vtkActor->vtkPolyData变换过程

12. 打印Print信息


 1. vtkDoubleArray参数的创建

//代码摘自vtkPolyPlane的ComputeNormal函数中
const vtkIdType = 5;
vtkDoubleArray* Normals = vtkDoubleArray::New();
Normals->SetNumberOfComponents(3);
Normals->Allocate(3 * nLines);
Normals->SetName("Normals");
Normals->SetNumberOfTuples(nLines);

2. 已知方向v1,v2,计算法向量n

vtkMath::Cross(v1, v2, n);
vtkMath::Normalize(n);

3. 计算点到有限直线的距离

// Compute distance to finite line. Returns parametric coordinate t
// and point location on line.
double vtkLine::DistanceToLine(const double x[3], const double p1[3], const double p2[3], double& t, double closestPoint[3])
{const double* closest = nullptr;////   Determine appropriate vectors//    计算P21向量double p21[3] = { p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2] };////   Get parametric location//    计算x点到P21为法向量的平面的距离double num = p21[0] * (x[0] - p1[0]) + p21[1] * (x[1] - p1[1]) + p21[2] * (x[2] - p1[2]);if (num == 0.0){//若距离为0表示,x与p1点重合t = 0;closest = p1;}else{//计算p21点到p21为法向量的平面的距离double denom = vtkMath::Dot(p21, p21);// trying to avoid an expensive fabsdouble tolerance = VTK_TOL * num;//计算误差if (tolerance < 0.0){tolerance = -tolerance;}if (denom < tolerance) // numerically bad!{//若p21点到平面的距离小于误差,若num>0,表示最近点为p2;反之为p1if (num > 0){closest = p2;t = VTK_DOUBLE_MAX;}else{closest = p1;t = VTK_DOUBLE_MIN;}}//// If parametric coordinate is within 0<=p<=1, then the point is closest to// the line.  Otherwise, it's closest to a point at the end of the line.//else if ((t = num / denom) < 0.0){//若x点与p21点的方向不一致,则最近点为p1closest = p1;}else if (t > 1.0){closest = p2;}else{closest = p21;p21[0] = p1[0] + t * p21[0];p21[1] = p1[1] + t * p21[1];p21[2] = p1[2] + t * p21[2];}}//计算x到直线Line12的最近点。if (closestPoint){closestPoint[0] = closest[0];closestPoint[1] = closest[1];closestPoint[2] = closest[2];}//返回x与最近点的距离的平方return vtkMath::Distance2BetweenPoints(closest, x);
}

4. 计算vtkPolygon的法线

void vtkPolygon::ComputeNormal(vtkPoints* p, int numPts, const vtkIdType* pts, double* n)
{int i;double v[3][3], *v0 = v[0], *v1 = v[1], *v2 = v[2], *tmp;double ax, ay, az, bx, by, bz;//// Check for special triangle case. Saves extra work.//n[0] = n[1] = n[2] = 0.0;if (numPts < 3){return;}if (numPts == 3){if (pts){p->GetPoint(pts[0], v0);p->GetPoint(pts[1], v1);p->GetPoint(pts[2], v2);}else{p->GetPoint(0, v0);p->GetPoint(1, v1);p->GetPoint(2, v2);}vtkTriangle::ComputeNormal(v0, v1, v2, n);return;}//  Because polygon may be concave, need to accumulate cross products to//  determine true normal.//// set things up for loopif (pts){p->GetPoint(pts[0], v1);p->GetPoint(pts[1], v2);}else{p->GetPoint(0, v1);p->GetPoint(1, v2);}for (i = 0; i < numPts; i++){tmp = v0;v0 = v1;v1 = v2;v2 = tmp;if (pts){p->GetPoint(pts[(i + 2) % numPts], v2);}else{p->GetPoint((i + 2) % numPts, v2);}// order is important!!! to maintain consistency with polygon vertex orderax = v2[0] - v1[0];ay = v2[1] - v1[1];az = v2[2] - v1[2];bx = v0[0] - v1[0];by = v0[1] - v1[1];bz = v0[2] - v1[2];n[0] += (ay * bz - az * by);n[1] += (az * bx - ax * bz);n[2] += (ax * by - ay * bx);}vtkMath::Normalize(n);
}

5. vtkPlaneCollection的声明和遍历

vtkNew<vtkPlaneCollection> planes;
vtkNew<vtkPlane> plane;
plane->SetOrigin(origin);
plane->SetNormal(normal);
planes->AddItem(plane);vtkCollectionSimpleIterator iter;
int numPlanes = 0;
if(planes)
{planes->InitTraversal(iter);numPlanes = planes->GetNumberOfItems();vtkPlane* plane = nullptr;for (int planeId = 0; planes && (plane = planes->GetNextPlane(iter)); planeId++){//plane 操作}
}

6. 遍历不同类型的Cell

vtkPolyData* inputDS = ...
vtkCellArray* inputPolys = inputDS->GetPolys();const vtkIdType* pts = nullptr;
vtkIdType cellId, npts;
for(cellId = 0, inputPolys->InitTraversal(); inputPolys->GetNextCell(npts, pts); cellId++)
{...
}vtkCellArray *inVerts = input->GetVerts();
for (inVerts = input->GetVerts(), inVerts->InitTraversal(); inVerts->GetNextCell(npts, pts);)
{for (j = 0; j < npts; j++){Verts[pts[j]].type = VTK_FIXED_VERTEX;}
}// 同理对于Line

7. 三角形条带生成三角形规则

vtkCellArray* strips = vtkCellArray::New();
strips->InsertNextCell(4);
strips->InsertCellPoint(0);
strips->InsertCellPoint(1);
strips->InsertCellPoint(3);
strips->InsertCellPoint(2);

生成的三角形为(0,1,3)和(3,1,2)。

8. 实体与Surface的区别

实体的所有Triangle的方向均指向内部。

9. vtkPriorityQueue 优先队列

vtkPriorityQueue* leftmostPoints = vtkPriorityQueue::New();
leftmostPoints->Allocate(8);
leftmostPoints->Insert(-10, 0);
leftmostPoints->Insert(10, 1);
leftmostPoints->Insert(-3, 2);
leftmostPoints->Insert(0, 3);
leftmostPoints->Insert(2, 4);
leftmostPoints->Insert(5, 5);
leftmostPoints->Insert(-80, 6);
leftmostPoints->Insert(30, 7);
while (leftmostPoints->GetNumberOfItems())
{vtkIdType currentPointID = leftmostPoints->Pop();
//currentPointID分别为6,0,2,3,4,5,1,7
}

10. 计算polygon的面积

vtkSphere::ComputeBoundingSphere(static_cast<vtkDoubleArray*>(polygon->Points->GetData())->GetPointer(0),polygon->PointIds->GetNumberOfIds(), sphere, hints);
//if (sphere[3] <= this->HoleSize)
//sphere[3]为polygon的面积

11. vtkPolyData->vtkActor & vtkActor->vtkPolyData变换过程

vtkPolyData* pd = ...;
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->setInputData(pd);
vtkActor* actor = vtkActor::New();
actor->setMapper(mapper);//vtkPolyData改变驱动vtkActor改变
pd->Modified(); //关联的Actor会自动更新//vtkActor改变(发生移动或旋转等),并不会驱动关联的PolyData数据进行改变
//1. 获取vtkActor变换矩阵
//2. 将变换矩阵作用于关联的PolyData对象即可。

12. 打印Print信息

vtkPolyData* pd;
pd->Print(std::cout)

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的赞赏是我的最最最最大的动力(^U^)ノ~YO

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

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

相关文章

华为云云耀云服务器L实例评测|华为云耀云服务器L实例私有库搭建verdaccio(八)

九、华为云耀云服务器L实例私有库搭建verdaccio&#xff1a; Verdaccio 是一个简单的、零配置本地私有 npm 软件包代理注册表。Verdaccio 开箱即用&#xff0c;拥有自己的小型数据库&#xff0c;能够代理其它注册表&#xff08;例如 npmjs.org&#xff09;&#xff0c;缓存下载…

软件工程与计算总结(十)软件体系结构设计与构建

目录 ​编辑 一.体系结构设计过程 1.分析关键需求和项目约束 2.选择体系结构风格 3.体系结构逻辑设计 4.体系结构实现 5.完善体系结构设计 6.定义构件接口 二.体系结构原型构建 1.包的创建 2.重要文件的创建 3.定义构件之间的接口 4.关键需求的实现 三.体系结构的…

屏幕亮度调节保护您的眼睛

官方下载地址&#xff1a; 安果移动 视频演示&#xff1a;屏幕亮度调节-保护您的眼睛_哔哩哔哩_bilibili 嗨&#xff0c;亲爱的用户&#xff0c;你是否有过这样的体验&#xff1a;夜晚安静的时刻&#xff0c;想要在抖音上看看热门的舞蹈、在快手上发现生活的 趣味、或是在哔…

Godot2D角色导航-自动寻路教程(Godot实现角色随鼠标移动)

文章目录 运行结果2D导航概述开始前的准备2D导航创建导航网格创建角色 其他文章 运行结果 2D导航概述 Godot为2D和3D游戏提供了多个对象、类和服务器&#xff0c;以便于基于网格或基于网格的导航和路径查找。 说到导航&#xff0c;就得说一下导航网格&#xff0c;导航网格定义…

区块链跨链技术

区块链跨链技术 背景 近年来&#xff0c;随着区块链技术的不断发展&#xff0c;区块链的应用场景逐渐从最初的加密货币领域扩展到金融、物流、医疗、公共服务等各个领域。随着区块链的应用场景不断增多&#xff0c;区块链的“数据孤岛”问题日益突出&#xff0c;不同场景下的…

发现更多美景!XnViewMP for Mac/Windows 图片浏览软件

想要轻松快捷地浏览、管理和编辑您的照片吗&#xff1f;XnViewMP for Mac 是您的最佳选择&#xff01;这款强大而多功能的图片浏览软件将给您带来全新的视觉体验。 借助 XnViewMP&#xff0c;您可以方便地浏览各种图片格式&#xff0c;包括JPEG、PNG、GIF等&#xff0c;并支持…

贴片电容材质的区别与电容的主要作用

一、贴片电容材质NPO、COG、X7R、X5R、Y5V、Z5U区别 主要是介质材料不同&#xff0c;不同介质种类由于它的主要极化类型不一样&#xff0c;其对电场变化的响应速度和极化率也不一样。在相同的体积下的容量就不同&#xff0c;随之带来的电容器介质的损耗、容量的稳定性也就不同…

Linux 文件系统逻辑结构图的解释

task_struct进程结构体&#xff0c;表示一个运行的进程。 task_struct中的fs指向fs_struct结构体。fs_struct表示这个进程支持的文件系统。 root指向根目录dentry&#xff0c;dentry中的d_inode指向改进程根目录在存储设备中的inode节点。 pwd指向当前进程所在的目录结构体den…

Pytorch从零开始实战05

Pytorch从零开始实战——运动鞋识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——运动鞋识别环境准备数据集模型选择数据可视化模型预测总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytorch2.0.1cu118…

加持智慧医疗,美格智能5G数传+智能模组让就医触手可及

智慧医疗将云计算、物联网、大数据、AI等新兴技术融合赋能医疗健康领域&#xff0c;是提高医疗健康服务的资源利用效率&#xff0c;创造高质量健康医疗的新途径。《健康中国2030规划纲要》把医疗健康提升到了国家战略层面&#xff0c;之后《“十四五”全面医疗保障规划》等一系…

如何导出带有材质的GLB模型?

1、为什么要使用 GLB 模型? GLB格式&#xff08;GLTF Binary&#xff09;是一种用于存储和传输3D模型及相关数据的文件格式&#xff0c;具有以下优点和作用&#xff1a; 统一性&#xff1a;GLB是一种开放标准的3D文件格式&#xff0c;由Khronos Group制定和维护。它融合了GL…

【C++入门】命名空间详解(从零开始,冲击蓝桥杯)

C入门 命名空间 南喵小鸡汤程序员可以让步&#xff0c;却不可以退缩&#xff0c;可以羞涩&#xff0c;却不可以软弱&#xff0c;总之&#xff0c;程序员必须是勇敢的。一 . 命名空间的介绍二.命名空间的实际应用1.为什么要有命名空间我们在使用变量时,通常会为他定义一个名字,在…

基于R和gephi做宏基因组与代谢组等多组学联合network相关性网络图

写在前面 拿到多组学的数据后一直在找合适的方法将二者进行关联&#xff0c;比如我这里是三种体液的代谢组与一种体液的宏基因组。需求是对多组学进行关联分析&#xff0c;直到最近看到不少文章里利用Gephi将相关性表格进行可视化的图&#xff0c;效果还不错&#xff0c;于是写…

vscode用密钥文件连接ssh:如果一直要输密码怎么办

commandshiftP&#xff1a;打开ssh配置文件 加上这么一段&#xff0c;host就是你给主机起的名字 对IdentityFile进行更改&#xff0c;改成相应的密钥文件 然后commandshiftP链接到主机就可以了 但是有时候它会让输入密码 这是由于你给这个IdentityFile的权限太多了&#xf…

【深度学习】DDPM,Diffusion,概率扩散去噪生成模型,原理解读

看过来看过去&#xff0c;唯有此up主&#xff0c;非常牛&#xff1a; Video Explaination(Chinese) 1. DDPM Introduction q q q - 一个固定&#xff08;或预定义&#xff09;的正向扩散过程&#xff0c;逐渐向图像添加高斯噪声&#xff0c;直到最终得到纯噪声。 p θ p_θ p…

Redis的Java客户端-Jedis

目录 一、Jedis基本用法二、Jedis连接池 一、Jedis基本用法 二、Jedis连接池

晨控CK-GW06系列网关与汇川可编程控制器MOSBUSTCP通讯手册

晨控CK-GW06系列网关与汇川可编程控制器MOSBUSTCP通讯手册 晨控CK-GW06系列是支持标准工业通讯协议 MODBUSTCP 的网关控制器,方便用户集成到PLC等控制系统中。本控制器提供了网络 POE 供电和直流电源供电两种方式&#xff0c;确保用户在使用无 POE 供电功能的交换机时可采用外…

Kopler.gl笔记:可视化功能总览

1 添加数据 2 添加图层 打开“数据层”菜单&#xff0c;开始可视化。 层&#xff08;Layers&#xff09;简单来说就是可以相互叠加的数据可视化。 3 添加过滤器 在地图上添加过滤器以限制显示的数据。过滤器必须基于数据集中的列。要创建新的过滤器&#xff0c;打开“过滤器…

手机拍摄的视频噪点很多怎么办,视频怎么做降噪处理?

现如今&#xff0c;智能手机已经成为了我们生活中必不可少的存在。而随着智能手机越来越强大&#xff0c;很多人已经开始使用手机来拍摄各种类型的视频。但是由于手机的限制&#xff0c;很多人会发现自己拍摄的视频存在着很多的噪点。那么&#xff0c;我们该怎样来解决拍摄视频…

BuyVM 挂载存储块

发布于 2023-07-13 on https://chenhaotian.top/linux/buyvm-mount-block-storage/ BuyVM 挂载存储块 参考&#xff1a; https://zhujitips.com/2653https://www.pigji.com/898.html 1 控制台操作 存储块购买完毕后&#xff0c;进入后台管理界面&#xff0c;进入对应 VPS …