VTK的学习方法-第二类型应用

VTK的高级使用方法是自己写一个算法(Filter),本文使用的数据类型位polydata,这个数据类型应用比较广泛。

我们的算法一般是继承VTK里面的vtkpolydataalgorithm,然后自己添加一些变量,重写(override)里面的requestdata方法。

我们写一个增加噪声的方法吧。首先定义头文件如下

#ifndef MYNOISEFILTER
#define MYNOISEFILTER#include <vtkPolyDataAlgorithm.h>class myNoiseFilter:public vtkPolyDataAlgorithm{
public:vtkTypeMacro(myNoiseFilter,vtkPolyDataAlgorithm);static myNoiseFilter *New();vtkSetMacro(NoiseVariance,double);
private:myNoiseFilter(const myNoiseFilter&);void operator=(const myNoiseFilter&);double NoiseVariance;
protected:myNoiseFilter(){}~myNoiseFilter(){}int RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) override;
};#endif // MYNOISEFILTER

然后是这个类的requestdata部分

#include "myNoiseFilter.h"#include <vtkObjectFactory.h>
#include <vtkStreamingDemandDrivenPipeline.h>
#include <vtkInformationVector.h>
#include <vtkInformation.h>#include <vtkMath.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>vtkStandardNewMacro(myNoiseFilter);int myNoiseFilter::RequestData(vtkInformation *request,vtkInformationVector **inputVector,vtkInformationVector *outputVector){// Get the input and outputvtkInformation* inInfo=inputVector[0]->GetInformationObject(0);vtkPolyData* input=vtkPolyData::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT()));vtkInformation* outInfo=outputVector->GetInformationObject(0);vtkPolyData* output=vtkPolyData::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT()));vtkMath::RandomSeed(time(NULL));output->ShallowCopy(input);vtkSmartPointer<vtkPoints> newPoints=vtkSmartPointer<vtkPoints>::New();for(vtkIdType i=0;i<output->GetNumberOfPoints();++i){double p[3];output->GetPoint(i,p);for(int j=0;j<3;++j){double value=vtkMath::Random(-this->NoiseVariance,this->NoiseVariance);p[j]+=value;}newPoints->InsertNextPoint(p);}output->SetPoints(newPoints);return 1;
}

然后我们应用一下这个算法,看看结果如何?

#include <iostream>
#include "myNoiseFilter.h"#include <vtkSphereSource.h>
#include <vtkPlaneSource.h>#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkNew.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkProperty.h>using namespace std;int main(int,char**)
{vtkSmartPointer<vtkPlaneSource> plane=vtkSmartPointer<vtkPlaneSource>::New();plane->SetXResolution(10);plane->SetYResolution(10);plane->Update();vtkSmartPointer<vtkPlaneSource> plane2=vtkSmartPointer<vtkPlaneSource>::New();plane2->SetXResolution(10);plane2->SetYResolution(10);plane2->SetCenter(0,0,2);plane2->Update();vtkNew<vtkPolyDataMapper> planeMapper;planeMapper->SetInputConnection(plane->GetOutputPort());vtkNew<vtkActor> planeActor;planeActor->SetMapper(planeMapper);planeActor->GetProperty()->SetColor(0,1,0);vtkSmartPointer<myNoiseFilter> noiseFilter=vtkSmartPointer<myNoiseFilter>::New();noiseFilter->SetInputConnection(plane2->GetOutputPort());noiseFilter->SetNoiseVariance(0.05);noiseFilter->Update();vtkNew<vtkPolyDataMapper> noiseMapper;noiseMapper->SetInputConnection(noiseFilter->GetOutputPort());vtkNew<vtkActor> noiseActor;noiseActor->SetMapper(noiseMapper);noiseActor->GetProperty()->SetColor(1,0,0);vtkNew<vtkRenderer> ren;ren->SetBackground(0.2,0.3,0.5);ren->AddActor(planeActor);ren->AddActor(noiseActor);vtkNew<vtkRenderWindow> renWin;renWin->SetSize(1024,1024);renWin->AddRenderer(ren);vtkNew<vtkRenderWindowInteractor> iren;vtkNew<vtkInteractorStyleTrackballCamera> style;iren->SetInteractorStyle(style);iren->SetRenderWindow(renWin);iren->Initialize();iren->Start();return 0;
}

