【VTK】基础知识分析

news2025/1/15 7:56:19

很高兴在雪易的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 fabs
    double tolerance = VTK_TOL * num;//计算误差
    if (tolerance < 0.0)
    {
      tolerance = -tolerance;
    }
    if (denom < tolerance) // numerically bad!
    {
    //若p21点到平面的距离小于误差,若num>0,表示最近点为p2;反之为p1
      if (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点的方向不一致,则最近点为p1
      closest = 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 loop
  if (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 order
    ax = 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.coloradmin.cn/o/1092054.html

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

相关文章

程序包org.apache.commons.XXX不存在

看了好几个博客找这个出现的原因&#xff0c;最后亲测有用的&#xff1a; [IDEA]Java&#xff1a;“程序包XXX不存在”问题的三种解决方案 - lodalo - 博客园 (cnblogs.com) 使用第一种方式&#xff0c;不需要重启&#xff0c;就是在这个条件下输入&#xff1a;mvn idea:idea…

Ruby语言基础知识

Ruby是一种简单快捷的面向对象脚本语言&#xff0c;由日本人松本行弘&#xff08;Yukihiro Matsumoto&#xff09;在20世纪90年代开发&#xff0c;遵守GPL协议和Ruby License。它的灵感和特性来自于Perl、Smalltalk、Eiffel、Ada以及Lisp语言。 以下是Ruby语言的一些特点&#…

Mini小主机All-in-one搭建教程1-安装Esxi7.0虚拟机系统

Mini小主机All-in-one搭建教程1-安装Esxi7.0虚拟机系统 最近小主机似乎很火&#xff0c;知名不知名的品牌&#xff0c;都出了各自的小主机。今天主要介绍小主机下搭建教程安装Esxi、Openwrt、群晖NAS、Win11、centos7、黑苹果、Android-x86系统&#xff0c;这戏系统 搞得好是…

嵌入式C语言自我修养《GNU C编译器扩展语法》学习笔记

目录 一、C语言标准和编译器 二、指定初始化 三、宏构造“利器”&#xff1a;语句表达式 四、typeof与container_of宏 五、零长度数组 六、属性声明&#xff1a;section 七、属性声明&#xff1a;aligned 一、C语言标准和编译器 C语言标准的发展过程&#xff1a; ●…

想要精通算法和SQL的成长之路 - 前缀和的应用

想要精通算法和SQL的成长之路 - 前缀和的应用 前言一. 区域和检索 - 数组不可变二. 二维区域和检索 - 矩阵不可变2.1 前缀和的计算2.2 用前缀和计算二维区域和 三. 矩形区域不超过 K 的最大数值和 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 区域和检索 - 数组不可变 原…

c# xml 参数读取的复杂使用

完整使用2 生产厂家里面包含很多规格型号,一个规格型号里面包含很多出厂序列号,点击下一步如果检测到填充的和保存的不一样 就新增一条(如检测到生产厂家相同,但是规格型号不同,就新增一组规格型号)。 界面一:新增界面 界面2 删除界面 界面一:新增界面 load 其中…

导入Maven项目遇到的一些问题及解决

开发工具是IDEA&#xff0c; 一个Maven项目初次导入IDEA中&#xff0c;需要注意的几件事&#xff1a; 设置项目的编码格式&#xff08;或者提前设置全局的编码格式&#xff09;&#xff0c;一般是UTF-8&#xff1b;检查JDK版本和编译级别&#xff1b;检查Maven的版本&#xf…

centos7下安装elasticsearch7.8.1并配置远程连接

1、下载安装包 sudo wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.1-linux-x86_64.tar.gz 2、解压 sudo tar -zxvf elasticsearch-7.8.1-linux-x86_64.tar.gz 3、添加用户并设置密码 sudo useradd es sudo passwd es # 设置密码 Lida15…

NewStarCTF2023week2-Upload again!

尝试传修改后缀的普通一句话木马&#xff0c;被检测 尝试传配置文件 .htaccess 和 .user.ini 两个都传成功了 接下来继续传入经过修改的木马 GIF89a <script language"php"> eval($_POST[cmd]); </script> 没有被检测&#xff0c;成功绕过 直接上蚁剑…

课题学习(八)----卡尔曼滤波动态求解倾角、方位角

一、 卡尔曼滤波 卡尔曼滤波的应用要求系统和底层过程的测量模型都是线性的。离散时间线性状态空间系统的描述为: x k Φ k , k − 1 x k − 1 G k − 1 w k − 1 x_k\Phi_{k,k-1}x_{k-1}G_{k-1}w_{k-1} xk​Φk,k−1​xk−1​Gk−1​wk−1​    式中 Φ k , k − 1 \Phi_{…

原创先锋后台管理平台未授权访问

漏洞描述 原创先锋后台管理平台存在未授权访问漏洞&#xff0c;攻击者通过漏洞可以任意接管账户权限 漏洞复现 访问未授权的url&#xff1a; /admin/admin/admin_list.html漏洞证明如下&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0…

智慧公厕云管理平台:公厕云大脑引领厕所革命未来之路

智慧公厕作为城市管理的重要组成部分&#xff0c;不仅为市民提供便利&#xff0c;更是城市形象的重要窗口。随着科技的发展&#xff0c;全域联网管理的智慧公厕云管理平台指挥大脑的建立&#xff0c;使得智慧公厕的跨区域、跨系统、跨业务、跨流程作业功能更加强大&#xff0c;…

Linux shell编程学习笔记12:布尔运算和逻辑运算

Linux Shell 脚本编程和其他编程语言一样&#xff0c;支持算数、关系、布尔、逻辑、字符串、文件测试等多种运算。前面几节我们陆续研究了 Linux shell编程 中的 字符串运算、算术运算和关系运算&#xff0c;今天我们来研究 Linux shell编程中的的布尔运算、逻辑运算。 一、…

COM编程入门Part Ⅱ - 深入理解COM服务器[译]

文章目录 1. 本文的目的 2. 介绍 3. 快速浏览COM服务器 4. 服务器生命周期管理 5. 实现接口&#xff0c;从IUnknown开始 6. CoCreateInstance()的内部 7. 注册COM服务器 8. 创建COM对象 - 类工厂 9. 示例自定义接口 10. 客户端使用我们的COM服务 11. 其他细节 本篇…

[入门一]C# webApi创建、与发布、部署、api调用

一.创建web api项目 1.1、项目创建 MVC架构的话&#xff0c;它会有view-model-control三层&#xff0c;在web api中它的前端和后端是分离的&#xff0c;所以只在项目中存在model-control两层 1.2、修改路由 打开App_Start文件夹下&#xff0c;WebApiConfig.cs ,修改路由&…

12.SpringBoot之RestTemplate的使用

SpringBoot之RestTemplate的使用 初识RestTemplate RestTemplate是Spring框架提供用于调用Rest接口的一个应用&#xff0c;它简化了与http服务通信方式。RestTemplate统一Restfull调用的标准&#xff0c;封装HTTP链接&#xff0c;只要需提供URL及返回值类型即可完成调用。相比…

小程序之基础入门(1)

⭐⭐ 小程序专栏&#xff1a;小程序开发专栏 ⭐⭐ 个人主页&#xff1a;个人主页 目录 一.前言 二.小程序简介 2.1 微信小程序的特点和优势&#xff1a; 三.小程序的安装与使用 五.小程序入门案例及目录结构 好啦&#xff01;&#xff01;今天的分享就到这啦&#xff01;…

多测师肖sir_高级金牌讲师_python之模块008

python之模块 一、模块的介绍 &#xff08;1&#xff09;python模块&#xff0c;是一个python文件&#xff0c;以一个.py文件&#xff0c;包含了python对象定义和pyhton语句 &#xff08;2&#xff09;python对象定义和python语句 &#xff08;3&#xff09;模块让你能够有逻辑…

微信浏览器大字体模式 按钮文字居中用line-height 显示异常

按钮文字居中用line-height 的css 在微信浏览器大字体模式&#xff0c;会导致显示错误。改成flex 居中就好了

R语言手动绘制NHANSE数据基线表并聊聊NHANSE数据制作亚组交互效应表的问题(P for interaction)

美国国家健康与营养调查&#xff08; NHANES, National Health and Nutrition Examination Survey&#xff09;是一项基于人群的横断面调查&#xff0c;旨在收集有关美国家庭人口健康和营养的信息。 地址为&#xff1a;https://wwwn.cdc.gov/nchs/nhanes/Default.aspx 在既往的…