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

第04章 11 VTK中,Filter的多输入输出的示例说明

在 VTK(Visualization Toolkit)中,过滤器(Filter)通常用于处理数据流,并且许多过滤器支持多输入和多输出。多输入意味着一个过滤器可以接收多个数据源作为输入,而多输出意味着一个过滤器可以生成多个数据对象作为输出。这种设计使得 VTK 的数据处理管道更加灵活和强大。

下面将详细说明 VTK 中多输入和多输出的情况,并通过示例加以说明。


多输入过滤器

多输入过滤器可以接收多个输入数据源,并将它们合并或处理成一个输出。常见的多输入过滤器包括:

  1. vtkAppendFilter:将多个输入数据集(如 vtkPolyDatavtkUnstructuredGrid 等)合并为一个数据集。
  2. vtkMergeFilter:将多个输入数据集合并为一个数据集,保留每个输入数据集的属性。
  3. vtkBooleanOperationPolyDataFilter:对两个输入的多边形数据集进行布尔操作(如并集、交集、差集等)。
示例:使用 vtkAppendFilter 合并多个数据集
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkConeSource.h>
#include <vtkAppendPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

int main(int, char *[])
{
    // 创建两个数据源:球体和圆锥
    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->SetRadius(1.0);

    vtkSmartPointer<vtkConeSource> coneSource = vtkSmartPointer<vtkConeSource>::New();
    coneSource->SetHeight(2.0);

    // 创建一个多输入过滤器:vtkAppendPolyData
    vtkSmartPointer<vtkAppendPolyData> appendFilter = vtkSmartPointer<vtkAppendPolyData>::New();
    appendFilter->AddInputConnection(sphereSource->GetOutputPort()); // 添加第一个输入
    appendFilter->AddInputConnection(coneSource->GetOutputPort());  // 添加第二个输入
    appendFilter->Update();

    // 创建映射器
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(appendFilter->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> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    // 将 Actor 添加到渲染器中
    renderer->AddActor(actor);
    renderer->SetBackground(0.1, 0.2, 0.3); // 设置背景颜色

    // 启动渲染窗口和交互器
    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

在这个示例中,vtkAppendPolyData 是一个多输入过滤器,它将球体和圆锥的数据合并为一个数据集。


多输出过滤器

多输出过滤器可以生成多个输出数据对象。常见的多输出过滤器包括:

  1. vtkSplitField:将输入数据集的字段拆分为多个输出数据集。
  2. vtkExtractSelection:根据选择条件提取多个子数据集。
  3. vtkThreshold:根据阈值条件生成多个输出数据集。
示例:使用 vtkThreshold 生成多个输出
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkThreshold.h>
#include <vtkUnstructuredGrid.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

int main(int, char *[])
{
    // 创建一个球体数据源
    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->SetRadius(1.0);
    sphereSource->Update();

    // 创建一个阈值过滤器
    vtkSmartPointer<vtkThreshold> thresholdFilter = vtkSmartPointer<vtkThreshold>::New();
    thresholdFilter->SetInputConnection(sphereSource->GetOutputPort());
    thresholdFilter->ThresholdByUpper(0.5); // 设置阈值条件
    thresholdFilter->Update();

    // 获取阈值过滤器的输出
    vtkSmartPointer<vtkUnstructuredGrid> output1 = thresholdFilter->GetOutput();

    // 创建映射器
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(output1);

    // 创建 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> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    // 将 Actor 添加到渲染器中
    renderer->AddActor(actor);
    renderer->SetBackground(0.1, 0.2, 0.3); // 设置背景颜色

    // 启动渲染窗口和交互器
    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

在这个示例中,vtkThreshold 是一个多输出过滤器,它根据阈值条件生成多个输出数据集。


多输入多输出过滤器

有些过滤器既支持多输入,也支持多输出。例如:

  1. vtkProbeFilter:将一个数据集中的属性映射到另一个数据集上,支持多输入和多输出。
  2. vtkMultiBlockDataSetAlgorithm:处理多块数据集,支持多输入和多输出。
示例:使用 vtkProbeFilter 进行数据映射
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkProbeFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

int main(int, char *[])
{
    // 创建两个数据源:球体和圆锥
    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->SetRadius(1.0);

    vtkSmartPointer<vtkConeSource> coneSource = vtkSmartPointer<vtkConeSource>::New();
    coneSource->SetHeight(2.0);

    // 创建一个多输入过滤器:vtkProbeFilter
    vtkSmartPointer<vtkProbeFilter> probeFilter = vtkSmartPointer<vtkProbeFilter>::New();
    probeFilter->SetSourceConnection(sphereSource->GetOutputPort()); // 设置源数据
    probeFilter->SetInputConnection(coneSource->GetOutputPort());   // 设置目标数据
    probeFilter->Update();

    // 创建映射器
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(probeFilter->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> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    // 将 Actor 添加到渲染器中
    renderer->AddActor(actor);
    renderer->SetBackground(0.1, 0.2, 0.3); // 设置背景颜色

    // 启动渲染窗口和交互器
    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

在这个示例中,vtkProbeFilter 是一个多输入多输出过滤器,它将球体的属性映射到圆锥上。


总结

  • 多输入过滤器:可以接收多个输入数据源,如 vtkAppendFilter
  • 多输出过滤器:可以生成多个输出数据对象,如 vtkThreshold
  • 多输入多输出过滤器:同时支持多输入和多输出,如 vtkProbeFilter

通过合理使用多输入和多输出过滤器,可以构建复杂的数据处理管道,满足各种可视化需求。


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

相关文章:

  • Ubuntu 24.04 安装 NVIDIA Container Toolkit 全指南:让Docker拥抱GPU
  • RabbitMQ 架构分析
  • 2024年度总结:技术探索与个人成长的交织
  • 二叉搜索树中的众数(力扣501)
  • HTML从入门到精通:链接与图像标签全解析
  • kafka-保姆级配置说明(consumer)
  • vue3 获取百度天气
  • Day32:字符串的复制
  • x5music3.0 admin_index.php 后台权限绕过漏洞复现(附脚本)
  • Leetcode 3433. Count Mentions Per User
  • 04-机器学习-网页数据抓取
  • salesforce公式字段 ISBLANK 函数和 <> NULL的区别
  • 随笔十六、音频采集、UDP发送
  • 【设计模式-行为型】命令模式
  • 智能门铃开发与面试准备:技术解析与常见问题解答
  • SSH 的登录命令常见用法
  • 人工智能的应用领域和未来发展趋势
  • π0:仅有3B数据模型打通Franka等7种机器人形态适配,实现0样本的完全由模型自主控制方法
  • ESP32 I2S音频总线学习笔记(二):I2S读取INMP441音频数据
  • Java面试题2025-设计模式
  • Redis事务机制详解与Springboot项目中的使用
  • C++ 包装器与绑定器的应用之回调函数的实现
  • 美国主要的科技大公司及其产品介绍
  • 算子--数学与人工智能中的运算力量
  • C# 提取PDF表单数据
  • 旋转的错觉