简介:本文主要记录vtk编程中常用的接口,变量等的创建及使用方法,欢迎各位小伙伴指正!

目录

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变换过程


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对象即可。

vtk 常用基础知识相关推荐

  1. 网络服务器最基本的是文件,你可能想知道的15个网络常用基础知识

    原标题:你可能想知道的15个网络常用基础知识 网络是一个复杂的系统,涉及知识很多.现在腾正小超人给大家分享15个常用的网络基础知识: 1) 如何查看本机所开端口 用netstat -a -n命令查看! ...

  2. Swift常用基础知识(二)

    Swift常用基础知识(一) 函数式编程 函数合成 func add1(_ v1: Int, _ v2: Int) -> Int { v1 + v2 }func currying<A, B ...

  3. Linux常用基础知识必备三之常用指令及操作

    Linux常用基础知识必备三之常用指令及操作 1.vi和vim vi如何使用 vi几种模式下的操作指令 命令模式进入编辑模式 命令模式下的快捷键 底行模式(指按了esc键之后输入按键:后出现) 字符串 ...

  4. HTML和CSS的常用基础知识笔记

    HTML基础知识 标题标签: <h1>一级标题</h1> <h2>二级标题</h2> <h3>三级标题</h3> <h4& ...

  5. C#常用基础知识总结(B/S和C/S的异同属于个人整理)

    转载自"IT弄你"的论坛帖C#基础知识 概念:.net与c# .net/dontnet:一般指.net framework框架,一种平台,一种技术 c#(charp):一种编程语言 ...

  6. verilator常用基础知识

    目录 预学习阶段 verilator语法学习 运行verilator官网的example 电路设计举例 预学习阶段 verilator语法学习 常用网站: OJ刷题网站 HDL基础知识 verilat ...

  7. 30分钟搞定ES6常用基础知识

    ES6基础智商划重点 在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译. ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值 ...

  8. 实施、运维常用基础知识(适用小白入门)

    Linux 基础命令 软件包管理 压缩和解压缩 远程连接 文件操作 花式读(文件) 进程操作 Linux信息 系统服务 基础命令 TAB键---自动补全 管道符(|):将前一个命令的输出作为下一个命令 ...

  9. 前端HTML5常用基础知识总结

    目录 一: 初识HTML 二:常见网页标签 2.1.标题标签 h1-h6 2.2.段落和换行标签 2.3.文本格式化标签 2.4.div和span标签 2.5.图像标签和路径 2.6.超链接标签 2. ...

最新文章

  1. 腾讯AI Lab视觉计算中心招聘计算机视觉算法实习生
  2. 利用74LS161计数器芯片分别实现模12,模20的计数器,并在QuartusⅡ上进行仿真
  3. UA MATH571B 试验设计 总结 判断试验类型的例题
  4. org.tinygroup.databasebuinstaller-数据库结构及元数据自动创建
  5. iOS iOS9下实现app间的跳转
  6. mysql cmake错误_MySQL5.5安装出现CMake错误找不到CMakelists.txt原因-阿里云开发者社区...
  7. OpenCV图像处理篇之边缘检測算子
  8. 解决win7检测不到第二个显示器的方法
  9. bat命令 (参数传递)
  10. 经典——也许这就是方向
  11. Html数组下标访问帧,javaScript array(数组)使用字符串作为数组下标的方法
  12. jQuery源码下载和编译
  13. 3d数字孪生工厂可视化三维建模平台
  14. QML 编译release 报错: qmlcache_loader.cpp:-1: error: undefined reference to `__imp__ZN11QQmlPrivate13qml
  15. tcl c语言笔试题,TCL 2019校园招聘备战-求职应聘指南(笔试真题面试经验).pdf
  16. 【Linux】文件及目录
  17. LaTex粗略的学习笔记(表格)
  18. 零极点是怎么产生的对环路的影响
  19. 中国高空作业平台何时摆脱外国的影子
  20. 高速缓冲存储器-cache

热门文章

  1. linux下u盘网卡驱动,通过U盘给Linux系统安装网卡驱动的方法
  2. MPLS相关配置及抓包分析
  3. B/S软件与C/S软件区别
  4. python安装出错运行不了_mysql-python安装错误:无法打开包含文件“..._慕课猿问...
  5. 腾讯云从业资格证考试内容 考试多久出结果?
  6. Office 办公软件 word Excel PPT(3)
  7. 拼多多上货助理上传淘宝商品的步骤
  8. Xcode9之后打开Object Library组件库
  9. 基于Java毕业设计疫情小区通报系统源码+系统+mysql+lw文档+部署软件
  10. autojs,按键精灵等辅助,快手极速版代码分享(真实可运行)