3D可视化字母出现频率_vtkLinearExtrusionFilter


开发环境:

  1. Windows 11 家庭中文版
  2. Microsoft Visual Studio Community 2019
  3. VTK-9.3.0.rc0
  4. vtk-example
  5. 参考代码
  6. 目的:学习与总结

demo解决问题:统计输入文本中字母出现的频率,不区分大小写,使用3D可是化方式进行显示,频率高的字母z方向同比例进行拉伸;运行需要跟一个参数:文本文件路径

关键类:vtkLinearExtrusionFilter、vtkVectorText

知识点

  1. 线形拉伸参数设置:
    extrude[i]->SetInputConnection(letters[i]->GetOutputPort());//#define VTK_VECTOR_EXTRUSION 1    //向量拉伸,与setVector有关//#define VTK_NORMAL_EXTRUSION 2    //法向拉伸,这里与VTK_VECTOR_EXTRUSION一致,都是z方向//#define VTK_POINT_EXTRUSION 3     //点平面拉伸,可以理解为2d平面效果extrude[i]->SetExtrusionType(VTK_NORMAL_EXTRUSION); extrude[i]->SetVector(0, 0, 1.0);                                       //打开z方向向量拉伸/挤压extrude[i]->SetScaleFactor((double)freq[i] / maxFreq * 2.50);           //计算出现频率作为缩放系数

在这里插入图片描述

VTK_POINT_EXTRUSION 设置效果:
2. vtkVectorText: vtk3D文本
3. 相机参数设置:

  //重点掌握:灵活配置参数//https://blog.csdn.net/liushao1031177/article/details/116903698ren->ResetCamera();ren->SetBackground(colors->GetColor3d("Silver").GetData());ren->GetActiveCamera()->Elevation(30.0);  //使用焦点作为旋转中心,围绕投影方向的负片和向上视图矢量的叉积旋转相机。 结果是场景的垂直旋转。ren->GetActiveCamera()->Azimuth(-30.0);   //围绕以焦点为中心的向上视图矢量旋转相机。请注意,向上查看矢量是通过 SetViewUp 设置的任何矢量,不一定垂直于投影方向。 结果是相机的水平旋转。ren->GetActiveCamera()->Dolly(1.25);      //将相机与焦点的距离除以给定的Dolly值。 使用大于 1 的值向焦点推入,使用小于 1 的值推移远离焦点ren->ResetCameraClippingRange();          //根据可见actor的边界重置摄像机剪裁范围。这样可以确保没有props被切断

prj name: AlphaFrequency

