当前位置: 首页 > news >正文

VTK——angleWidget的3D转换

文章目录

  • 3D空间坐标转换
  • 例程
  • 心得

3D空间坐标转换

在冠状图、矢状面、横截面等创建的角度组件的三个端点坐标,不能直接用在3D视图中。这是因为2D切片的坐标是基于像素的,而3D空间的坐标可能是基于实际物理尺寸的。
解决方案是使用2D点的坐标、切片的物理位置和方向以及可能的其他参数(例如切片厚度或间距),来计算空间坐标。将计算好的空间坐标p1、p2、p3传入下面的函数中,就可以在3D视图中画出角度组件。

例程

get3DViewAngle(double* p1, double* p2, double* mid, int* indexVal) {double modifiedPoints[3][3]; int currentAngleIndex = *indexVal;auto iter = threeDActors.find(currentAngleIndex);if (iter != threeDActors.end()) {for (auto act : iter->second) {threeDRenderer->RemoveActor(act);}threeDActors.erase(iter);}double* pts[] = {p1, p2, mid};for(int i = 0; i < 3; i++) {modifiedPoints[i][0] = pts[i][0] * xRange[1] / imageDims[0];modifiedPoints[i][1] = pts[i][1] * yRange[1] / imageDims[1];modifiedPoints[i][2] = pts[i][2] * zRange[1] / imageDims[2];}vtkSmartPointer<vtkSphereSource> src1 = vtkSmartPointer<vtkSphereSource>::New();src1->SetCenter(modifiedPoints[0]);src1->SetRadius(2);vtkSmartPointer<vtkPolyDataMapper> map1 = vtkSmartPointer<vtkPolyDataMapper>::New();map1->SetInputConnection(src1->GetOutputPort());vtkSmartPointer<vtkActor> act1 = vtkSmartPointer<vtkActor>::New();act1->SetMapper(map1);vtkSmartPointer<vtkSphereSource> src2 = vtkSmartPointer<vtkSphereSource>::New();src2->SetCenter(modifiedPoints[1]);src2->SetRadius(2);vtkSmartPointer<vtkPolyDataMapper> map2 = vtkSmartPointer<vtkPolyDataMapper>::New();map2->SetInputConnection(src2->GetOutputPort());vtkSmartPointer<vtkActor> act2 = vtkSmartPointer<vtkActor>::New();act2->SetMapper(map2);vtkSmartPointer<vtkSphereSource> src3 = vtkSmartPointer<vtkSphereSource>::New();src3->SetCenter(modifiedPoints[2]);src3->SetRadius(2);vtkSmartPointer<vtkPolyDataMapper> map3 = vtkSmartPointer<vtkPolyDataMapper>::New();map3->SetInputConnection(src3->GetOutputPort());vtkSmartPointer<vtkActor> act3 = vtkSmartPointer<vtkActor>::New();act3->SetMapper(map3);vtkSmartPointer<vtkLineSource> lnSrc1 = vtkSmartPointer<vtkLineSource>::New();lnSrc1->SetPoint1(modifiedPoints[0]);lnSrc1->SetPoint2(modifiedPoints[2]);vtkSmartPointer<vtkPolyDataMapper> lnMap1 = vtkSmartPointer<vtkPolyDataMapper>::New();lnMap1->SetInputConnection(lnSrc1->GetOutputPort());vtkSmartPointer<vtkActor> lnAct1 = vtkSmartPointer<vtkActor>::New();lnAct1->SetMapper(lnMap1);vtkSmartPointer<vtkLineSource> lnSrc2 = vtkSmartPointer<vtkLineSource>::New();lnSrc2->SetPoint1(modifiedPoints[1]);lnSrc2->SetPoint2(modifiedPoints[2]);vtkSmartPointer<vtkPolyDataMapper> lnMap2 = vtkSmartPointer<vtkPolyDataMapper>::New();lnMap2->SetInputConnection(lnSrc2->GetOutputPort());vtkSmartPointer<vtkActor> lnAct2 = vtkSmartPointer<vtkActor>::New();lnAct2->SetMapper(lnMap2);threeDRenderer->AddActor(act1);threeDRenderer->AddActor(act2);threeDRenderer->AddActor(act3);threeDRenderer->AddActor(lnAct1);threeDRenderer->AddActor(lnAct2);std::vector<vtkSmartPointer<vtkActor>> acts = {act1, act2, act3, lnAct1, lnAct2};threeDActors[currentAngleIndex] = acts;for (auto act : acts) {threeDRenderer->AddActor(act);}renderWidget[3]->interactor()->Render();
}}

