对多面体数据进行裁剪和加盖的功能


开发环境:

  1. Windows 11 家庭中文版
  2. Microsoft Visual Studio Community 2019
  3. VTK-9.3.0.rc0
  4. vtk-example

demo解决问题:对多面体数据进行裁剪和加盖的功能。

关键点:

  1. 创建了一个平面,并将其定位在输入多面体数据的中心位置,同时指定了一个特定的法线。(法线影响平面裁剪角度)
  2. 使用vtkClipPolyData类来使用之前定义的平面对输入的多面体数据进行裁剪。裁剪后的数据被更新并存储起来。
  3. 创建了一个vtkDataSetMapper和vtkActor分别用于裁剪后的多面体数据的渲染,同时指定了特定的颜色和属性。
  4. 使用vtkFeatureEdges提取裁剪后数据的特征边,并将其转换为多边形,然后赋予不同的颜色。
 /*这段代码的功能是提取多面体数据的特征边。具体来说:通过vtkNew创建了一个名为boundaryEdges的vtkFeatureEdges对象,并使用SetInputData方法将输入的多面体数据传入。紧接着对boundaryEdges进行了一系列设置:BoundaryEdgesOn()开启了边界特征的提取。FeatureEdgesOff()关闭了特征边的提取。NonManifoldEdgesOff()关闭了非流形边的提取。ManifoldEdgesOff()关闭了流形边的提取。接下来,代码创建了一个名为boundaryStrips的vtkStripper对象,并使用SetInputConnection方法将boundaryEdges的输出端口连接到boundaryStrips上。最后,调用了Update()方法来执行特征边的提取操作。*/// Now extract feature edgesvtkNew<vtkFeatureEdges> boundaryEdges;boundaryEdges->SetInputData(polyData);boundaryEdges->BoundaryEdgesOn();boundaryEdges->FeatureEdgesOff();boundaryEdges->NonManifoldEdgesOff();boundaryEdges->ManifoldEdgesOff();vtkNew<vtkStripper> boundaryStrips;boundaryStrips->SetInputConnection(boundaryEdges->GetOutputPort());boundaryStrips->Update();

在这里插入图片描述


prj name: CapClip