//
// Create bar charts of frequency of letters.//创建字母频率的条形图。
//
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkLinearExtrusionFilter.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkVectorText.h>#include <vector>int main(int argc, char* argv[])
{vtkNew<vtkNamedColors> colors;std::vector<vtkSmartPointer<vtkVectorText>> letters;              //渲染三维文本std::vector<vtkSmartPointer<vtkLinearExtrusionFilter>> extrude;   //数据对象进行线性过滤std::vector<vtkSmartPointer<vtkPolyDataMapper>> mappers;std::vector<vtkSmartPointer<vtkPolyDataMapper>> mappers;std::vector<vtkSmartPointer<vtkActor>> actors;char filename[512];char text[2];static char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";int i, j, freq[26], maxFreq;float x, y;FILE* fPtr;int c;//// count the letters//if ((argc == 1) || ((argc == 2) && !(strcmp("-S", argv[1])))){cerr << "Please provide filename: " << argv[0] << " filename\n";strcpy(filename, "./Makefile");cerr << "Using the file " << filename << " as input\n";}else{strcpy(filename, argv[1]);}//读取MakeFile文件if ((fPtr = fopen(filename, "r")) == NULL){cerr << "Cannot open file: " << filename << "\n";exit(1);}//统计MakeFile文件中字母出现的频率for (i = 0; i < 26; i++) freq[i] = 0;while ((c = fgetc(fPtr)) != EOF){if (isalpha(c)){c = tolower(c);freq[c - 97]++;//索引为c - 97的字母频率加1}}//找到出现频率最大的 maxFreqfor (maxFreq = 0, i = 0; i < 26; i++)if (freq[i] > maxFreq)maxFreq = freq[i];//// graphics stuff//vtkNew<vtkRenderer> ren;vtkNew<vtkRenderWindow> renWin;renWin->AddRenderer(ren);vtkNew<vtkRenderWindowInteractor> iren;iren->SetRenderWindow(renWin);//// Setup letters//text[1] = '\0';for (i = 0; i < 26; i++){// datatext[0] = alphabet[i];letters.push_back(vtkSmartPointer<vtkVectorText>::New());letters[i]->SetText(text);// filterextrude.push_back(vtkSmartPointer<vtkLinearExtrusionFilter>::New());    //线形拉伸过滤器extrude[i]->SetInputConnection(letters[i]->GetOutputPort());//#define VTK_VECTOR_EXTRUSION 1    //向量拉伸,与setVector有关//#define VTK_NORMAL_EXTRUSION 2    //法向拉伸,这里与VTK_VECTOR_EXTRUSION一致,都是z方向//#define VTK_POINT_EXTRUSION 3     //点平面拉伸,可以理解为2d平面效果extrude[i]->SetExtrusionType(VTK_VECTOR_EXTRUSION);extrude[i]->SetVector(0, 0, 1.0);                                       //打开z方向向量拉伸/挤压extrude[i]->SetScaleFactor((double)freq[i] / maxFreq * 2.50);           //计算出现频率作为缩放系数// mappermappers.push_back(vtkSmartPointer<vtkPolyDataMapper>::New());mappers[i]->SetInputConnection(extrude[i]->GetOutputPort());mappers[i]->ScalarVisibilityOff();// actoractors.push_back(vtkSmartPointer<vtkActor>::New());actors[i]->SetMapper(mappers[i]);actors[i]->GetProperty()->SetColor(colors->GetColor3d("Peacock").GetData());if (freq[i] <= 0)//没有出现过的字母就不显示{actors[i]->VisibilityOff();}ren->AddActor(actors[i]);}//// Position actors//for (y = 0.0, j = 0; j < 2; j++, y += (-3.0))     //2行{for (x = 0.0, i = 0; i < 13; i++, x += 1.5)     //13列{actors[j * 13 + i]->SetPosition(x, y, 0.0);   //x表示横向,间距1.5;y表示纵向,间距3}}//重点掌握:灵活配置参数//https://blog.csdn.net/liushao1031177/article/details/116903698ren->ResetCamera();ren->SetBackground(colors->GetColor3d("Silver").GetData());ren->GetActiveCamera()->Elevation(30.0);  //使用焦点作为旋转中心,围绕投影方向的负片和向上视图矢量的叉积旋转相机。 结果是场景的垂直旋转。ren->GetActiveCamera()->Azimuth(-30.0);   //围绕以焦点为中心的向上视图矢量旋转相机。请注意,向上查看矢量是通过 SetViewUp 设置的任何矢量,不一定垂直于投影方向。 结果是相机的水平旋转。ren->GetActiveCamera()->Dolly(1.25);      //将相机与焦点的距离除以给定的Dolly值。 使用大于 1 的值向焦点推入,使用小于 1 的值推移远离焦点ren->ResetCameraClippingRange();          //根据可见actor的边界重置摄像机剪裁范围。这样可以确保没有props被切断renWin->SetSize(640, 480);renWin->SetWindowName("AlphaFrequency");// interact with datarenWin->Render();iren->Start();return EXIT_SUCCESS;
}

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

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

相关文章

Figma转Sketch文件教程,超简单!

相信大家做设计的都多多少少听过一点Figma和Sktech&#xff0c;这2个设计软件是目前市场上很受欢迎的专业UI设计软件&#xff0c;在全球各地都有很多粉丝用户。但是相对来说&#xff0c;Figma与Sketch只支持iOS系统有所不同&#xff0c;Figma是一个在线设计软件&#xff0c;不限…

【网络协议】聊聊HTTPDNS如何工作的

传统 DNS 存在哪些问题&#xff1f; 域名缓存问题 我们知道CND会进行域名解析&#xff0c;但是由于本地会进行缓存对应的域名-ip地址&#xff0c;所以可能出现过期数据的情况。 域名转发问题 出口 NAT 问题 域名更新问题 解析延迟问题 因为在解析DNS的时候&#xff0c;需要进行…

【单片机基础小知识-如何通过指针来读写寄存器】

寄存器的本质就是内存&#xff0c;RAM&#xff0c;而指针是可以对内存进行操作的&#xff0c;因此可以通过指针来读写寄存器。 如何读取以下一片地址&#xff1a; 步骤1、首地址 结构体&#xff0c;它所占用的内存空间大小与它内部成员有关。 构造一个28字节的类型 type…

JAVA深化篇_36—— Java网络编程中的常用类

Java网络编程中的常用类 Java为了跨平台&#xff0c;在网络应用通信时是不允许直接调用操作系统接口的&#xff0c;而是由java.net包来提供网络功能。下面我们来介绍几个java.net包中的常用的类。 InetAddress的使用 作用&#xff1a;封装计算机的IP地址和DNS&#xff08;没…

常用设计模式——模板方法模式

什么是模板方法模式 模板方法模式&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 主要解决&#xff1a;一些方法通用&#xff0c;却要在每一个子类都重写这些方法…

数据结构-单链表-力扣题

移除链表元素 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;和前面学的单链表的中间删除数据一样&#xff0c;使要被删除节点的前一个节点指向下要被删除节点的下一个节点&#xff0c;然后把要被删除的节点free掉。 具体实现过程&#xff1a;先…

