VTK笔记-使用vtkHull类获取多边形数据的凸包_vtk多边形凸包-程序员宅基地

技术标签: VTK笔记-图形相关  VTK  

1.vtkHull类

  vtkHull是一个过滤器,它将在给定一组n个平面的情况下生成一个n边凸包。(凸面外壳限制输入多边形数据。)外壳是通过向输入vtkPolyData挤压平面生成的,直到平面刚好接触vtkPolyData。然后,生成的平面用于生成由三角形表示的多面体(即外壳)。
  n个平面可通过多种方式定义,包括
    1)手动指定每个平面;
    2)选择输入边界框的六个面平面;
    3)选择输入边界框的八个顶点平面;
    4)选择输入边界框的12个边平面;和/或5)使用递归细分的八面体。
请注意,指定平面时,平面法线应指向凸面区域之外。
此过滤器的输出可与vtkLODActor结合使用,以表示LOD层次结构中的详细级别。此类的另一个用途是手动指定平面,然后从平面生成多面体(不向输入方向挤压平面)。方法GenerateHull()用于执行此操作。

1.1对外接口

1.1.1指定平面

void RemoveAllPlanes(void);  

从当前平面集中删除所有平面。

int AddPlane(double A, double B, double C);
int AddPlane(double plane[3]);

函数功能:将平面添加到当前平面集。
它将被添加到列表的末尾,并返回一个稍后可用于设置此平面法线的索引。值A、B、C来自平面方程Ax+By+Cz+D=0。此向量不必具有单位长度(但必须具有非零长度!)。如果返回值0>i>=-NumberOfPlanes,则该平面与先前插入的平面平行,|-i-1|是先前插入的平面的索引。如果返回值i<-NumberOfPlanes,则平面法线长度为零。

void SetPlane(int i, double A, double B, double C);
void SetPlane(int i, double plane[3]);

设置平面i对应的法线值。
这是一个已使用AddPlane()添加到当前平面集的平面,现在正在修改。值A、B、C来自平面方程Ax+By+Cz+D=0。该向量不必具有单位长度。请注意,D被设置为零,但采用vtkPlanes*参数的方法除外,其中D被设置为此处定义的D值。

int AddPlane(double A, double B, double C, double D);
int AddPlane(double plane[3], double D);
void SetPlane(int i, double A, double B, double C, double D);
void SetPlane(int i, double plane[3], double D);

允许设置D的AddPlane()/SetPlane()的变体(函数重载)。
使用GenerateHull()时使用这些方法。

void SetPlanes(vtkPlanes* planes);

使用vtkPlanes隐式函数一次设置所有平面。
这还设置了D值,因此可以与GenerateHull()一起使用。

vtkGetMacro(NumberOfPlanes, int); 

获取当前平面集的平面个数;

void AddCubeVertexPlanes();  

添加表示立方体顶点的8个平面-连接到顶点的三个面平面的组合
(1,1,1), (1,1,-1), (1,-1,1), (1,-1,1),
(-1,1,1), (-1,1,-1), (-1,-1,1), (-1,-1-1)
从对角顶点的连线作为平面的法线,一根对角线从两个方向产生两个平面,法线方向相反;
在这里插入图片描述

void AddCubeEdgePlanes();  

添加表示立方体边的12个平面-位于两个连接面平面的中间
(1,1,0), (-1,-1,0), (-1,1,0), (1,-1,0),
(0,1,1), (0,-1,-1), (0,1,-1), (0,-1,1),
(1,0,1), (-1,0,-1), (1,0,-1), (-1,0,1)
每个平面上的对角线作为法线,6个平面,会有6个不相同的对角连线(其中有6个对角连线是和其他相同的对角连线),6根直线可以确定12个不同方向的向量,从而构成12个平面;
在这里插入图片描述

void AddCubeFacePlanes();  

添加构成立方体面的六个平面;
(1,0,0), (-1, 0, 0), (0,1,0),
(0,-1,0), (0,0,1), (0,0,-1)
与立方体6个平面平行的6个面,可以从12条边中,找到向量不相同的6个向量作为平面法向量;
在这里插入图片描述

void AddRecursiveSpherePlanes(int level);    

添加表示通过在八面体中递归细分三角形而形成的多边形球体顶点法线的平面。
在这里插入图片描述在这里插入图片描述