#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkClipPolyData.h>
#include <vtkDataSetMapper.h>
#include <vtkFeatureEdges.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPlane.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkStripper.h>
#include <vtkXMLPolyDataReader.h>// Readers
#include <vtkBYUReader.h>
#include <vtkOBJReader.h>
#include <vtkPLYReader.h>
#include <vtkPolyDataReader.h>
#include <vtkSTLReader.h>
#include <vtkXMLPolyDataReader.h>namespace {
vtkSmartPointer<vtkPolyData> ReadPolyData(std::string const& fileName);
}//
// Demonstrate the use of clipping and capping on polyhedral data
//int main(int argc, char* argv[])
{// Define colorsvtkNew<vtkNamedColors> colors;auto backgroundColor = colors->GetColor3d("steel_blue");auto boundaryColor = colors->GetColor3d("banana");auto clipColor = colors->GetColor3d("tomato");// PolyData to processauto polyData = ReadPolyData(argc > 1 ? argv[1] : "");vtkNew<vtkPlane> plane;plane->SetOrigin(polyData->GetCenter());plane->SetNormal(1.0, -1.0, -1.0);//平面的法线朝向影响裁剪角度//plane->SetNormal(-1.0, -1.0, 1.0);vtkNew<vtkClipPolyData> clipper;clipper->SetInputData(polyData);clipper->SetClipFunction(plane);clipper->SetValue(0);clipper->Update();polyData = clipper->GetOutput();vtkNew<vtkDataSetMapper> clipMapper;clipMapper->SetInputData(polyData);vtkNew<vtkActor> clipActor;clipActor->SetMapper(clipMapper);clipActor->GetProperty()->SetDiffuseColor(clipColor.GetData());clipActor->GetProperty()->SetInterpolationToFlat();clipActor->GetProperty()->EdgeVisibilityOn();/*这段代码的功能是提取多面体数据的特征边。具体来说:通过vtkNew创建了一个名为boundaryEdges的vtkFeatureEdges对象,并使用SetInputData方法将输入的多面体数据传入。紧接着对boundaryEdges进行了一系列设置:BoundaryEdgesOn()开启了边界特征的提取。FeatureEdgesOff()关闭了特征边的提取。NonManifoldEdgesOff()关闭了非流形边的提取。ManifoldEdgesOff()关闭了流形边的提取。接下来,代码创建了一个名为boundaryStrips的vtkStripper对象,并使用SetInputConnection方法将boundaryEdges的输出端口连接到boundaryStrips上。最后,调用了Update()方法来执行特征边的提取操作。*/// Now extract feature edgesvtkNew<vtkFeatureEdges> boundaryEdges;boundaryEdges->SetInputData(polyData);boundaryEdges->BoundaryEdgesOn();boundaryEdges->FeatureEdgesOff();boundaryEdges->NonManifoldEdgesOff();boundaryEdges->ManifoldEdgesOff();vtkNew<vtkStripper> boundaryStrips;boundaryStrips->SetInputConnection(boundaryEdges->GetOutputPort());boundaryStrips->Update();// Change the polylines into polygonsvtkNew<vtkPolyData> boundaryPoly;boundaryPoly->SetPoints(boundaryStrips->GetOutput()->GetPoints());boundaryPoly->SetPolys(boundaryStrips->GetOutput()->GetLines());vtkNew<vtkPolyDataMapper> boundaryMapper;boundaryMapper->SetInputData(boundaryPoly);vtkNew<vtkActor> boundaryActor;boundaryActor->SetMapper(boundaryMapper);boundaryActor->GetProperty()->SetDiffuseColor(boundaryColor.GetData());// Create graphics stuff//vtkNew<vtkRenderer> renderer;renderer->SetBackground(backgroundColor.GetData());renderer->UseHiddenLineRemovalOn();vtkNew<vtkRenderWindow> renderWindow;renderWindow->AddRenderer(renderer);renderWindow->SetSize(640, 480);vtkNew<vtkRenderWindowInteractor> interactor;interactor->SetRenderWindow(renderWindow);// Add the actors to the renderer, set the background and size//renderer->AddActor(clipActor);renderer->AddActor(boundaryActor);// Generate an interesting view//renderer->ResetCamera();renderer->GetActiveCamera()->Azimuth(30);renderer->GetActiveCamera()->Elevation(30);renderer->GetActiveCamera()->Dolly(1.2);renderer->ResetCameraClippingRange();renderWindow->Render();renderWindow->SetWindowName("CapClip");renderWindow->Render();interactor->Start();return EXIT_SUCCESS;
}namespace {
vtkSmartPointer<vtkPolyData> ReadPolyData(std::string const& fileName)
{vtkSmartPointer<vtkPolyData> polyData;std::string extension = "";if (fileName.find_last_of(".") != std::string::npos){extension = fileName.substr(fileName.find_last_of("."));}// Make the extension lowercasestd::transform(extension.begin(), extension.end(), extension.begin(),::tolower);if (extension == ".ply"){vtkNew<vtkPLYReader> reader;reader->SetFileName(fileName.c_str());reader->Update();polyData = reader->GetOutput();}else if (extension == ".vtp"){vtkNew<vtkXMLPolyDataReader> reader;reader->SetFileName(fileName.c_str());reader->Update();polyData = reader->GetOutput();}else if (extension == ".obj"){vtkNew<vtkOBJReader> reader;reader->SetFileName(fileName.c_str());reader->Update();polyData = reader->GetOutput();}else if (extension == ".stl"){vtkNew<vtkSTLReader> reader;reader->SetFileName(fileName.c_str());reader->Update();polyData = reader->GetOutput();}else if (extension == ".vtk"){vtkNew<vtkPolyDataReader> reader;reader->SetFileName(fileName.c_str());reader->Update();polyData = reader->GetOutput();}else if (extension == ".g"){vtkNew<vtkBYUReader> reader;reader->SetGeometryFileName(fileName.c_str());reader->Update();polyData = reader->GetOutput();}else{// Return a polydata sphere if the extension is unknown.vtkNew<vtkSphereSource> source;source->SetThetaResolution(20);source->SetPhiResolution(11);source->Update();polyData = source->GetOutput();}return polyData;
}
} // namespace

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/669529.shtml

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