运行结果如下图所示

图1 结果,绿色的是原始平面,红色是经过增加噪声后的平面。

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

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

相关文章

在Ubuntu 20.04 上安装 CoppeliaSim

在 Ubuntu 20.04 上安装 CoppeliaSim Edu V4.6.0 rev18 的步骤如下&#xff1a; 1. 下载安装文件: 首先&#xff0c;确保您已经下载了 CoppeliaSim_Edu_V4_6_0_rev18_Ubuntu20_04.tar.xz 文件。您可以从 Coppelia Robotics 的官方网站下载。 2. 解压缩文件: 打开终端&#…

关于Oracle透明数据加密(TDE)的两个概念

在上一篇文章“Oracle TDE和表空间中的数据量有关系吗&#xff1f;”中&#xff0c;我们证明了加密和解密的时间和表空间内是否有数据没有关系。 本文论证&#xff1a;加密和解密的时间基本相等&#xff0c;如果是Exadata&#xff0c;解密会稍快&#xff0c;因为Exadata支持解…

开发面试题-更新中...

探迹科技&#xff08;腾讯面试官&#xff09; 1.了不了解循环屏障 2.对于java中的线程冲突有多少了解&#xff08;我要算1加到1亿&#xff09; 3.mysql调优怎么调&#xff08;我跟他讲了explain&#xff09; 4.type中ref&#xff0c;range,const的区别 5.我有1亿的数据量&…

京东 北京 java 中级: 哪些情况下的对象会被垃圾回收机制处理掉? 哪些对象可以被看做是 GC Roots 呢?对象不可达,一定会被垃圾收集器回收么?

我同学最近在面试java的岗位, 这是他遇到的某些关于java的JVM中垃圾回收相关的部分的问题, 他来问我, 我特以此文章来解答. 公司 京东 base 北京 面试时间 2024年10月23日16:00:00 他跟我说, 面试官一上来就问了一个关于JVM的问题, 直接就给他难住了, 问题是 : 哪些情况下…

深入理解Qt中的QTableView、Model与Delegate机制

文章目录 显示效果QTableViewModel(模型)Delegate(委托)ITEM控件主函数调用项目下载在Qt中,视图(View)、模型(Model)和委托(Delegate)机制是一种非常强大的架构,它们实现了MVC(模型-视图-控制器)设计模式。这种架构分离了数据存储(模型)、数据展示(视图)和数据操作(委托),使…

通过Python爬虫获取商品销量数据,轻松掌握市场动态

为什么选择Python爬虫&#xff1f; 简洁易用&#xff1a;Python语言具有简洁的语法和丰富的库&#xff0c;使得编写爬虫变得简单高效。强大的库支持&#xff1a;Python拥有强大的爬虫框架&#xff08;如Scrapy、BeautifulSoup、Requests等&#xff09;&#xff0c;可以快速实现…

【记录】Django数据库的基础操作

数据库连接 在Django中使用 mysqlclient 这个包用于数据库的连接&#xff0c;切换至 Django环境中直接 pip install mysqlclient 安装此包 1 数据库连接配置 在项目目录下的setting.py中配置 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: mini,#数据库名US…

Tips--解决更新resource.qrc之后新的资源无法加载的问题

解决更新resource.qrc之后新的资源无法加载的问题 问题原因解决方法 问题 在使用pyQT或者pyside开发桌面程序的时候&#xff0c;resource.qrc是整合资源文件的地方&#xff0c;如下所示 <!DOCTYPE RCC><RCC version"1.0"> <qresource><file&g…

uniapp修改input中placeholder样式

Uniapp官方提供了两种修改的属性方法&#xff0c;但经过测试&#xff0c;只有 placeholder-class 属性能够生效 <input placeholder"请输入手机验证码" placeholder-class"input-placeholder"/><!-- css --> <style lang"scss" s…

Vue--绑定class样式

有三种方式&#xff1a; 1、字符串写法(freeA) 适用于&#xff1a;样式的类名不确定&#xff0c;需要动态指定 2、数组写法(freeB) 适用于&#xff1a;要绑定的样式个数不确定&#xff0c;名字也不确定 3、对象写法(freeC) 适用于&#xff1a;要绑定的样式个数确定&#xff0c…

