返回顶部
首页 > 资讯 > 操作系统 >VTK——angleWidget的3D转换
  • 837
分享到

VTK——angleWidget的3D转换

c++qt 2023-08-30 16:08:22 837人浏览 八月长安
摘要

文章目录 3D空间坐标转换例程心得 3D空间坐标转换 在冠状图、矢状面、横截面等创建的角度组件的三个端点坐标,不能直接用在3D视图中。这是因为2D切片的坐标是基于像素的,而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);         //手动触发回调

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

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

来源地址:https://blog.csdn.net/Algabeno/article/details/132565284

--结束END--

本文标题: VTK——angleWidget的3D转换

本文链接: https://lsjlt.com/news/383189.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • VTK——angleWidget的3D转换
    文章目录 3D空间坐标转换例程心得 3D空间坐标转换 在冠状图、矢状面、横截面等创建的角度组件的三个端点坐标,不能直接用在3D视图中。这是因为2D切片的坐标是基于像素的,而3D空间的坐标可能是基于实际物理尺寸的。 解决方案是使用...
    99+
    2023-08-30
    c++ qt
  • CSS3-3D转换
    CSS3-3D转换实例<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title></title> <...
    99+
    2023-01-31
  • CSS 3 3D 转换
    3D转换时,要赋予改变元素的父元素 perspective 属性perspective: m px; // 视点和画面的距离,视点的位置默认在父元素的中心perspective-origin:right top;//改变视点的位置trans...
    99+
    2023-01-31
    CSS
  • CSS2D转换、3D转换的transform知识点有哪些
    本文小编为大家详细介绍“CSS2D转换、3D转换的transform知识点有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“CSS2D转换、3D转换的transform知识点有哪些”文章能帮助大家解决疑...
    99+
    2024-04-02
  • CSS3的3D转换方法是什么
    这篇文章主要介绍了CSS3的3D转换方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇CSS3的3D转换方法是什么文章都会有所收获,下面我们一起来看看吧。  ...
    99+
    2024-04-02
  • CSS 3D转换属性有哪些
    CSS 3D转换属性包括以下属性:1. transform-style:指定子元素是否应用3D转换效果,可选值为 `preserve...
    99+
    2023-10-12
    CSS
  • css中2D/3D转换属性有哪些
    这篇文章主要为大家展示了“css中2D/3D转换属性有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css中2D/3D转换属性有哪些”这篇文章吧。 ...
    99+
    2024-04-02
  • 怎么利用HTML5+CSS3实现3D转换效果
    这篇文章主要为大家展示了“怎么利用HTML5+CSS3实现3D转换效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么利用HTML5+CSS3实现3D转换效果...
    99+
    2024-04-02
  • windows7系统实现3D切换页面的方法及无法实现3D切换原因
    看到网上不少人反映不能实现3D切换页面效果,在这里本站小编为大家解释一下其中的原因: 没有aero特效,或禁用aer 桌面主题若选择“基本和高对比主题”,也将自动禁用aero。 Windows7实...
    99+
    2023-05-30
    win7 3D切换 页面 切换 D 方法 系统
  • Android实现dialog的3D翻转示例
    本文实现了Android中dialog的3D翻转效果。这里通过一个简单的应用场景记录下。效果图起初自己的思路是Activity进行界面跳转实现旋转效果,网上看了很多,写下来发现效果不对。之后又看到Google上面的Card Flid Ani...
    99+
    2023-05-30
    android 3d翻转 roi
  • Python&Matlab实现炫酷的3D旋转图
    目录前言1.Python爬取美女照片 1.1 留恋忘返的网址1.2 Python代码1.3 结果 2.Python实现2.1 条件准备2.2 运行展示 ...
    99+
    2024-04-02
  • Python进制转换和ASCLL转换的方法
    这篇文章主要介绍“Python进制转换和ASCLL转换的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python进制转换和ASCLL转换的方法”文章能帮助大家解决问题。进制转换进制之间的转换主...
    99+
    2023-06-29
  • 使用CSS3怎么实现2D与3D的变换
    这篇文章给大家介绍使用CSS3怎么实现2D与3D的变换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。css甚至一下设备相关的开发中,基本都遵循这样一套坐标系:以手机屏幕为例,坐标系 圆点 位于屏幕最左上角; x轴 水平...
    99+
    2023-06-08
  • golang的dto转换
    在Go语言中,数据传输对象(Data Transfer Object,DTO)是一种非常常见的模式。它被广泛应用于Web开发,以便在请求和响应之间进行类别转换。虽然Go语言是一种类型安全的语言,但当处理JSON和其他外部数据格式时,我们需要...
    99+
    2023-05-14
  • go 类型转换方式(interface 类型的转换)
    go 在做类型转换时,报错: cannot convert m (type interface {}) to type Msg: need type assertion 原...
    99+
    2022-06-07
    GO interface 类型转换
  • 无痛转换:揭开 ASP Web.config 转换的秘密
    ...
    99+
    2024-04-02
  • CSS3如何制作酷炫的3D旋转透视
    CSS3如何制作酷炫的3D旋转透视,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。立方体 3D 旋转3D 透视照片墙跳跃的音符可能上面的效果对精...
    99+
    2024-04-02
  • html5怎么实现图片的3D旋转效果
    本篇内容主要讲解“html5怎么实现图片的3D旋转效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html5怎么实现图片的3D旋转效果”吧!   完整代码如...
    99+
    2024-04-02
  • Oracle 12CR2查询转换之星型转换的方法
    这篇文章主要为大家展示了“Oracle 12CR2查询转换之星型转换的方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Oracle 12CR2查询转换之星型转...
    99+
    2024-04-02
  • Python的进制转换和ASCLL转换你了解吗
    目录进制转换1. 十进制与二进制1.1 十进制转二进制1.2 二进制转十进制2. 十进制与八进制2.1 十进制转八进制3. 十进制与十六进制3.1 十进制转十六进制3.2 十六进制转...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作