(19)VTK C++开发示例 --- 分隔文本读取器

news2025/5/18 20:29:27

文章目录

    • 1. 概述
    • 2. CMake链接VTK
    • 3. main.cpp文件
    • 4. 演示效果


更多精彩内容
👉内容导航 👈
👉VTK开发 👈

1. 概述

本例采用坐标和法线(x y z nx ny nz)的纯文本文件,并将它们读入vtkPolyData并显示在屏幕上。通过更改Reader->SetFieldDelimiterCharacters(" ")的参数,可以很容易地将其更改为读取带有任何分隔符的文件;

演示文件下载地址:vtk-data/Data/DelimitedData.txt at master · pyvista/vtk-data

环境说明
系统ubuntu22.04、windows11
cmake3.22、3.25
Qt5.14.2
编译器g++11.4、msvc2017
VTK9.4.1

2. CMake链接VTK

cmake_minimum_required(VERSION 3.20 FATAL_ERROR) # 设置CMake最低版本
project(vtk2) # 设置项目名称
# 查找VTK库
find_package(VTK COMPONENTS 
CommonColor
CommonCore
CommonDataModel
FiltersGeneral
IOInfovis
InteractionStyle
RenderingContextOpenGL2
RenderingCore
RenderingFreeType
RenderingGL2PSOpenGL2
RenderingOpenGL2
)
if(NOT VTK_FOUND)
message("VTK not found")
return()
endif()

add_executable(vtk2 main.cpp) # 添加可执行文件

target_link_libraries(vtk2 PRIVATE ${VTK_LIBRARIES}) # 链接VTK库
vtk_module_autoinit(TARGETS vtk2 MODULES ${VTK_LIBRARIES}) # 初始化VTK模块

3. main.cpp文件

/********************************************************************************
* 文件名:   main.cpp
* 创建时间: 2025-03-15 21:00:01
* 开发者:   MHF
* 邮箱:     1603291350@qq.com
* 功能:     
*********************************************************************************/
#include <vtkActor.h>
#include <vtkDelimitedTextReader.h>
#include <vtkDoubleArray.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPointData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkTable.h>
#include <vtkVersionMacros.h>  // 这个头文件是用来获取VTK版本号的
#include <vtkVertexGlyphFilter.h>

using namespace std;

int main()
{
  vtkNew<vtkNamedColors> colors;
  string fileName = "E:/Code/C++/vtk1/bin/DelimitedData.txt";

  // 用于读取以特定分隔符(如逗号、制表符等)分隔的文本文件的数据。
  vtkNew<vtkDelimitedTextReader> reader; 
  reader->SetFileName(fileName.c_str());
  reader->DetectNumericColumnsOn(); // 自动检测数值列
  reader->SetFieldDelimiterCharacters(" "); // 设置分隔符
  reader->Update(); // 更新数据

  vtkTable* table = reader->GetOutput(); // 获取输出数据
  vtkNew<vtkPoints> points; // 创建点数据
  vtkNew<vtkDoubleArray> normals; // 创建数据数组
  normals->SetNumberOfComponents(3); // 设置数据数组的组件数

  cout << "行:" <<table->GetNumberOfRows() << endl; // 输出行数
  cout << "列:"<<table->GetNumberOfColumns() << endl; // 输出列数

  for(vtkIdType i = 0; i < table->GetNumberOfRows(); i++) // 遍历行
  {
      cout << "x:"<< table->GetValue(i, 0).ToDouble() 
      << " y:" << table->GetValue(i, 1).ToDouble() 
      << " z:" << table->GetValue(i, 2).ToDouble() << endl;

      points->InsertNextPoint(table->GetValue(i, 0).ToDouble(), 
                              table->GetValue(i, 1).ToDouble(), 
                              table->GetValue(i, 2).ToDouble()); // 插入点数据
      double n[3];
      n[0] = table->GetValue(i, 3).ToDouble(); // 获取法向量数据
      n[1] = table->GetValue(i, 4).ToDouble();
      n[2] = table->GetValue(i, 5).ToDouble();
      normals->InsertNextTuple(n); // 插入法向量数据
      cout << "nx:"<< n[0] << " ny:" << n[1] << " nz:" << n[2] << endl;
  } 
  vtkNew<vtkPolyData> polydata; // 创建多边形数据
  polydata->SetPoints(points); // 设置点数据
  polydata->GetPointData()->SetNormals(normals); // 设置法向量数据

  vtkNew<vtkVertexGlyphFilter> glyphFilter; // 创建顶点过滤器
  glyphFilter->SetInputData(polydata); // 设置输入数据
  glyphFilter->Update(); // 更新数据

  vtkNew<vtkPolyDataMapper> mapper; // 创建多边形数据映射器
  mapper->SetInputConnection(glyphFilter->GetOutputPort()); // 设置输入连接

  vtkNew<vtkActor> actor; // 创建演员
  actor->SetMapper(mapper); // 设置映射器
  actor->GetProperty()->SetPointSize(30); // 设置点大小
  actor->GetProperty()->SetColor(colors->GetColor3d("Tomato").GetData()); // 设置颜色

  vtkNew<vtkRenderer> renderer; // 创建渲染器
  renderer->AddActor(actor); // 添加演员
  renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData()); // 设置背景颜色

  vtkNew<vtkRenderWindow> renderWindow; // 创建渲染窗口
  renderWindow->AddRenderer(renderer); // 添加渲染器
  renderWindow->SetWindowName("DelimitedTextReader"); // 设置窗口名称

  vtkNew<vtkRenderWindowInteractor> renderWindowInteractor; // 创建渲染窗口交互器
  renderWindowInteractor->SetRenderWindow(renderWindow); // 设置渲染窗口

  renderWindow->Render(); // 渲染
  renderWindowInteractor->Start(); // 开始交互
  return 0;
}