0成本LLM微调上手项目,⚡️一步一步使用colab训练法律LLM,基于microsoft/phi-1_5,包含lora微调,全参微调

项目地址 &#xff1a;https://github.com/billvsme/train_law_llm ✏️LLM微调上手项目 一步一步使用Colab训练法律LLM&#xff0c;基于microsoft/phi-1_5 。通过本项目你可以0成本手动了解微调LLM。 nameColabDatasets自我认知lora-SFT微调train_self_cognition.ipynbsel…

Spring Boot自动配置原理、实战、手撕自动装配源码

Spring Boot自动配置原理 相比较于传统的 Spring 应用&#xff0c;搭建一个 SpringBoot 应用&#xff0c;我们只需要引入一个注解 SpringBootApplication&#xff0c;就可以成功运行。 前面四个不用说&#xff0c;是定义一个注解所必须的&#xff0c;关键就在于后面三个注解&a…

YOLOv8教程系列:五、关闭数据增强

YOLOv8教程系列&#xff1a;五、关闭数据增强 在一些特殊情况下&#xff0c;特别是在计算机视觉任务中&#xff0c;如目标检测&#xff0c;图像的颜色扰动可能会对算法的性能和稳定性产生重要影响。在这些情况下&#xff0c;我们可能需要采取一些措施来关闭部分或全部的数据增…

JAVA IDEA 下载

超简单步骤一&#xff1a; IntelliJ IDEA 官方下载链接 点击以上链接进入下图&#xff0c;点击下载 继续点下载&#xff0c;然后等待下载完后打开安装包即可 步骤二&#xff1a; 打开下好的安装包&#xff0c;点击Browse...我们把它下载到自己喜欢的地方&#xff08;主要是别占…

Logback从添加依赖,到配置给中打印级别,archive相关信息配置,在项目中的常见的用法,一个完整的过程

添加Logback依赖&#xff1a; 在您的Maven或Gradle项目中&#xff0c;添加Logback依赖。例如&#xff0c;在Maven中&#xff0c;可以将以下依赖添加到pom.xml文件中&#xff1a; <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-c…

NOIP2023模拟13联测34 competition

题目大意 给定一个有 n n n个选手的团队去参加比赛&#xff0c;比赛有 m m m道题&#xff0c;每个选手可以 100 % 100\% 100%将第 l i ∼ r i l_i \sim r_i li​∼ri​道题做出来。 比赛时&#xff0c;团队会随机派出编号连续的人去做题&#xff0c;得分为做出来题目的总数。…

多语言翻译软件 Mate Translate mac中文版特色功能

Mate Translate for Mac是一款多语言翻译软件&#xff0c;Mate Translate mac可以帮你翻译超过100种语言的单词和短语&#xff0c;使用文本到语音转换&#xff0c;并浏览历史上已经完成的翻译。你还可以使用Control S在弹出窗口中快速交换语言。 Mate Translate Mac版特色功能…

C++指针访问数组 函数中用指针传参

用指针访问数组 在函数中用指针传参

Centos批量删除系统重复进程

原创作者&#xff1a;运维工程师 谢晋 Centos批量删除系统重复进程 客户一台CENTOS 7系统负载高&#xff0c;top查看有很多sh的进程&#xff0c;输入命令top -c查看可以看到对应的进程命令是/bin/bash     经分析后发现是因为该脚本执行时间太长&#xff0c;导致后续执…

【pytorch源码分析--torch执行流程与编译原理】

背景 解读torch源码方便算子开发方便后续做torch 模型性能开发 基本介绍 代码库 https://github.com/pytorch/pytorch 模块介绍 aten: A Tensor Library的缩写。与Tensor相关的内容都放在这个目录下。如Tensor的定义、存储、Tensor间的操作&#xff08;即算子/OP&#xff…

Maven简介

一、Maven模型 二、模型实现 三、对应代码项目介绍

南大通用数据库-Gbase-8a-学习-42-定位与释放锁

目录 一、测试版本 二、模拟锁表场景 1、查看自动提交参数 2、关闭自动提交 3、测试表结构 4、测试数据 5、会话一更新数据不提交 6、会话二更新数据卡住 7、会话三查看连接信息 8、会话三查看锁信息 9、解决方法 10、会话一插入数据不提交 11、会话二更新报错 三…

MySQL开启远程访问权限

默认情况下&#xff0c;MySQL只允许本地登录&#xff0c;即只能在安装MySQL环境所在的主机下访问。但是在日常开发和使用中&#xff0c;我们经常需要访问远端服务器的数据库&#xff0c;此时就需要开启服务器端MySQL的远程连接权限。1、生成环境&#xff0c;连接MySQL 2、查看M…

新的LLM 评价方法优化

新的LLM 评价方法 torch 版本定义草稿概念补充说明测试代码def ming_que_du_paddle(x,short=2,long=10):""":param x: [b,s,vos_size]:return: [1]"""score_sort = paddle.sort