VTK—vtkCutter截取平面数据

news2025/1/9 15:17:20

       ,

 

        本例 vtkCutter可以配合隐式函数截取数据使用vtkPlane隐式函数配合vtkWidget截取任意平面。

1.读入数据

Create(vtkMultiBlockPLOT3DReader, reader);
    reader->SetXYZFileName("G:/Temp/vtkTest/combxyz.bin");
    reader->SetQFileName("G:/Temp/vtkTest/combq.bin");
    reader->SetScalarFunctionNumber(100);
    reader->Update();

        可以使用其他类型的数据测试。读取的数据文件在《VTK—vtkStructuredGrid提取维度面数据》文章中上传过。

2.定位截取平面

    vtkStructuredGrid *grid = (vtkStructuredGrid *) (reader->GetOutput()->GetBlock(0));
    double bounds[6] = {0};
    grid->GetBounds(bounds);

    Create(vtkPlane, plane);
    plane->SetOrigin((bounds[0] + bounds[1]) * 0.5,
                     (bounds[2] + bounds[3]) * 0.5,
                     (bounds[4] + bounds[5]) * 0.5);
    plane->SetNormal(0, 0, 1);

        初始时隐式函数平面定位在包络框中心,法线指向Z轴正方向。

3.配置vtkCutter

    Create(vtkCutter, cutter);
    cutter->SetCutFunction(plane);
    cutter->SetInputData(grid);

 4.使用vtkPlaneWidget交互定位切割平面

Create(vtkPlaneWidget, widget);
    widget->SetInteractor(inter);
    widget->SetDefaultRenderer(render1);
    widget->SetOrigin(plane->GetOrigin());
    widget->SetPoint1(bounds[1],
                      (bounds[2] + bounds[3]) * 0.5,
                      (bounds[4] + bounds[5]) * 0.5);
    widget->SetPoint2((bounds[0] + bounds[1]) * 0.5,
                      bounds[3],
                      (bounds[4] + bounds[5]) * 0.5);


    widget->EnabledOn();

    Create(mycallback, callback);
    callback->m_plane = plane;
    widget->AddObserver(vtkCommand::InteractionEvent, callback);

4.1小部件四角拖动可调整平面显示大小

 4.2鼠标左键点击平面可以任意拖动

4.3鼠标左键点击平面+CTRL键可使平面绕法线旋转

4.4拖动箭头可改变平面角度

4.5鼠标中键可以沿着法线拖动平面

5.完整代码

#include<vtkNew.h>
#include<vtkPlane.h>
#include<vtkCutter.h>
#include<vtkCamera.h>
#include<vtkAutoInit.h>
#include<vtkRenderer.h>
#include<vtkPlaneWidget.h>
#include<vtkRenderWindow.h>
#include<vtkDataSetMapper.h>
#include<vtkStructuredGrid.h>
#include<vtkMultiBlockDataSet.h>
#include<vtkRendererCollection.h>
#include<vtkRenderWindowInteractor.h>
#include<vtkMultiBlockPLOT3DReader.h>

VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)


#define Create(type,name)\
    vtkNew<type> name;


class mycallback: public vtkCommand
{
public:
    static mycallback *New() {
        return new mycallback;
    }

    void Execute(vtkObject *caller, unsigned long eventId, void *callData) override
    {
        vtkPlaneWidget *widget = (vtkPlaneWidget *)caller;
        widget->GetPlane(m_plane);
    }
    vtkPlane *m_plane;
private:
    mycallback() {
        m_plane = nullptr;
    }
    ~mycallback() {}
};