心得

  1. 在创建角度组件后,不能直接读取组件的端点坐标来用于计算空间坐标,因为此时的端点坐标还是空。需要等到鼠标左键点击三次后,才会得到完整的端点坐标。这个时候可以写在角度组件的回调函数中,然后使用成员变量来获取创建好的端点坐标。
  2. 在角度组件的回调函数中,可以使用信号槽机制来保证拖动组件后能够实时更新角度组件位置。
  3. 如果是创建线条组件,需要手动触发一次回调函数,因为线条组件的端点位置是可以直接读取的。
                lineCallback->Execute(lineWidget, vtkCommand::EndInteractionEvent, nullptr);         //手动触发回调

4.如果想要保证实时删除2D和3D视图中的角度组件,可以使用map,只需要记住创建的索引就能直接删除组件。这样可以与页面上的组件数量和组件索引独立开来.

std::map<int,vtkSmartPointer<vtkAngleWidget>> ngleWidgets;

相关文章:

VTK——angleWidget的3D转换

文章目录 3D空间坐标转换例程心得 3D空间坐标转换 在冠状图、矢状面、横截面等创建的角度组件的三个端点坐标&#xff0c;不能直接用在3D视图中。这是因为2D切片的坐标是基于像素的&#xff0c;而3D空间的坐标可能是基于实际物理尺寸的。 解决方案是使用2D点的坐标、切片的物理…...

HDFS 集群动态节点管理

目录 一、动态扩容、节点上线 1.1 背景 1.2 扩容步骤 1.2.1 新机器基础环境准备 1.2.2 Hadoop 配置 1.2.3 手动启动 DataNode 进程 1.2.4 Web 页面查看情况 1.2.5 DataNode 负载均衡服务 二、动态缩容、节点下线 2.1 背景 2.2 缩容步骤 2.2.1 添加退役节点 …...

postman9.12.汉化版(附有下载链接)

想用英文版本的可以直接点击下载最新版本 这里直接付上9.12.2版本的下载链接&#xff0c;如果大家要下载别的版本&#xff0c;可以直接修改链接里面的版本号即可 &#xff0c;下面是汉化包下载 链接&#xff1a;https://pan.baidu.com/s/1izK3HfqlfXJdq6KIYeJ2zw?pwdpetk 提…...

mysql与msql2数据驱动

mysql基本使用 数据库操作&#xff08;DDL&#xff09; -- 数据考操作 -- 1.查询所有数据库 SHOW DATABASES;-- 2.选择数据库 USE learn_mysql;-- 3.当前正在使用的数据库 SELECT DATABASE();-- 4.创建数据库 CREATE DATABASE IF NOT EXISTS learn_mysql;-- 5.删除数据库 DRO…...

解决微信小程序回调地狱问题

一、背景 小程序开发经常遇到根据网络请求结果&#xff0c;然后继续 处理下一步业务操作&#xff0c;代码如下&#xff1a; //1第一个请求 wx.request({url:"https://example.com/api/",data:data,success:function(res){//2第二个请求 wx.request({url:"http…...

cron介绍

cron表达式在线生成 在使用定时调度任务的时候&#xff0c;我们最常用的&#xff0c;就是cron表达式了。通过cron表达式来指定任务在某个时间点或者周期性的执行。 cron表达式的组成 cron表达式是一个字符串&#xff0c;由6到7个字段组成&#xff0c;用空格分隔。其中前6个字…...

mkp勒索病毒的介绍和防范,勒索病毒解密,数据恢复

mkp勒索病毒是一种新兴的电脑病毒&#xff0c;它会对感染的电脑进行加密&#xff0c;并要求用户支付一定的赎金才能解锁。这种病毒已经引起了全球范围内的关注&#xff0c;因为它不仅具有高危害性&#xff0c;而且还有很强的传播能力。本文将对mkp勒索病毒进行详细介绍&#xf…...

【面试精品】关于面试会遇到的Apache相关的面试题

1. Apache HTTP Server 基于什么协议提供网页浏览服务&#xff1f; 答&#xff1a;基于标准的http网络协议提供网页浏览服务。 2. 简述编译安装httpd软件包的基本过程&#xff1f; 答&#xff1a;解包&#xff0c;配置&#xff0c;编译&#xff0c;安装。 3. 编译安装httpd软…...