Python的买家秀大揭秘:用代码点亮API数据

在一个充满无限可能的数字世界里&#xff0c;Python侦探正准备开始他的新任务&#xff1a;揭开买家秀API数据的神秘面纱。这不仅是一次技术的挑战&#xff0c;更是一次与时间赛跑的较量。Python侦探&#xff0c;这位编程界的福尔摩斯&#xff0c;打开了他的笔记本电脑&#xff…

sealed class-kotlin中的封闭类

在 Kotlin 中&#xff0c;sealed class&#xff08;密封类&#xff09;是一种特殊的类&#xff0c;用于限制继承的类的数量。密封类可以被用来表示一组有限的类型&#xff0c;通常用于状态管理或表达多种可能的错误类型。 密封类用 sealed 关键字定义&#xff0c;这意味着只能…

matlab怎样自动搜索文件夹中的所有txt文件,并将每个txt文件中的数据存放到一个cell数组中——MATLAB批量处理数据

在使用MATLAB批量处理数据时&#xff0c;有时候需要自动搜索文件夹中的所有txt文件&#xff0c;并将每个txt文件中的数据存放到一个以一定规律命名的变量中&#xff0c;以便于后续通过循环处理每个变量数据。 然而&#xff0c;MATLAB并不支持在变量名中直接使用i来动态生成变量…

Unity发送Http

本篇实现在Unity中发送Http请求。 讲解Get&#xff0c;Post&#xff0c;用于在Unity中进行数据对接。 一、Get IEnumerator Get() {string url "";//链接UnityWebRequest request UnityWebRequest.Get(url);//创建UnityWebRequest实例并设置请求方式为Getyield …

Flutter 中的 PopScope 小部件:全面指南

Flutter 中的 PopScope 小部件&#xff1a;全面指南 在 Flutter 应用开发中&#xff0c;导航和路由管理是构建复杂应用时必须面对的挑战之一。PopScope 小部件是 Flutter 2.0 版本引入的一个新功能&#xff0c;它提供了一种更灵活的方式来控制页面的弹出和返回行为。本文将带你…

OpenCV高级图形用户界面(9)更改指定窗口的位置函数moveWindow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将窗口移动到指定的位置。 cv::moveWindow() 函数用于更改指定窗口的位置。你可以使用这个函数来移动窗口到屏幕上的任何位置。 函数原型 void …

C++大坑之——多继承(菱形继承)

文章目录 前言一、多继承是什么&#xff1f;1. 多继承概念2. 多继承语法 二、菱形继承1. 为什么会有菱形继承问题&#xff1f;2. 代码感受菱形继承3. 虚拟继承1&#xff09;虚拟继承概念及语法2&#xff09;虚拟继承的原理 4. 为什么要有虚基表&#xff1f;5. 为什么要有偏移量…

bootloader跳转app卡死(IAP卡死)

1、 关闭所有中断再跳转APP 一般bootloader跳转到APP时要关闭app中用到的中断(防止中断打断程序的运行&#xff0c;导致程序跑飞&#xff09;&#xff0c;那么查看系统中用到的中断&#xff1a;串口中断、滴答定时器中断&#xff0c;所以&#xff0c;跳转之前要关闭这两个中断&…

Vlan和Trunk

VLAN的定义 虚拟局域网&#xff0c;用来在二层网络中隔离广播域不同VLAN的设备在二层网络中无法互相通讯&#xff08;二层隔离技术&#xff09; VLAN的转发过程举例 源MAC字段后加上VLAN TAG字段&#xff0c;其中VLAN ID用来标识VLAN。 PC发送数据帧进入交换机&#xff0c;会…

使用SearXNG-搭建个人搜索引擎(附国内可用Docker镜像源)

介绍 SearXNG是聚合了七十多种搜索服务的开源搜索工具。我们可以匿名浏览页面&#xff0c;不会被记录和追踪。作为开发者&#xff0c;SearXNG也提供了清晰的API接口以及完整的开发文档。 部署 我们可以很方便地使用Docker和Docker compose部署SearXNG。下面给出Docker部署Se…