相关文章

详解洛谷P1352 没有上司的舞会(树形DP经典例题)

题目 没有上司的舞会 - 洛谷 思路 这是一道非常裸的树形DP&#xff0c;对于初学树形DP的OIer来说&#xff0c;是一道十分良心的题 我们可以设: dp[x][0]表示以x为根的子树,且x不参加舞会的最大快乐值 dp[x][1]表示以x为根的子树&#xff0c;且x参加了舞会的最大快乐值 则有 …

爬虫工作量由小到大的思维转变---<第四十四章 Scrapyd 用gerapy管理多台机器爬虫>

前言: 之前讲过关于如何在gerapy中部署本地爬虫, 爬虫工作量由小到大的思维转变---&#xff1c;第三十四章 Scrapy 的部署scrapydGerapy&#xff1e;_gerapy如何登录-CSDN博客 爬虫工作量由小到大的思维转变---&#xff1c;第三十五章 Scrapy 的scrapydGerapy 部署爬虫项目&…

SpringBoot:配置相关知识点

SpringBoot&#xff1a;多环境配置 配置知识点demo&#xff1a;点击查看LearnSpringBoot02 点击查看更多的SpringBoot教程 一、SpringBootApplication SpringBootApplication 来标注一个主程序类&#xff0c;说明这是一个Spring Boot应用&#xff0c;运行这个类的main方法来…

睿尔曼超轻量仿人机械臂-- RM65-B手眼标定使用说明

一、前言 机器人的视觉系统分为固定场景视觉系统和运动的「手-眼」视觉系统。相机与机器人手臂末端&#xff0c;构成手眼视觉系统。根据相机在机器人安装位置的不同&#xff0c;手眼视觉系统分为Eye-in-Hand系统&#xff08;眼在手上&#xff09;和Eye-to-Hand系统&#xff08…

Javascript | 打印菱形

Javascript打印菱形&#xff0c;在校大学生可以拿来糊弄作业&#xff08;笑&#xff09; var str ; for (var i 1; i < 9; i) {if (i < 5) {for (var k1 1; k1 < 5 - i; k1) {str ;}} else {for (var k2 1; k2 < i - 5; k2) {str ;}}if (i < 5) {for (…

Curl 使用指南(进阶版)

使用Curl可以轻松GET资源、发送POST请求、定制HTTP头。高级技巧如代理、Cookie、证书 一、Curl 的基本用法 curl [options] [URL]options &#xff1a;指定 Curl 的行为的选项 URL &#xff1a;要访问的资源的地址 支持一下&#xff1a; Python Gui图形化开发 MySQL使用教程 …

开源软件:推动技术创新的引擎

目录 前言1 低成本、可协作性和透明度的特点1.1 社区化开发模式的催生1.2 成本效益的体现1.3 透明度的增强 2 开放协议的关键作用2.1 保障知识产权的开源协议2.2 灵活性与自由的MIT协议2.3 广泛应用的Apache协议 3 安全风险的审慎考虑3.1 潜在的恶意代码威胁3.2 定期安全审查的…

C++中RTTI实现原理

目录 1.引言 2.typeid 2.1.虚函数表&#xff08;vtable&#xff09; 2.2.类型信息&#xff08;type_info&#xff09; 3.dynamic_cast 4.缺陷 5.一些库/软件提供的RTTI实现 5.1. CATIA的RTTI 5.2. QT的RTTI 5.3. FreeCAD的RTTI 6.实例 7.总结 1.引言 RTTI是Runtime…