python对文件转md5,用于文件重复过滤

直接上代码 import hashlibdef calculate_md5(file_path):# 创建 MD5 哈希对象md5_hash hashlib.md5()# 打开文件并逐块读取&#xff0c;更新哈希值with open(file_path, rb) as file:while True:data file.read(8192) # 逐块读取文件&#xff0c;每块大小为 8192 字节if n…...

mac苹果电脑删除顽固残留软件图标

核心&#xff1a;删除“启动台”数据库里对应app的信息 1、打开访达&#xff08;Finder&#xff09;&#xff0c;点击最顶部菜单栏的【前往》前往文件夹】&#xff0c;接着输入【/private/var/folders】 2、在弹出的访达&#xff08;Finder&#xff09;窗口搜索栏输入【com.ap…...

【jsvue】联合gtp仿写一个简单的vue框架,以此深度学习JavaScript

用 gtp 学习 Vue 生命周期的原理 lifecycle.js function Vue(options) {// 将选项保存到实例的 $options 属性中this.$options options;// 若存在 beforeCreate 钩子函数&#xff0c;则调用之if (typeof options.beforeCreate function) {options.beforeCreate.call(this);…...

linux centos7 系统之编程:求水仙花数

在Python编程中&#xff0c;有列表、元组和字典三类变量可以使用&#xff0c;方便数据的存储与处理&#xff0c;而bash中仅有字符串变量、数组、函数可用&#xff0c;方法运用上受到限制&#xff0c;这与bash基于C语言&#xff0c;注重语法结构的严谨有关。而Python等高级语言更…...

git中的cherry-pick和merge有些区别以及cherry-pick怎么用

git中的cherry-pick和merge在使用场景上有些区别: cherry-pick用于将另一个分支的某一次或几次commit应用到当前分支。它可以选择性地拉取代码修改。merge用于将两个分支合并成一个新分支。它会把整个分支上的所有修改都合并过来。 具体区别:cherry-pick通常用于将bug修复从发…...

【前端】CSS-Flex弹性盒模型布局

目录 一、前言二、Flex布局是什么1、任何一个容器都可以指定为Flex布局2、行内元素也可以使用Flex布局3、Webkit内核的浏览器&#xff0c;必须加上-webkit前缀 三、基本概念四、flex常用的两种属性1、容器属性2、项目属性 五、容器属性1、flex-direction①、定义②、语句1&…...

Android AAPT: error: resource color 异常原因处理

异常体现&#xff1a; Android resource linking failed ERROR:E:\software\Developer\APP\GaoDeTest2\app\src\main\res\values\themes.xml:3:5-9:13: AAPT: error: resource color/purple_500 (aka com.example.gaodetest2:color/purple_500) not found.ERROR:E:\software\De…...

C++std::function和std::bind()的概念

std::function&#xff1a; 一个通用的函数封装器&#xff0c;它允许你存储和调用任何可以被调用的东西&#xff0c;例如函数、函数指针、函数对象、Lambda 表达式等。 std::bind&#xff1a; 用于创建函数对象。一个可调用对象的绑定版本&#xff0c;可以提前绑定某些参数&am…...

QT Creator工具介绍及使用

一、QT的基本概念 QT主要用于图形化界面的开发&#xff0c; QT是基于C编写的一套界面相关的类库&#xff0c;如进程线程库&#xff0c;网络编程的库&#xff0c;数据库操作的库&#xff0c;文件操作的库等。 如何使用这个类库&#xff1a;类库实例化对象(构造函数) --> 学习…...

python爬虫13:pymysql库

python爬虫13&#xff1a;pymysql库 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论&#xff0c;并不会对网站产生…...

权限管理 ACL、RBAC、ABAC的学习

ACL(Access Control List&#xff1a;访问控制列表) 最简单的一种方式&#xff0c;将权限直接与用户或用户组相关联&#xff0c;管理员直接给用户授予某些权限即可。 这种模型适用于小型和简单系统&#xff0c;权限一块较为简单&#xff0c;并且角色和权限的变化较少。 RBAC(R…...

python的re正则表达式

一、正在表达式的方法&#xff08;&#xff09;&#xff1a; re是Python中用于处理正则表达式的内置库&#xff0c;提供了许多有用的方法。以下是其中几个常用的方法&#xff1a; re.match(pattern, string): 尝试从字符串的开头匹配一个模式&#xff0c;如果匹配成功则返回匹…...

接口测试--Day5

Pytest是一个流行的测试框架&#xff0c;广泛应用于单元测试、集成测试和功能测试。它具有简单、灵活、可扩展的特点&#xff0c;提供了丰富的功能和插件儿生态系统&#xff0c;它简化了测试的编写和组织拍&#xff0c;通过丰富的功能和简洁的语法&#xff0c;让测试变得容易灵…...

MogFace人脸检测工具实操案例:从监控截图提取人脸ROI用于后续关键点分析

MogFace人脸检测工具实操案例&#xff1a;从监控截图提取人脸ROI用于后续关键点分析 1. 引言&#xff1a;从监控画面到精准分析 想象一下&#xff0c;你手头有一堆从监控摄像头截取的图片&#xff0c;里面可能有多个人脸&#xff0c;有的正对着镜头&#xff0c;有的侧着脸&am…...

解码器精准调优:LoRA赋能Depth-Anything-V2实现绝对深度估计

1. LoRA技术如何革新Depth-Anything-V2的深度估计 当我在实验室第一次尝试用LoRA微调Depth-Anything-V2时&#xff0c;意外发现只需要调整解码器中1x1卷积层的极少量参数&#xff0c;就能让相对深度模型输出精确的绝对深度值。这就像给一个只会判断"远近"的模型突然装…...

智能处理与开源工具:突破传统背景抠图限制的实时解决方案

智能处理与开源工具&#xff1a;突破传统背景抠图限制的实时解决方案 【免费下载链接】obs-backgroundremoval An OBS plugin for removing background in portrait images (video), making it easy to replace the background when recording or streaming. 项目地址: https…...

告别重复造轮子:用快马AI一键生成高复用性imToken集成代码模块

告别重复造轮子&#xff1a;用快马AI一键生成高复用性imToken集成代码模块 开发涉及钱包集成的DApp时&#xff0c;最让人头疼的就是那些重复性的基础代码。每次新项目都要重新写一遍连接钱包、处理授权、监听网络切换的逻辑&#xff0c;不仅浪费时间&#xff0c;还容易引入安全…...

Leather Dress Collection 角色扮演效果:模拟不同风格的IT技术面试官

Leather Dress Collection 角色扮演效果&#xff1a;模拟不同风格的IT技术面试官 最近在玩一个挺有意思的AI工具&#xff0c;叫Leather Dress Collection。名字听起来有点怪&#xff0c;但它有个功能让我眼前一亮&#xff1a;角色扮演。你可以让它扮演各种角色&#xff0c;并且…...

手把手教你用DuckDB 1.3.0的DuckLake功能搭建数据湖(PostgreSQL+MinIO实战)

实战指南&#xff1a;基于DuckDB 1.3.0与MinIO构建企业级数据湖架构 在数据驱动的时代&#xff0c;企业需要更灵活、高效的解决方案来管理海量数据。DuckDB 1.3.0推出的DuckLake功能&#xff0c;结合PostgreSQL的元数据管理能力和MinIO的对象存储优势&#xff0c;为中小型企业…...

Qwen3.5-2B部署实战:端侧轻量化多模态模型一键镜像教程

Qwen3.5-2B部署实战&#xff1a;端侧轻量化多模态模型一键镜像教程 1. 模型简介 Qwen3.5-2B是阿里云推出的轻量化多模态基础模型&#xff0c;属于Qwen3.5系列的小参数版本&#xff08;20亿参数&#xff09;。这个模型专为低功耗、低门槛部署场景设计&#xff0c;特别适合端侧…...

Typora与AI结合:使用万象熔炉·丹青幻境为Markdown文档自动配图

Typora与AI结合&#xff1a;使用万象熔炉丹青幻境为Markdown文档自动配图 不知道你有没有过这样的体验&#xff1a;在Typora里写完一篇技术博客或项目文档&#xff0c;内容详实&#xff0c;逻辑清晰&#xff0c;但通篇下来全是文字&#xff0c;总觉得少了点什么。想配几张图吧…...

实战指南:基于快马平台,快速构建可部署的unet卫星图像分割系统

今天想和大家分享一个实战项目&#xff1a;基于UNet的卫星图像建筑物分割系统。这个项目特别适合在InsCode(快马)平台上快速搭建&#xff0c;因为它涉及从数据处理到模型部署的完整流程&#xff0c;而平台的一键部署功能正好能省去繁琐的环境配置工作。 项目背景与需求分析 卫星…...