【vtkWidgetRepresentation】第九期 vtkAffineRepresentation2D仿射变换

很高兴在雪易的CSDN遇见你

【vtkWidgetRepresentation】第九期 vtk中的仿射变换


前言

本文分享VTK中的仿射变换,实际结果如下图所示,希望对各位小伙伴有所帮助!

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的点赞就是我的动力(^U^)ノ~YO

vtkAffineWidget


1. vtkAffineRepresentation

        主要定义了仿射变换的几何表示。关键参数有:

1.1 GetTransform获取定义的线性变换矩阵。

1.2 SetTolerance,设置激活Handle的容差。

1.3 交互状态,包括:

Outside外部
Rotate旋转
Translate移动
TranslateX沿X轴移动
TranslateY沿Y轴移动
ScaleWEdge沿W边界缩放
ScaleEEdge沿E边界缩放
ScaleNEdge沿N边界缩放
ScaleSEdge沿S边界缩放
ShearWEdge沿W边界剪切
ShearEEdge沿E边界剪切
ShearNEdge沿N边界剪切
ShearSEdge沿S边界剪切
MoveOriginX中心点沿X轴移动
MoveOriginY中心点沿Y轴移动
MoveOrigin移动中心点

2. vtkAffineRepresentation2D

        vtkAffineRepresentation2D包含三部分:一个矩形,一个圆形和一个十字;矩形用于缩放和剪切;圆形用于旋转;十字用于移动。这三部分在视平面上进行显示,并保持一个恒定的高度和宽度。其重要参数如下:

2.1 设置不同部位的宽度

        SetBoxWidth,SetCircleWidth,SetAxesWidth

2.2 设置包围盒的原点

        SetOrigin

2.3 获取选中和未选中的属性

        Set/GetProperty,Set/GetSelectedProperty, Set/GetTextProperty

2.4 获取显示的文字

        SetDisplayText/GetDisplayText

3. vtkAffineWidget及其应用

#include <vtkActor.h>
#include <vtkAffineRepresentation2D.h>
#include <vtkAffineWidget.h>
#include <vtkAppendPolyData.h>
#include <vtkCommand.h>
#include <vtkInteractorStyleSwitch.h>
#include <vtkPlaneSource.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkTransform.h>class vtkAffineCallback : public vtkCommand
{
public:static vtkAffineCallback *New(){ return new vtkAffineCallback; }virtual void Execute(vtkObject *caller, unsigned long, void*);vtkAffineCallback():Actor(0),AffineRep(0){this->Transform = vtkTransform::New();}~vtkAffineCallback(){this->Transform->Delete();}vtkActor *Actor;vtkAffineRepresentation2D *AffineRep;vtkTransform *Transform;
};void vtkAffineCallback::Execute(vtkObject*, unsigned long vtkNotUsed(event), void*)
{this->AffineRep->GetTransform(this->Transform);this->Actor->SetUserTransform(this->Transform);
}int main(int, char *[])
{// Create two spheres: a larger one and a smaller one on top of the larger one// to show a reference point while rotatingvtkSmartPointer<vtkSphereSource> sphereSource =vtkSmartPointer<vtkSphereSource>::New();sphereSource->Update();vtkSmartPointer<vtkSphereSource> sphereSource2 =vtkSmartPointer<vtkSphereSource>::New();sphereSource2->SetRadius(0.075);sphereSource2->SetCenter(0,0.5,0);sphereSource2->Update();// Append the two spheres into one vtkPolyDatavtkSmartPointer<vtkAppendPolyData> append =vtkSmartPointer<vtkAppendPolyData>::New();append->AddInputConnection(sphereSource->GetOutputPort());append->AddInputConnection(sphereSource2->GetOutputPort());// Create a plane centered over the larger sphere with 4x4 sub sectionsvtkSmartPointer<vtkPlaneSource> planeSource =vtkSmartPointer<vtkPlaneSource>::New();planeSource->SetXResolution(4);planeSource->SetYResolution(4);planeSource->SetOrigin(-1,-1,0);planeSource->SetPoint1(1,-1,0);planeSource->SetPoint2(-1,1,0);// Create a mapper and actor for the plane: show it as a wireframevtkSmartPointer<vtkPolyDataMapper> planeMapper =vtkSmartPointer<vtkPolyDataMapper>::New();planeMapper->SetInputConnection(planeSource->GetOutputPort());vtkSmartPointer<vtkActor> planeActor =vtkSmartPointer<vtkActor>::New();planeActor->SetMapper(planeMapper);planeActor->GetProperty()->SetRepresentationToWireframe();planeActor->GetProperty()->SetColor(1,0,0);// Create a mapper and actor for the spheresvtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(append->GetOutputPort());vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);// Create a renderer and render windowvtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);renderer->AddActor(actor);renderer->AddActor(planeActor);renderer->GradientBackgroundOn();renderer->SetBackground(1,1,1);renderer->SetBackground2(0,0,1);// Create an interactorvtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =vtkSmartPointer<vtkRenderWindowInteractor>::New();renderWindowInteractor->SetRenderWindow(renderWindow);dynamic_cast<vtkInteractorStyleSwitch*>(renderWindowInteractor->GetInteractorStyle())->SetCurrentStyleToTrackballCamera();// Create an affine widget to manipulate the actor// the widget currently only has a 2D representation and therefore applies transforms in the X-Y plane onlyvtkSmartPointer<vtkAffineWidget> affineWidget =vtkSmartPointer<vtkAffineWidget>::New();affineWidget->SetInteractor(renderWindowInteractor);affineWidget->CreateDefaultRepresentation();dynamic_cast<vtkAffineRepresentation2D*>(affineWidget->GetRepresentation())->PlaceWidget(actor->GetBounds());vtkSmartPointer<vtkAffineCallback> affineCallback =vtkSmartPointer<vtkAffineCallback>::New();affineCallback->Actor = actor;affineCallback->AffineRep = dynamic_cast<vtkAffineRepresentation2D*>(affineWidget->GetRepresentation());affineWidget->AddObserver(vtkCommand::InteractionEvent,affineCallback);affineWidget->AddObserver(vtkCommand::EndInteractionEvent,affineCallback);renderWindow->Render();renderWindowInteractor->Initialize();renderWindow->Render();affineWidget->On();// begin mouse interactionrenderWindowInteractor->Start();return EXIT_SUCCESS;
}