int main()
{

    Create(vtkMultiBlockPLOT3DReader, reader);
    reader->SetXYZFileName("G:/Temp/vtkTest/combxyz.bin");
    reader->SetQFileName("G:/Temp/vtkTest/combq.bin");
    reader->SetScalarFunctionNumber(100);
    reader->Update();

    vtkStructuredGrid *grid = (vtkStructuredGrid *) (reader->GetOutput()->GetBlock(0));
    double bounds[6] = {0};
    grid->GetBounds(bounds);

    Create(vtkPlane, plane);
    plane->SetOrigin((bounds[0] + bounds[1]) * 0.5,
                     (bounds[2] + bounds[3]) * 0.5,
                     (bounds[4] + bounds[5]) * 0.5);
    plane->SetNormal(0, 0, 1);

    Create(vtkCutter, cutter);
    cutter->SetCutFunction(plane);
    cutter->SetInputData(grid);

    Create(vtkDataSetMapper, mapper1);
    mapper1->SetInputData(grid);
    Create(vtkActor, actor1);
    actor1->SetMapper(mapper1);
    Create(vtkRenderer, render1);
    render1->AddActor(actor1);
    render1->SetViewport(0, 0, 0.5, 1);

    Create(vtkDataSetMapper, mapper2);
    mapper2->SetInputConnection(cutter->GetOutputPort());
    Create(vtkActor, actor2);
    actor2->SetMapper(mapper2);
    Create(vtkRenderer, render2);
    render2->AddActor(actor2);
    render2->SetViewport(0.5, 0, 1, 1);

    Create(vtkRenderWindow, window);
    window->AddRenderer(render1);
    window->AddRenderer(render2);
    window->GetRenderers()->InitTraversal();

    Create(vtkRenderWindowInteractor, inter);
    inter->SetRenderWindow(window);


    Create(vtkCamera, camera);
    render1->SetActiveCamera(camera);
    render2->SetActiveCamera(camera);


    render1->ResetCamera();


    Create(vtkPlaneWidget, widget);
    widget->SetInteractor(inter);
    widget->SetDefaultRenderer(render1);
    widget->SetOrigin(plane->GetOrigin());
    widget->SetPoint1(bounds[1],
                      (bounds[2] + bounds[3]) * 0.5,
                      (bounds[4] + bounds[5]) * 0.5);
    widget->SetPoint2((bounds[0] + bounds[1]) * 0.5,
                      bounds[3],
                      (bounds[4] + bounds[5]) * 0.5);


    widget->EnabledOn();

    Create(mycallback, callback);
    callback->m_plane = plane;
    widget->AddObserver(vtkCommand::InteractionEvent, callback);


    inter->Start();
    return 0;
}

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

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

相关文章

Linux系统之部署轻量级Markdown文本编辑器

Linux系统之部署轻量级Markdown文本编辑器 一、项目介绍1.1 项目简介1.2 使用方法 二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查系统版本3.2 检查系统内核版本3.3 检查软件源 四、安装Apache24.1 安装Apache2软件4.2 启动apache2服务4.3 查看ap…

【题目/训练】:双指针

引言 我们已经在这篇博客【算法/学习】双指针-CSDN博客里面讲了双指针、二分等的相关知识。 现在我们来做一些训练吧 经典例题 1. 移动零 思路&#xff1a; 使用 0 当做这个中间点&#xff0c;把不等于 0(注意题目没说不能有负数)的放到中间点的左边&#xff0c;等于 0 的…

微服务设计原则——高性能:存储设计

文章目录 1.读写分离2.分库分表3.动静分离4.冷热分离5.重写轻读6.数据异构参考文献 任何一个系统&#xff0c;从单机到分布式&#xff0c;从前端到后台&#xff0c;功能和逻辑各不相同&#xff0c;但干的只有两件事&#xff1a;读和写。而每个系统的业务特性可能都不一样&#…

STM32CubeMX生成stm32MP135中断优先级配置错误修正方法

0 修改方法 使用STM32CubeMX生成stm32MP135代码的中断优先级配置错误&#xff0c;将导致所有中断优先级设置不对。 如果设置EXTI0中断优先级为10&#xff0c;在STM32CubeMX中配置如下&#xff1a; 生成的中断优先级配置代码为&#xff1a; 正确写法应该将中断优先级左移3位&…

python人工智能001:NumPy科学计算库说明与安装

1. NumPy说明 NumPy&#xff08;Numerical Python&#xff09;是Python的一个开源数值计算扩展库。它提供了一个强大的N维数组对象ndarray&#xff0c;以及用于对这些数组进行操作的函数。NumPy的数组和数组操作是Python数据分析、机器学习、科学计算等领域的基础。 NumPy的主…

web开发环境搭配与创建javaee项目

一.web开发 (1)web开发指的是前端,后端,以及数据库进行交互&#xff0c;前端发送请求到后端&#xff0c;后端经过程序处理后到达数据库&#xff0c;最后在进行后端处理响应回前端。 (2)一次三端交互的doget或者dopost简单请求流程 (3)web开发除了需要前端,后端,数据库开发工具…

Java之线程篇一

目录 如何理解进程&#xff1f; 进程和线程的区别 线程的优点 线程的缺点 线程异常 线程用途 创建线程 方法一&#xff1a;继承Thread类&#xff0c;重写run() 观察线程 小结 方法二&#xff1a; 实现Runnable接口&#xff0c;重写run() 方法三&#xff1a;继承Threa…

超越AnimateAnyone!Meta提出全身 3D虚拟人技术ExAvatar,可通过简短视频克隆人像并转化为3D数字形象

ExAvatar是由DGIST和Meta公司的Codec Avatars Lab联合研发的一项技术,能够通过捕捉视频中的动作和表情,转化为栩栩如生的3D数字形象。这项技术解决了以往技术中的难题,提高了动画的自然度和渲染效果。 什么是 ExAvatar? ExAvatar 是全新富有表现力的全身 3D 高斯化身。 结…