信任与创新 | 回顾通付盾的2023!

-END- 数信云&#xff0c;基于区块链与人工智能的数据安全应用与服务平台

【Spring】Spring 启示录

一、OCP 开闭原则 核⼼&#xff1a;在扩展系统功能时不需要修改原先写好的代码&#xff0c;就是符合OCP原则的&#xff0c;反之修改了原先写好的代码&#xff0c;则违背了OCP原则的 若在扩展系统功能时修改原先稳定运⾏程序&#xff0c;原先的所有程序都需要进⾏重新测试&…

N-143基于springboot博客系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;AdminLTEHTML 服务端技术&#xff1a;springbootmybatis-plusthymeleaf 本项目分前台和后台&#xff0c;主要有普…

FM波的调制与解调

一、实验原理 1.FM的调制 产生调频信号有两种方法&#xff0c;直接调频法和间接调频法。间接调频法就是可以通过调相间接实现调频的方法。但电路较复杂&#xff0c;频移小&#xff0c;且寄生调幅较大&#xff0c;通常需多次倍频使频移增加。对调频器的基本要求是调频频移大&am…

大数据Doris(六十三):基于Doris的有道精品课数据中台建设实践

文章目录 基于Doris的有道精品课数据中台建设实践 一、背景

【Java程序设计】【C00245】基于Springboot的家政服务管理平台(有论文)

基于Springboot的家政服务管理平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的家政服务管理平台 本系统分为前台模块、管理员功能模块、用户功能模块以及服务人员功能模块。 前台模块&#xff1a;系统首页的…

Spring IOC 之深入分析 Aware 接口

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是小徐&#x1f947;☁️博客首页&#xff1a;CSDN主页小徐的博客&#x1f304;每日一句&#xff1a;好学而不勤非真好学者 &#x1f4dc; 欢迎大家关注&#xff01; ❤️ &#xfeff;AbstractAutowireCapableBeanFacto…

力扣分式化简

题目描述&#xff1a; 有一个同学在学习分式。他需要将一个连分数化成最简分数&#xff0c;你能帮助他吗&#xff1f; 连分数是形如上图的分式。在本题中&#xff0c;所有系数都是大于等于0的整数。 输入的cont代表连分数的系数&#xff08;cont[0]代表上图的a0&#xff0c;以…

Java学习-枚举类和泛型

1.枚举 什么是枚举类&#xff1f;格式是什么&#xff1f;&#xff1f; 枚举类的特点&#xff1a; 抽象枚举的注意点&#xff1a; 枚举的使用场景&#xff1a; 示例&#xff1a;枚举类对象作为参数传递 2.泛型 对泛型的认识&#xff1a; 自定义泛型类&#xff1a; 格式&#xff…

MySQL-运维-读写分离

一、介绍 二、一主一从读写分离 三、双主双从 1、介绍 2、准备 3、搭建 四、双主双从读写分离

“极简壁纸“爬虫JS逆向·实战

文章目录 声明目标分析确定目标目标检索 代码补全完整代码 爬虫逻辑完整代码 运行结果 声明 本教程只用于交流学习&#xff0c;不可用于商业用途&#xff0c;不可对目标网站进行破坏性请求&#xff0c;请遵守相关法律法规。 目标分析 确定目标 获取图片下载链接 目标检索…

OpenGL 入门(九)—Material(材质)和 光照贴图

文章目录 材质设置材质光的属性脚本实现 光照贴图漫反射贴图高光反射贴图 材质 材质本质是一个数据集&#xff0c;主要功能就是给渲染器提供数据和光照算法。 如果我们想要在OpenGL中模拟多种类型的物体&#xff0c;我们必须针对每种表面定义不同的材质(Material)属性。 我们…