结论:

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的赞赏是我的最最最最大的动力(^U^)ノ~YO

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

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

相关文章

Java设计模式-单例(Singleton)设计模式的概述及实现

目录 &#x1f436;1 设计模式概述 &#x1f436;2 何为单例模式 &#x1f436;3 实现思路 &#x1f436;4 饿汉式实现代码 &#x1f436;5 懒汉式实现代码 &#x1f436;6 对比两种模式&#xff08;特点、优缺点&#xff09; &#x1f436;7 单例模式的优点及应用场景 &…

HarmonyOS应用开发-手写板

这是一个基于HarmonyOS做的一个手写板应用&#xff0c;只需要简单的几十行代码&#xff0c;就可以实现如下手写功能以及清空画布功能。 一、先上效果图&#xff1a; 二、上代码 Entry Component struct Index {//手写路径State pathCommands: string ;build() {Column() {//…

数据在内存中的存储(整型篇)

1.辨析原码反码补码&#xff1a; 1.原码&#xff1a;有32位&#xff08;int类四个字节&#xff0c;一个字节八个比特位&#xff09;&#xff0c;第一位是符号位&#xff0c;0正1负&#xff0c;其余为二进制位。 2.计算一般是对原码进行计算&#xff0c;但在负数计算使用原码会导…

笔记本电脑安装了Ubuntu系统设置关盖/合盖不挂起/不睡眠

文章目录 简介通过gnome-tweaks设置通过更改登录配置文件logind.conf设置参考资料 简介 学习工作中需要用到笔记本安装Ubuntu Linux系统&#xff0c;并且需要关盖电脑不关机、不挂起且不睡眠。为此&#xff0c;本篇博客整理了两种常规操作方式&#xff0c;并给了详细的步骤&am…

centos7安全防护_CPU占用率超过百分之300_centos7.4中毒CPU百分之百_清理毒源---Linux工作笔记068

执行top命令的时候看到有个进程: sshd占用cpu百分之300多...而且就算是kill -9 杀掉进程以后,进程又会自动启动 ll /proc/7298 我们执行这个命令,可以看到有个/var/tmp/sshd的文件 我们进入cd /var/tmp 然后我们执行 rm -rf sshd删除这个文件,然后我们再去top可以看到 cpu就…

人工智能(pytorch)搭建模型22-基于pytorch搭建SimpleBaseline(人体关键点检测)模型,并详细介绍该网络模型与代码实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型22-基于pytorch搭建SimpleBaseline(人体关键点检测)模型&#xff0c;并详细介绍该网络模型与代码实现。本文将介绍关于SimpleBaseline模型的原理&#xff0c;以及利用pytorch框架搭建模型…

轻阅书城图书交易平台

SpringBoot MySQL JSP等技术实现的博客系统 技术栈 后端&#xff1a; 核心框架&#xff1a;SpringBoot 持久层框架&#xff1a;MyBatis 分页插件&#xff1a;PageHelper 数据库&#xff1a;MySQL 前端&#xff1a; JS、Jquery、CSS、Bootstrap 项目包含源码和数据库文件。…

Leetcode刷题笔记题解(C++):92. 反转链表 II

思路&#xff1a;获取要反转的区间&#xff0c;拆开之后进行反转再拼接 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* …

vue零基础

vue 与其他框架的对比 框架设计模式数据绑定灵活度文件模式复杂性学习曲线生态VueMVVM双向灵活单文件小缓完善ReactMVC单向较灵活all in js大陡丰富AngularMVC双向固定多文件较大较陡&#xff08;Typescript&#xff09;独立 更多对比细节&#xff1a;vue 官网&#xff1a;ht…

WhatsApp获客怎么做?记住这几个技巧!

一、背景介绍 随着全球数字化趋势的不断发展&#xff0c;越来越多的企业开始将目光转向数字化营销&#xff0c;WhatsApp作为一种国际通用的社交媒体平台&#xff0c;具有广泛的使用群体和强大的社交功能&#xff0c;成为了很多企业进行营销推广的重要渠道。 那么&#xff0c;…

Redis对象——内存回收,对象共享和空转时长

一. 内存回收 因为C语言不具备内存回收功能&#xff0c;所以Redis在自己的对象系统中构建了一个引用计数技术实现内存回收机制。通过这一机制&#xff0c;程序可以通过跟踪对象的引用计数信息&#xff0c;在适当的时候自动释放对象并进行内存回收。 内每一个对象的引用计数信息…

LangChain(0.0.340)官方文档七:Retrieval——document_loaders

LangChain官网、LangChain官方文档 、langchain Github、langchain API文档、llm-universe 文章目录 一、简介1.1 BaseLoader1.2 文本加载&#xff08;TextLoader&#xff09; 二、 CSV&#xff08;CSVLoader&#xff09;2.1 默认加载2.2 指定一列来标识文档来源​ 三、 HTML l…