4. 演示效果

在这里插入图片描述



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

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

相关文章

Redis从入门到实战先导篇

前言&#xff1a;本节内容包括虚拟机VMware的安装&#xff0c;Linux系统的配置&#xff0c;FinalShell的下载与配置&#xff0c;Redis与其桌面客户端的安装指导,便于后续黑马Redis从入门到实战的课程学习 目录 主要内容 0.相关资源 1.VMware安装 2.Linux与CentOS安装 3.Fi…

JavaScript 防抖和节流

方法一&#xff1a;使用lodash库的debounce方法 方法二&#xff1a;手写防抖函数 function debounce(fn,t){// 1.声明一个定时器变量 因为需要多次赋值 使用let声明let timer // 返回一个匿名函数return function(){if(timer){// 如果定时器存在清除之前的定时器 clearTimeout(…

Spring Boot 启动时 `converting PropertySource ... to ...` 日志详解

Spring Boot 启动时 converting PropertySource ... to ... 日志详解 1. 日志背景 在 Spring Boot 应用启动过程中&#xff0c;会加载并处理多种 配置源&#xff08;如 application.properties、系统环境变量、命令行参数等&#xff09;。这些配置源会被封装为 PropertySource…

分割数据集中.json格式标签转化成伪彩图图像

一、前言 图像分割任务中&#xff0c;分割数据集的转换和表示方式对于模型训练至关重要。目前主要有两种常见的分割结果表示方法&#xff1a; 1. 转化为TXT文件 这种方式通常使用一系列的点&#xff08;坐标&#xff09;来表示图像中每个像素的类别标签。每个点通常包含像素…

Linux之彻底掌握防火墙-----安全管理详解

—— 小 峰 编 程 目录&#xff1a; 一、防火墙作用 二、防火墙分类 1、逻辑上划分&#xff1a;大体分为 主机防火墙 和 网络防火墙 2、物理上划分&#xff1a; 硬件防火墙 和 软件防火墙 三、硬件防火墙 四、软件防火墙 五、iptables 1、iptables的介绍 2、netfilter/…

# 构建和训练一个简单的CBOW词嵌入模型

构建和训练一个简单的CBOW词嵌入模型 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;词嵌入是一种将词汇映射到连续向量空间的技术&#xff0c;这些向量能够捕捉词汇之间的语义关系。在这篇文章中&#xff0c;我们将构建和训练一个简单的Continuous Bag of Words…

Collection集合,List集合,set集合,Map集合

文章目录 集合框架认识集合集合体系结构Collection的功能常用功能三种遍历方式三种遍历方式的区别 List集合List的特点、特有功能ArrayList底层原理LinkedList底层原理LinkedList的应用场list:电影信息管理模块案例 Set集合set集合使用哈希值红黑树HashSet底层原理HashSet集合元…

使用DDR4控制器实现多通道数据读写(九)

一、本章概括 在上一节中&#xff0c;我们概括了工程的整体思路&#xff0c;并提供了工程框架&#xff0c;给出了读写DDR4寄存器的接口列表和重点时序图。当然&#xff0c;对于将DDR4内存封装成FIFO接口&#xff0c;其中的重点在于对于读写DDR4内存地址的控制&#xff0c;相对于…

深度解析n8n全自动AI视频生成与发布工作流

