多边形+三角带=闭合多面体

  除了多个多边形组成闭合多面体外,还有一种常用的方式,使用两个不同平面上的多边形加上多边形中间的三角带构成闭合多面体;应用场景是在视平面上勾画出一个闭合不自交多边形,以视平面的法线为方向向量,在一定距离计算出来平行于视平面的另外一个闭合不自交多边形;两个闭合多边形对应点逐次放入三角带中,构成三角带的数据,其目的是用于计算闭合多边形将形成的vtkImageData的掩膜数据,用于裁剪视野中的三维数据,或者是将圈选范围内(外)的数据值修改为固定值。
步骤为:
  1.获取闭合曲线上的点集合point1;
  2.计算另一平面上对应的闭合曲线的点集合point2;
  3.交叉放入point1序号和point2序号到三角带坐标中;
  4.定义vtkPolyData对象放入点坐标,两个平面信息,加上中间的三角带组成的柱面,就形成了不规则截面的柱体多边形;

构建立方体

  使用8个点组成2个面+一条三角带形成闭合的立方体多边形;

const int num_points = 8;
const int num_plane = 6;
const int type_polygon = 4;
float x[num_points][3] = {{0,0,0},{0,0,1},{1,0,0},{1,0,1},{1,1,0},{1,1,1},{0,1,0},{0,1,1}
};
vtkIdType pts[num_plane][type_polygon] = {{0,1,2,3},{4,5,6,7},{0,1,5,4},{1,2,6,5},{2,3,7,6},{3,0,4,7}
};
vtkNew<vtkPolyData> geometry;
vtkNew<vtkPoints> points;
for (size_t i = 0; i < 8; i++) {points->InsertPoint(i, x[i]);
}
vtkNew<vtkCellArray> polys;
// 前平面
polys->InsertNextCell(type_polygon);
for (int i = 0; i < type_polygon;i++) {polys->InsertCellPoint(2*i);
}
// 后平面
polys->InsertNextCell(type_polygon);
for (int i = 0; i < type_polygon; i++) {polys->InsertCellPoint(2*i+1);
}
// 中间的三角带
vtkNew<vtkCellArray> strips;
strips->InsertNextCell(num_points + 2);
for (int i = 0; i < 8; i++) {strips->InsertCellPoint(i);
}
strips->InsertCellPoint(0);
strips->InsertCellPoint(1);
geometry->SetPoints(points);
geometry->SetPolys(polys);
geometry->SetStrips(strips);vtkNew<vtkPolyDataMapper> geometryMapper;
geometryMapper->SetInputData(geometry);
vtkNew<vtkActor> geometryActor;
geometryActor->SetMapper(geometryMapper);vtkNew<vtkRenderer> renderer;
renderer->AddActor(geometryActor);
renderer->ResetCamera();
renderer->SetBackground(0, 0, 0);vtkNew<vtkRenderWindow> renWin;
renWin->AddRenderer(renderer);
renWin->SetSize(300, 300);vtkNew<vtkRenderWindowInteractor> iren;
iren->SetRenderWindow(renWin);renWin->Render();
iren->Start();

在vtkCellArray上分两部分排列单元结构,第一个组4个点,其后紧跟4个点索引,组成一个面;第二组4个点,组成另外一个面;

vtkNew<vtkCellArray> polys;
// 前平面
polys->InsertNextCell(type_polygon);
for (int i = 0; i < type_polygon;i++) {polys->InsertCellPoint(2*i);
}
// 后平面
polys->InsertNextCell(type_polygon);
for (int i = 0; i < type_polygon; i++) {polys->InsertCellPoint(2*i+1);
}

注意,三角带的组成点排列顺序:

// 中间的三角带
vtkNew<vtkCellArray> strips;
strips->InsertNextCell(num_points + 2);
for (int i = 0; i < 8; i++) {strips->InsertCellPoint(i);
}
strips->InsertCellPoint(0);
strips->InsertCellPoint(1);

  注释掉geometry->SetStrips(strips);后,就会只有两个面渲染出来,如下图:

  未注释掉geometry->SetStrips(strips);时,效果如下:

