VTK:对输入的三维模型在某个方向等间距提取模型的切面轮廓线
测试的三维模型为bunny,即斯坦福兔子
代码示例:
#include <vtkOBJReader.h>
#include <vtkSmartPointer.h>
#include <vtkCutter.h>
#include <vtkPolyDataMapper.h>
#include <vtkPlane.h>
#include <vtkProperty.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataWriter.h>
#include <vtkPolyData.h>
#include <vtkStripper.h>
#include <vtkContourFilter.h>
#include <vtkPoints.h>
#include <iostream>
using namespace std;double Distance(double *a,double *b)
{double o=(a[0]-b[0])*(a[0]-b[0]);double p=(a[1]-b[1])*(a[1]-b[1]);double q=(a[2]-b[2])*(a[2]-b[2]);return o+p+q;
}
int main()
{//读取obj文件vtkSmartPointer<vtkOBJReader> reader =vtkSmartPointer<vtkOBJReader>::New(); reader->SetFileName("C:\\Users\\HuangWang\\Desktop\\bunny-chuli.obj"); reader->Update();vtkSmartPointer<vtkPolyData> inputPolyData=vtkSmartPointer<vtkPolyData>::New();inputPolyData = reader->GetOutput();vtkSmartPointer<vtkPolyDataMapper> inputMapper =vtkSmartPointer<vtkPolyDataMapper>::New();inputMapper->SetInput(inputPolyData);//创建切割平面vtkSmartPointer<vtkPlane> plane =vtkSmartPointer<vtkPlane>::New();plane->SetOrigin(inputPolyData->GetCenter());//设置切割平面起点plane->SetNormal(1,0,0);//设置切割方向为X方向//得到输入的obj模型的最小坐标double minBound[3];minBound[0] = inputPolyData->GetBounds()[0];minBound[1] = inputPolyData->GetBounds()[2];minBound[2] = inputPolyData->GetBounds()[4];//得到输入的obj模型的最小大坐标double maxBound[3];maxBound[0] = inputPolyData->GetBounds()[1];maxBound[1] = inputPolyData->GetBounds()[3];maxBound[2] = inputPolyData->GetBounds()[5];//得到输入的obj模型的中心坐标double center[3];center[0] = inputPolyData->GetCenter()[0];center[1] = inputPolyData->GetCenter()[1];center[2] = inputPolyData->GetCenter()[2];double distanceMin=sqrt(Distance(minBound,center));double distanceMax=sqrt(Distance(maxBound,center));//创建模型切割器vtkSmartPointer<vtkCutter> cutter =vtkSmartPointer<vtkCutter>::New();cutter->SetCutFunction(plane);//设置切割平面cutter->SetInput(inputPolyData);//设置模型cutter->GenerateValues(30, -distanceMin, distanceMax);//在模型的最大最小范围内等间距创建30个切面,得到轮廓线//将切线结果输出为vtk文件格式vtkSmartPointer<vtkPolyData> ResultPoly=cutter->GetOutput();//输出为polydatavtkSmartPointer<vtkPolyDataWriter> vtkWriter = vtkSmartPointer<vtkPolyDataWriter>::New();vtkWriter->SetInput(cutter->GetOutput());vtkWriter->SetFileName("C:\\Users\\HuangWang\\Desktop\\result.vtk");vtkWriter->Write();vtkSmartPointer<vtkPolyDataMapper> cutterMapper =vtkSmartPointer<vtkPolyDataMapper>::New();cutterMapper->SetInputConnection( cutter->GetOutputPort());cutterMapper->ScalarVisibilityOff();vtkSmartPointer<vtkActor> planeActor =vtkSmartPointer<vtkActor>::New();planeActor->GetProperty()->SetColor(1,0,0);planeActor->GetProperty()->SetLineWidth(5);planeActor->SetMapper(cutterMapper);vtkSmartPointer<vtkActor> inputActor =vtkSmartPointer<vtkActor>::New();inputActor->GetProperty()->SetColor(0,1,0);inputActor->SetMapper(inputMapper);vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(planeActor); renderer->AddActor(inputActor);vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);renderWindow->SetSize(600, 600);vtkSmartPointer<vtkRenderWindowInteractor> interactor =vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);renderer->SetBackground(0,0,0);renderWindow->Render();interactor->Start();return 0;}
结果示例:
最后输出的结果VTK文件包含了每一条轮廓线的点数据
如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com,更多博文干货等着您。
VTK:对输入的三维模型在某个方向等间距提取模型的切面轮廓线相关推荐
- linux下pdb文件除水,Linux命令删除文本里rmsd20行,输入到一个新的文本,然后提取出相应的pdb id。...
Linux命令删除文本里rmsd>20行,输入到一个新的文本,然后提取出相应的pdb id. 文本名字为 rmsd.dat, 文本内容是如下: refer.pdb - complex_patch ...
- FPGA经验谈系列文章——FPGA开发方向以及算法开发模型
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA经验谈系列文章--FPGA开发方向以及算法开发模型 前言 接口方向 算法方向 总结 前言 FPGA开发笼统的说可以分为两个方向 ...
- 使用vtk提取模型模型边线2021-01-24
最近做一个项目,需要用到提取模型边线的功能,分享和记录一下提取模型边线过程和方法. 主要用到vtk类有vtkSTLReader,读取stl模型文件,vtkAppendPolyData,合并读取的stl ...
- VTK修炼之道50:图形基本操作进阶_网格模型的特征边 与 封闭性检测
1.封闭性检测 由于受原始数据.重建方法的限制,得到的网格模型并不是封闭的.有时为了显示或者处理某些要求,需要网格必须是封闭的. 封闭性网格应该比较好理解,比如一个球形网格. 1.1网格模型边的分类 ...
- matlab 三维模型怎么导入ansys,Ansys怎么导入模型?Ansys导入模型的方法
Ansys是一款非常好用的CAE工具之一,它提供了一个完整的实体建模及网格划分工具,那你知道Ansys怎么导入模型的吗?接下来我们一起往下看看Ansys导入模型的方法吧. 方法步骤 1.这里小编以常用 ...
- (02)vtk 绘制模型的外轮廓线 模型轮廓线
前言 在一个项目需求中,需要在木外部绘制一个外轮廓,用不同轮廓的颜色表示设备是否存在干涉. 方法 代码如下: void showboundingbox() { vtkSmartPointer<v ...
- python输入身份证号得到出生日期_初学django1:django模型中自定义方法从身份证号码中获取出生日期...
有一个Person的Model,里面用到了身份证.出生日期字段.要求如下: 在存入的时候对身份证号码进行校验. 自动从身份证号码中获取出生日期. 因为初学,不知道如何插入自定义校验,就在Model.p ...
- 利用vtk+cgal+openmesh(或者第三方格式转换软件)做牙齿模型
如何建立牙齿模型? 使用vtk+cgal+openmesh实现模型建立与修复优化 vtk实现dicom图片生成模型,运用阈值图像法生成各类模型,不同部位牙齿和骨头的分离阈值稍有变化,运用滑动条实现阈值 ...
- 输入时字母或数字之间的间距突然变大解决方法
现象:0012wadc希望他们之间的间距小点0012wadc 原因:是因为全角和半角切换的问题 解决方法: 全角半角切换换成Shift+空格,然后进行切换. 其他的输入法,也相同的解决方法 全角和半角 ...
最新文章
- 我和美国 AI 博士聊了聊:2020 年,这件事比存钱更重要!
- pycharm中传入命令行参数
- DEV express 对Gridview某行的元素赋值
- 基于 MATLAB 的 PCM 编码解码实现
- 操作系统(三十四)覆盖和交换
- 服务器性能查看常用命令
- 简单的busybox创建_用Busybox创建文件系统
- class传参 python_Python类的概念、定义、属性、继承
- 使用Jquery插件bTabs实现多页签打开效果
- STM32 system_stm32f10x.c文件分析
- 更改当前数据库的所有者
- sklearn 常用api(一)
- linux新建java文件夹删除不了怎么办_Linux无法删除文件夹 Device or resource busy
- php冗余,php – 如何使用规范化删除冗余?
- 2018年技术直播PPT干货分享
- phpwind不支持php7,phpwind8.7 phpwind v8.7 新功能曝光
- 前端灰度发布 你知多少?
- 关于STM32中的引脚重映射
- 扩展名为ifo的文件怎么播放
- 【FPGA基础】DDR的基本原理介绍,DDR快速上手使用