工作流模版地址&#xff1a;Fully Automated AI Video Generation & Multi-Platform Publishing | n8n workflow template 本文将全面剖析基于n8n平台的这个"全自动AI视频生成与多平台发布"工作流的技术架构、实现原理和关键节点&#xff0c;帮助开发者深入理解…

pycharm调试typescript

前言 搜索引擎搜索调试typescript&#xff0c;都是vscode&#xff0c;但是没看懂。 vscode界面简洁&#xff0c;但是适配起来用不习惯&#xff0c;还是喜欢用pycharm。 安装软件 安装Node.js https://nodejs.org/zh-cn 判断是否安装成功 node -v npm install -g typescrip…

spring-ai之Advisors API

1、 Spring AI Advisors API 提供了一种灵活而强大的方法来拦截、 修改和增强 Spring 应用程序中的 AI 驱动的交互。 通过利用 Advisors API&#xff0c;开发人员可以创建更复杂、可重用和可维护的 AI 组件。主要优势包括封装重复的生成式 AI 模式、转换发送到大型语言模型 &…

JVM 系列:JVM 内存结构深度解析

你点赞了吗&#xff1f;你关注了吗&#xff1f;每天分享干货好文。 高并发解决方案与架构设计。 海量数据存储和性能优化。 通用框架/组件设计与封装。 如何设计合适的技术架构&#xff1f; 如何成功转型架构设计与技术管理&#xff1f; 在竞争激烈的大环境下&#xff0c…

【回眸】Tessy集成测试软件使用指南(一)新手使用篇

前言 这个专栏的文章前4篇都在记录如何使用Tessy进行单元测试&#xff0c;集成测试需要有一定单元测试基础&#xff0c;且做集成测试之前&#xff0c;需要做好单元测试&#xff0c;否则将会大幅增加软件单元代码纠错的代价。集成测试所花费的时间通常远远超过单元测试。如果直…

ROS 快速入门教程02

5. Node 节点 以智能手机为例&#xff0c;当我们使用智能手机的某个功能时&#xff0c;大多时候在使用手机的某个APP。同样当我们使用ROS的某个功能时&#xff0c;使用的是ROS的某一个或者某一些节点。 虽然每次我们只使用ROS的某一个或者某一些节点&#xff0c;但我们无法下…

vue+django+LSTM微博舆情分析系统 | 深度学习 | 食品安全分析

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01; 编号&#xff1a; D031 LSTM 架构&#xff1a;vuedjangoLSTMMySQL 功能&#xff1a; 微博信息爬取、情感分析、基于负面消极内容舆情分析…

HCIP实验二(OSPF网络配置与优化)

一.拓扑图与题目 1.R5为ISP&#xff0c;其上只能配置IP地址; R5与其他所有直连设备间均使用公有IP;环回地址为100.1.1.1/3 2.R4设备为企业出口路由器 3.整个0SPF环境IP基于172.16.0.0/16划分 4.所有设备均可访问R5的环回; 5.减少LSA的更新里&#xff0c;加快收敛&#xff0…

K8S的service详解

一。service的介绍 在K8S中&#xff0c;pod是访问应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也意味着不方便直接采用pod的ip对服务进行访问&#xff0c;为了解决这个问题&#xff0c;K8S提供了service…

数据结构初阶:二叉树(四)

概述&#xff1a;本篇博客主要介绍链式结构二叉树的实现。 目录 1.实现链式结构二叉树 1.1 二叉树的头文件&#xff08;tree.h&#xff09; 1.2 创建二叉树 1.3 前中后序遍历 1.3.1 遍历规则 1.3.1.1 前序遍历代码实现 1.3.1.2 中序遍历代码实现 1.3.1.3 后序遍历代…

配置Intel Realsense D405驱动与ROS包

配置sdk使用 Ubuntu20.04LTS下安装Intel Realsense D435i驱动与ROS包_realsense的驱动包-CSDN博客 中的方法一 之后不通过apt安装包&#xff0c;使用官方的安装步骤直接clone https://github.com/IntelRealSense/realsense-ros/tree/ros1-legacy 从这一步开始 执行完 这一步…

【最新版】沃德代驾源码全开源+前端uniapp

一.系统介绍 基于ThinkPHPUniapp开发的代驾软件。系统源码全开源&#xff0c;代驾软件的主要功能包括预约代驾、在线抢单、一键定位、在线支付、车主登记和代驾司机实名登记等‌。用户可以通过小程序预约代驾服务&#xff0c;系统会估算代驾价格并推送附近代驾司机供用户选择&…