每个三角形通过连接边的中点进行细分,从而形成4个较小的三角形。
级别表示进行了多少次细分;
级别0表示用于从原始八面体添加6个平面,即从八面体进行一次细化,每条边上的中点与平面上相邻边上的中点相连接;一个顶点变成了4个顶点,则从之前的6个顶点变为24个顶点;
在这里插入图片描述

级别1将添加18个平面,从十四面体再进行一次细化;依此类推。
在这里插入图片描述

void GenerateHull(vtkPolyData* pd, double* bounds);  
void GenerateHull(
      vtkPolyData* pd,
double xmin, double xmax,
double ymin, double ymax, 
double zmin, double zmax);

一种特殊方法,用于直接从一组n个平面生成多面体。
用户提供的平面不会挤压到输入数据(实际上用户不需要指定输入)。若要使用此方法,必须提供vtkPolyData的实例,定义多面体的点和单元将放置在该实例中。您还必须提供一个边界框,期望生成的多面体位于该边界框中。这可能是一个非常慷慨的配合,它只用于创建最终剪裁的初始多边形。

1.2示例代码

#include <vtkActor.h>
#include <vtkDataSetMapper.h>
#include <vtkHull.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPoints.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkXMLPolyDataReader.h>

int main(int argc, char* argv[]){
    
  // Parse command line arguments
  if (argc != 2)  {
    
    std::cout << "Required arguments: Filename e.g. cowHead.vtp" << std::endl;
    return EXIT_FAILURE;
  }

  vtkNew<vtkNamedColors> namedColors;

  vtkNew<vtkXMLPolyDataReader> reader;
  reader->SetFileName(argv[1]);

  vtkNew<vtkHull> hullFilter;
  hullFilter->SetInputConnection(reader->GetOutputPort());
  hullFilter->AddCubeFacePlanes();
  hullFilter->AddRecursiveSpherePlanes(5);

  vtkNew<vtkDataSetMapper> originalMapper;
  originalMapper->SetInputConnection(reader->GetOutputPort());
  originalMapper->ScalarVisibilityOff();

  // Create an actor for the surface
  vtkNew<vtkActor> originalActor;
  originalActor->SetMapper(originalMapper);
  originalActor->GetProperty()->SetDiffuseColor(namedColors->GetColor3d("Banana").GetData());

  vtkNew<vtkDataSetMapper> mapper;
  mapper->SetInputConnection(hullFilter->GetOutputPort());
  mapper->ScalarVisibilityOff();

  // Create an actor for the surface
  vtkNew<vtkActor> actor;
  actor->SetMapper(mapper);
  actor->GetProperty()->SetDiffuseColor(namedColors->GetColor3d("Tomato").GetData());
  actor->GetProperty()->SetEdgeColor(namedColors->GetColor3d("IvoryBlack").GetData());
  actor->GetProperty()->SetOpacity(0.5);
  actor->GetProperty()->EdgeVisibilityOff();

  vtkNew<vtkRenderer> renderer;
  vtkNew<vtkRenderWindow> renderWindow;
  renderWindow->AddRenderer(renderer);
  renderWindow->SetWindowName("ConvexHull");

  vtkNew<vtkRenderWindowInteractor> interactor;
  interactor->SetRenderWindow(renderWindow);

  renderer->AddActor(originalActor);
  renderer->AddActor(actor);
  renderer->SetBackground(namedColors->GetColor3d("SlateGray").GetData());

  renderWindow->Render();
  interactor->Start();

  return EXIT_SUCCESS;
}

计算结果,如下:

在这里插入图片描述在这里插入图片描述在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liushao1031177/article/details/122214077

智能推荐

C语言bfs算法自动走贪吃蛇,智能寻路贪吃蛇系列之 初级BFS寻路算法-程序员宅基地

文章浏览阅读240次。//Bfs.cpp#include "stdafx.h"#include "Bfs.h"int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};void Bfs::InitBfs(bool **chess,XY size){m_size=size;m_chess=new bool *[m_size.x];m_visit=new bool *[m_size.x];m_pa..._bfs贪吃蛇

技术讨论:我心中TOP1的编程语言_内存安全的编程语言-程序员宅基地