2.1 文件内容差异对比方法

2.1 文件内容差异对比方法 文件内容差异对比方法2.1.1 两个字符串的差异对比2.1.2 生成美观的HTML格式文档2.1.3 对比nginx 配置文件差异代码封装 文件内容差异对比方法 介绍如何通过difflib模块实现文件内容差异对比。difflib作为Python的标准库模块无需安装&#xff0c;作用…

算法学习——树形DP——多叉树的最长路径

文章目录 引言正文0、题目的具体内容1、树的直径定理推导3、使用数组链表表示树使用数组表示链表数组表示单链表头插法演示数组表示单链表在索引k出插入一个数字数组表示链表实现代码链表表示树 4、树形DP的具体分析 总结 引言 这个问题&#xff0c;每一次都会痛击我&#xff…

养猫劝退?猫咪掉毛严重怎么办?用宠物空气净化器高效清理浮毛

不瞒大家说&#xff0c;养猫以来&#xff0c;我中途有无数次想要把它送人的想法&#xff0c;最终还是敌不过它的可爱留下来了。为什么会产生这样的念头呢&#xff1f;罪魁祸首就是猫毛问题。夏天是猫咪的换毛季&#xff0c;它们为了散热会脱去厚重的毛发&#xff0c;进入疯狂掉…

06结构型设计模式——代理模式

一、代理模式简介 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff08;GoF书中解释结构型设计模式&#xff1a;一种用来处理类或对象、模块的组合关系的模式&#xff09;&#xff0c;代理模式是其中的一种&#xff0c;它可以为其他对象提供一种代…

依赖倒置原则详解

依赖倒置原则详解 一、引言 在大型系统架构设计中&#xff0c;依赖倒置原则&#xff08;Dependency Inversion Principle&#xff0c;DIP&#xff09;被广泛视为增强系统灵活性和可维护性的核心原则之一。最近在架构设计审查中&#xff0c;我们经常遇到由于依赖关系设计不当导…

叠Buff!经典麻雀优化算法+多重双向深度学习!SSA-BiTCN-BiGRU-Attention多输入单输出回归预测

叠Buff!经典麻雀优化算法多重双向深度学习&#xff01;SSA-BiTCN-BiGRU-Attention多输入单输出回归预测 目录 叠Buff!经典麻雀优化算法多重双向深度学习&#xff01;SSA-BiTCN-BiGRU-Attention多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matl…

P2858 [USACO06FEB] Treats for the Cows

题目描述 约翰经常给产奶量高的奶牛发特殊津贴&#xff0c;于是很快奶牛们拥有了大笔不知该怎么花的钱。为此&#xff0c;约翰购置了 N 份美味的零食来卖给奶牛们。每天约翰售出一份零食。当然约翰希望这些零食全部售出后能得到最大的收益。这些零食有以下这些有趣的特性&…

(python)动态类型语言的灵活性和动态性

前言 一种具有动态类型,动态绑定&#xff0c;动态执行和灵活的对象模型的编程语言。它能够适应不断变化的编程需求的&#xff0c;是否会受欢迎? 动态语言的优点 灵活性高&#xff1a;开发过程更加灵活和快捷&#xff0c;不需要在编写代码前严格定义变量和对象的类型&#xff0…

linux之prometheus+grafana

Prometheus介绍 Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合, 由go语言开发。 适合监控容器平台, 因为kubernetes(俗称k8s)的流行带动了prometheus的发展。 PS&#xff1a;由于目前还未学习容器&#xff0c;所以在今天的课程里使用prometheus监…

嵌入式Linux:proc文件系统

目录 1、使用 cat 命令读取 /proc 文件系统 2、在应用程序中使用 open() 和 read() 函数读取 /proc 文件系统 proc 文件系统是一个虚拟文件系统&#xff0c;它以文件系统的形式为应用层提供访问系统内核数据的接口。用户和应用程序可以通过 proc 文件系统获取系统信息和进程相…

腾讯一面算法题:最长重复子串 1044,讲个比较好理解的思路

文章目录 1044. 最长重复子串前言思路Version 1&#xff1a;暴力Version 2&#xff1a;引入二分&#xff0c;优化 O ( n 2 ) O(n^2) O(n2)Version 3&#xff1a;引入自定义哈希&#xff0c;优化字符串比较Version 4&#xff1a;计算所有字符串的哈希值Version 5&#xff1a;引…

前后端项目交互异步请求JSON数据类型后端标准响应数据格式

java同步请求 当网页与后端交互时,前端不能再进行其他操作 服务器响应回来的内容,会把整个浏览器中的内容覆盖 这种请求方式在前后端交互时不太友好 现在的前后端交互请求都使用异步请求 异步请求(不同步) 通过在前端中使用js中提供的XMLHttpRequest对象实现发送异步请求…