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

第04章 02 VTK管道的执行过程与类型

在VTK(Visualization Toolkit)中,可视化管道的执行过程是实现数据可视化的核心。VTK的管道系统通过一系列数据处理模块(称为算法)和数据对象组成,这些模块通过输入和输出端口连接,形成一个有向非循环图(DAG)。管道的执行方式包括显式执行隐式执行条件执行。以下将详细论述这三种执行方式及其特点,并通过示例说明。


1. 显式执行

1.1. 概述

显式执行是指用户在代码中明确调用某个管道节点的Update()方法,强制该节点及其下游节点执行数据处理。显式执行通常用于调试或需要精确控制管道执行顺序的场景。

1.2. 执行过程
  1. 用户调用某个算法模块(如过滤器、映射器)的Update()方法。
  2. 该模块及其下游模块依次执行数据处理。
  3. 数据从输入端流入,经过处理后依次传递到下游模块。
1.3. 示例

假设有一个简单的VTK管道,包含数据源、过滤器和映射器:

#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

int main() {
    // 创建数据源
    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->SetRadius(5.0);

    // 显式执行数据源
    sphereSource->Update();

    // 创建映射器
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(sphereSource->GetOutputPort());

    // 创建Actor
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    // 创建渲染器和窗口
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    // 添加Actor到渲染器
    renderer->AddActor(actor);

    // 启动渲染窗口
    renderWindow->Render();
    interactor->Start();

    return 0;
}

在这个例子中,sphereSource->Update()是显式执行的调用。调用后,sphereSource生成球体数据并传递给映射器。


2. 隐式执行

2.1. 概述

隐式执行是指在管道的某个节点需要数据时,VTK自动触发其上游节点的执行。隐式执行是VTK管道的默认行为,通常用于效率优化和简化代码。

2.2. 执行过程
  1. 当某个节点需要数据时(如渲染器需要映射器的数据),它会检查输入数据是否是最新的。
  2. 如果输入数据不是最新的,则自动触发上游节点的Update()方法。
  3. 数据从上游节点依次向下游节点传递。
2.3. 示例

在隐式执行的情况下,用户不需要显式调用Update(),VTK会自动完成管道的执行。以下是上一个例子的简化版本:

int main() {
    // 创建数据源
    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->SetRadius(5.0);

    // 创建映射器
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(sphereSource->GetOutputPort());

    // 创建Actor
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    // 创建渲染器和窗口
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    // 添加Actor到渲染器
    renderer->AddActor(actor);

    // 启动渲染窗口
    renderWindow->Render();
    interactor->Start();

    return 0;
}

在这个例子中,sphereSource->Update()未显式调用,但当渲染器需要映射器的数据时,VTK会自动触发sphereSource的执行。


3. 条件执行

3.1. 概述

条件执行是指管道的某个节点是否执行取决于某些条件(如数据的修改、用户设置的阈值等)。VTK支持通过条件判断来控制管道的执行,以实现动态更新或优化计算。

3.2. 执行过程
  1. 在某个节点中定义执行条件(如参数变化、数据变化)。
  2. 如果条件满足,则执行该节点及其下游节点。
  3. 如果条件不满足,则跳过该节点的执行。
3.3. 示例

假设有一个带有阈值条件的过滤器,只有在用户设置的阈值发生变化时才执行:

#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkThreshold.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

int main() {
    // 创建数据源
    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->SetRadius(5.0);

    // 创建阈值过滤器
    vtkSmartPointer<vtkThreshold> thresholdFilter = vtkSmartPointer<vtkThreshold>::New();
    thresholdFilter->SetInputConnection(sphereSource->GetOutputPort());
    thresholdFilter->SetLowerThreshold(0.5); // 设置阈值

    // 创建映射器
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(thresholdFilter->GetOutputPort());

    // 创建Actor
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    // 创建渲染器和窗口
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    // 添加Actor到渲染器
    renderer->AddActor(actor);

    // 启动渲染窗口
    renderWindow->Render();
    interactor->Start();

    return 0;
}

在这个例子中,vtkThreshold过滤器是否执行取决于用户设置的阈值。如果阈值未发生变化,则过滤器不会重新执行。


4. 总结

VTK的管道执行方式包括显式执行、隐式执行和条件执行,分别适用于不同的场景:

  • 显式执行:用于调试或精确控制管道的执行顺序。
  • 隐式执行:VTK默认的执行方式,自动触发管道的执行,简化代码。
  • 条件执行:根据特定条件决定是否执行某个节点,动态更新或优化计算。

通过灵活的执行方式,VTK的管道系统能够高效地处理复杂的数据可视化任务。


http://www.kler.cn/a/516881.html

相关文章:

  • Markdown Viewer 浏览器, vscode
  • 日期问题--模板
  • 期权帮|在股指期货中超过持仓限额怎么办?
  • 算法中的时间复杂度和空间复杂度
  • 【C++基础】多线程并发场景下的同步方法
  • 【Elasticsearch】腾讯云安装Elasticsearch
  • 2.7 createCmd中的visitor访问者设计模式
  • 基于微信小程序的设备故障报修管理系统设计与实现(LW+源码+讲解)
  • stm8s单片机(四)时钟输出与蜂鸣器实验
  • 【飞牛云访问本地NAS数据】手机飞牛云APP异地远程连接fnOS随时随地访问私有应用不受网络限制
  • vim如何设置制表符表示的空格数量
  • DRG/DIP 2.0时代下基于PostgreSQL的成本管理实践与探索(上)
  • mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看数据库,删除数据库,使用数据库;
  • VS C++ 配置OPENCV环境
  • AI语言模型竞争加剧:新秀崛起 格局生变
  • ES Module 标准规范
  • C++|开源日志库log4cpp和glog
  • 【云南省乡镇界】面图层shp格式arcgis数据乡镇名称和编码+wgs84坐标无偏移内容测评
  • 【javaSE】内部类(来自类和对象的补充)
  • vue(33) : 安装组件出错解决
  • 在 Ubuntu 上的 Docker 容器中安装 MySQL
  • 订单状态定时处理、来单提醒和客户催单(day10)
  • k8s优雅重启
  • 【GORM】事务,嵌套事务,保存点事务的使用,简单电商平台go案例
  • 力扣动态规划-5【算法学习day.99】
  • 快速排序:一种高效的排序算法