文章浏览阅读6.6k次,点赞13次,收藏14次。编程语言(programming language)是一种计算机和人之间交流的形式。它是一种为了完成计算机任务而编写的特定语言。编程语言包括指令、变量、函数、条件语句、循环语句等等。程序员使用编程语言来告诉计算机执行任务,例如打开文件、执行数学运算、连接数据库等等。不同的编程语言适用于不同的应用领域,例如Java和Python在Web开发、机器学习、数据分析等领域应用广泛,而C++在操作系统、游戏开发等领域应用较多。【百度百科释义】_内存安全的编程语言

mysql 实数型变量定义,PL/pgSQL从入门到放弃(2)-变量定义与数据类型-程序员宅基地

文章浏览阅读256次。本文由 @小刘先森 原创,转载请注明出处。使用PL/pgSQL也有比较久的时间了,写几篇从入门开始学习的文章,方便小伙伴们学习。PL/pgSQL从入门到放弃(1)-入门PL/pgSQL从入门到放弃(2)-变量定义与数据类型PL/pgSQL从入门到放弃(3)-函数PL/pgSQL从入门到放弃(4)-控制结构PL/pgSQL从入门到放弃(5)-游标声明变量上一篇介绍到,PL/pgSQL是块结构的语言。..._plsql实数

warning C4251-程序员宅基地

文章浏览阅读115次。c++ - Warning C4251 when building a DLL that exports a class containing an ATL::CString member - Stack Overflow_warning c4251

真·卷积神经网络发明者福岛邦彦获奖!李飞飞、LSTM之父点赞祝贺-程序员宅基地

文章浏览阅读1.8k次。点击下方卡片,关注“CVer”公众号AI/CV重磅干货,第一时间送达本文转载自:机器之心1980 年,福岛邦彦首次使用卷积神经网络实现了模式识别,他被认为是真正的卷积神经网络发明者。近日,..._卷积 彦

C语言 预处理指令和宏定义_c#宏定义和预处理指令-程序员宅基地

文章浏览阅读167次。C语言 预处理指令和宏定义_c#宏定义和预处理指令

随便推点

java 虚拟机最佳实践_深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)-程序员宅基地

文章浏览阅读43次。第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的改进:根据最新的JDK1.7对全书内容进行了全面的升级和补充;增加了大量处理各种常见JVM问题的技巧和最佳实践;增加了若干与生产环境相结合的实战案例;对第1版中的错误和不足之处的修正等等。第2版不...

程序员进阶篇:简单聊聊mysql的脏读、不可重复读-程序员宅基地

文章浏览阅读905次,点赞18次,收藏13次。脏读,就是读到了其他会话还没有提交的修改。下面用例子说明:可以看到,会话 2 修改了 id 为 222 的用户,在还没提交或回滚事务之前,会话 1 就读到了这些改动。脏读的本质就是,还没结束的写操作被读操作分割了。所以,为了解决脏读,就必须让写操作不可被读操作分割(当然,也不能被其他写操作分割),即保证所谓的原子性。不可重复读,就是在同一个事务中,多次读相同的记录但读到了不同的结果。

eclipse javaee版本配置tomcat并向tomcat发布工程 ._eclipse javaee 编译 发布-程序员宅基地

文章浏览阅读3.9k次。1.下载最新的eclipse javaee版本,下载地址为:http://www.eclipse.org/downloads/,这里注意一定要选择javaee版本,2.Tomcat下载,链接为:http://tomcat.apache.org/3.下载eclipse tomcat插件,下载地址为:http://download.csdn.net/detail/longsheng_eclipse javaee 编译 发布

第十一届 “MathorCup“- B题:基于机器学习的团簇能量预测及结构全局寻优方法-程序员宅基地

文章浏览阅读214次。团簇是由多个分子或原子聚集在一起的微观结构,研究团簇的全局最优结构(即能量最低)对于发现新型材料的结构和性能具有重要意义。传统的理论研究方法存在计算时间长、计算效果差等问题,而机器学习作为一个极具前景的多学科交叉领域,能够有效提高模型学习与计算的效率。因此本文针对三维团簇的能量预测和结构寻优问题,采用了多种机器学习方法进行研究。最后,我们对模型进行了灵敏度分析不断改变学习因子的数值,发现模型预测出的能量值波动幅度较低,具有较强的稳定性,证明了建立模型的可靠性、有效性及鲁棒性,

【HTML/CSS/JavaScript-编程指南】-程序员宅基地

文章浏览阅读676次,点赞8次,收藏10次。学习网站:https://www.runoob.com/html/html-tutorial.html。

推荐文章

热门文章

相关标签