VTK笔记-图形相关-两个平面上的多边形+三角带=闭合多边形(棱柱体)相关推荐

  1. VTK笔记-图形相关-多边形数据转换图像数据-vtkPolyData转换为vtkImageData

      VTK中vtkImageData类和vtkPolyData类使用频率极高,vtkImageData类和vtkPolyData类派生自vtkDataSet类,是数据集的一种.   vtkPolyDa ...

  2. VTK笔记-图形相关-圆锥体-vtkConeSoure类

    圆锥体 文章目录 圆锥体 前言 一.代码 1.1流程 二.遇到的问题 1.运行时异常 2.在ThinkPad E530C笔记本上出现的异常 3.运行结果 三.相机旋转 四.vtkConeSource ...

  3. VTK笔记-图形相关-线段平滑-vtkSplineFilter类

      在实际的开发中,提供有限的连续线段组成一条曲线,需要将该条曲线进行插值处理,生成更高采样率的曲线:这种情况下就需要进行插值:VTK中的线段插值是通过B样条插值实现,使用vtkSplineFilte ...

  4. VTK笔记-图像相关-vtkImageViewer2类

    vtkImageViewer2   vtkImageViewer2类用来显示二维图像:vtk的版本更新,使用vtkImageViewer2替代vtkImageViewer类:   vtkImageVi ...

  5. 什么叫返回路径平面上的间隙_信号完整性:关于走线的参考平面问题探讨

    关于走线的参考平面问题探讨 很多人对于 PCB 走线的参考平面感到迷惑, 经常有人问: 对于内层走线, 如果走线一侧 是 VCC ,另一侧是 GND ,那么哪个是参考平面? 要弄清楚这个问题,必须对了 ...

  6. C#学习笔记:GDI图形高级编程(1)——如何将图形画到控件上

    之前学习OpenGL是用C语言写的程序,开发个界面,既繁琐又不美观,还一大堆BUG.现在学了C#,可以很轻易地进行界面开发,我就寻思着,怎么样把OpenGL搬到C#中.查了很多资料,得出了这样一个结论 ...

  7. ACMNO.47 矩形面积交(有图) 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。

    题目描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴. 对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积. 输入 输入仅包含两行,每行描述一个矩形. 在每行中, ...

  8. s平面上的圆对应的z平面上的图形

    简 介: 对于2021年期末信号与系统复习过程中学生提出の关于拉普拉斯变换定义域s平面与z变换的定义与z平面上的圆形对应关系进行实验讨论.显示了不同半径的s平面的上的圆形对应在z平面上的具有不同交叉点 ...

  9. VTK:绘制一个棋盘并用两个平面对其进行剪辑用法实战

    VTK:绘制一个棋盘并用两个平面对其进行剪辑用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 // This program draws a checkerboard and clips ...

  10. 平面上有两个圆相交,求两个圆相交部分的面积

    平面上有两个圆相交,求两个圆相交部分的面积 又学习了一遍算法,感触颇深,也对算法有了更进一步的认识,记录一下这次的学习,希望能帮到有需要的人. 输入:六个参数:第一个圆的圆心坐标,半径,第二个圆的圆心 ...

最新文章

  1. oracle自增列问题i,关于oracle中自增列问题
  2. 5000 字的 Spring MVC 全面大总结
  3. MyEclipse10中配置开发Python所需要的PyDev 绝对靠谱 不忽悠!
  4. Xamarin XAML语言教程使用方法设置进度条进度
  5. 那些在家啃书自学的人,最后都找到工作了吗?
  6. ubuntu 下 安装 sublime Text3
  7. 网络对抗技术作业一 201421410031
  8. 全新Wijmo5中文学习指南正式上线
  9. java ssm基于springboot的设备巡检系统
  10. python 比对匹配_用Python从头实现Needleman-Wunsch序列比对算法
  11. Windows图标-Icon文件格式分析
  12. 联想小新14pro锐龙版网卡rtl8852ae在ubunru18.04装网卡驱动
  13. 计算机科学与技术文献翻译,计算机科学与技术外文文献翻译.doc
  14. 利用CAD提取高程点导出为TXT
  15. IP地址和子网划分学习笔记之《IP地址详解》
  16. 443端口和80端口的区别?
  17. Android重力感应基础
  18. IOT 赋能旅行场景的实践与展望
  19. LDO:A 318 nA quiescent IEEE文章解读
  20. VUE项目在线咨询聊天功能

热门文章

  1. 计算机论文展望未来,【计算机】总结过去,展望未来
  2. day01学习过程笔记
  3. 修改服务器配额有什么坏处,云服务器配额调整
  4. Latex 中文Beamer模板
  5. ubuntu中使用ab压测
  6. ccProxy软件实现网络共享
  7. Glide导致的RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap
  8. 帝国cms模板 php代码 效率,帝国cms模板开发常用技巧总结
  9. 人工智能的发展历史概览
  10. Vue获取手机验证码