使用vtk在一个窗口中创建多个几何体

news2024/11/15 21:39:14

引言

该示例为官网上的例子。在一个窗口中创建了多个不同的几何体。
其效果如下:
在这里插入图片描述

示例

开发环境

使用QtCreator4.11.2,Qt5.14.2。使用的vtk9.2的库及其头文件。创建空项目。

示例代码

其pro文件中的内容:

QT       += core

#greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11 vtk9.2

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOUPDIR = $$PWD/../../SOUPdependency
vtk9.2 {
    contains(QT_ARCH, x86_64) {
        include($$SOUPDIR/vtk-9.2/vtk-9.2.pri)
    } else {
        include($$SOUPDIR/vtk-9.2-2017-omp-win32/vtk-9.2.pri)
    }
    DEFINES += vtkEventDataButton3D=vtkEventDataDevice3D
    DEFINES += vtkEventDataMove3D=vtkEventDataDevice3D
}

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

SOURCES += \
    main.cpp

main.cpp

#include <vtkActor.h>
#include <vtkActor2D.h>
#include <vtkPolyDataMapper.h>
#include <vtkArrowSource.h>//箭头
#include <vtkConeSource.h>//圆锥
#include <vtkCubeSource.h>//立方体
#include <vtkCylinderSource.h>//圆柱体
#include <vtkPSphereSource.h>//支持碎片的球体
#include <vtkDiskSource.h>
#include <vtkLineSource.h>//直线
#include <vtkRegularPolygonSource.h>//规则多边形
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkSmartPointer.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkTextMapper.h>
#include <vtkTextProperty.h>
#include <vtkRenderWindowInteractor.h>

#include <array>
#include <vector>
#include <vtkCamera.h>

#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2)//渲染
VTK_MODULE_INIT(vtkInteractionStyle)//交互样式
VTK_MODULE_INIT(vtkRenderingFreeType)//文本图像
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)//体素

int main(int argc,char *argv[])
{
    vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New();
    std::array<unsigned char,4> bkg{51,77,102,255};
    colors->SetColor("bkg",bkg.data());

    std::vector<vtkSmartPointer<vtkPolyDataAlgorithm>> geometricObjectSources;
    geometricObjectSources.push_back(vtkSmartPointer<vtkArrowSource>::New());
    geometricObjectSources.push_back(vtkSmartPointer<vtkConeSource>::New());
    geometricObjectSources.push_back(vtkSmartPointer<vtkCubeSource>::New());
    geometricObjectSources.push_back(vtkSmartPointer<vtkCylinderSource>::New());
    geometricObjectSources.push_back(vtkSmartPointer<vtkDiskSource>::New());
    geometricObjectSources.push_back(vtkSmartPointer<vtkLineSource>::New());
    geometricObjectSources.push_back(vtkSmartPointer<vtkRegularPolygonSource>::New());
    geometricObjectSources.push_back(vtkSmartPointer<vtkPSphereSource>::New());

    std::vector<vtkSmartPointer<vtkPolyDataMapper>> mappers;
    std::vector<vtkSmartPointer<vtkActor>> actors;
    std::vector<vtkSmartPointer<vtkTextMapper>> textMappers;
    std::vector<vtkSmartPointer<vtkActor2D>> textActors;

    vtkNew<vtkTextProperty> textProperty;
    textProperty->SetFontSize(16);
    textProperty->SetJustificationToCentered();//文本居中
    textProperty->SetColor(colors->GetColor3d("LightGoldenrodYellow").GetData());

    for(unsigned int i = 0; i < geometricObjectSources.size();++i)
    {
        geometricObjectSources[i]->Update();//使输出为最新的
        mappers.push_back(vtkSmartPointer<vtkPolyDataMapper>::New());
        mappers[i]->SetInputConnection(geometricObjectSources[i]->GetOutputPort());

        actors.push_back(vtkSmartPointer<vtkActor>::New());
        actors[i]->SetMapper(mappers[i]);
        actors[i]->GetProperty()->SetColor(colors->GetColor3d("PeachPuff").GetData());

        textMappers.push_back(vtkSmartPointer<vtkTextMapper>::New());
        textMappers[i]->SetInput(geometricObjectSources[i]->GetClassName());//设置输入的文本字符串
        textMappers[i]->SetTextProperty(textProperty);

        textActors.push_back(vtkSmartPointer<vtkActor2D>::New());
        textActors[i]->SetMapper(textMappers[i]);
        textActors[i]->SetPosition(120,16);
    }

    auto gridRow = 3;
    auto gridCol = 3;
    int renderSize = 300;

    vtkNew<vtkRenderWindow> renderWindow;
    renderWindow->SetWindowName("GeometricObjecName");
    renderWindow->SetSize(renderSize *gridCol,renderSize *gridRow);

    for(auto row = 0; row < gridRow; ++row)
    {
        for(auto col = 0; col < gridCol; ++col)
        {
            auto index = row *gridCol + col;
            vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New();
            render->SetBackground(colors->GetColor3d("BkgColor").GetData());
            double viewport[4] = {static_cast<double>(col)/gridCol,static_cast<double>(gridRow - row -1) / gridRow,
                                  static_cast<double>(col +1) / gridCol,static_cast<double>(gridRow - row) / gridRow};
            render->SetViewport(viewport);
            if(index < geometricObjectSources.size())
            {
                render->AddActor(actors[index]);
                render->AddActor(textActors[index]);
                render->ResetCamera();
            }
            renderWindow->AddRenderer(render);
        }
    }
    vtkNew<vtkRenderWindowInteractor> interactor;
    interactor->SetRenderWindow(renderWindow);

    renderWindow->Render();
    interactor->Start();

    return 0;
}

疑惑

本例中main.cpp里的代码有一行,

double viewport[4] = {static_cast<double>(col)/gridCol,static_cast<double>(gridRow - row -1) / gridRow,
                                  static_cast<double>(col +1) / gridCol,static_cast<double>(gridRow - row) / gridRow};

不明白这个是什么意思,望能知其意的人指点。

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

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

相关文章

【产品文档】埋点需求文档模板

今天和大家免费分享埋点需求文档模板。埋点文档的目的是帮助开发人员准确地实施埋点&#xff0c;并确保收集到的数据符合预期&#xff0c;以便后续分析和改进产品。 【模板下载】 这个模板可以在 Axure高保真原型哦 小程序里免费下载哦 【文档截图】

微搭低代码实现横向滚动效果

目录 1 添加滚动容器2 滚动内容设置总结 在小程序场景中&#xff0c;有很多横向滚动的效果&#xff0c;比如我们的官方模板电商展示里就有一个横向滚动的效果&#xff0c;本篇我们解读一下横向滚动该如何实现 1 添加滚动容器 不管是横向滚动还是纵向滚动&#xff0c;我们都是依…

【Python】NLP参数控制模板

前言 学过AI的都知道训练一个模型需要调整很多参数&#xff0c;为了有效的管理这些参数、不至于让代码的参数写的乱七八糟&#xff0c;有必要写一套控制参数的模板。 argparser argparser是python当中的参数解析器&#xff0c;在NLP当中主要是用来接受和使用参数的。一个使用它…

Word技巧【自用】

表格断开 做到类似这样的效果&#xff0c;很简单&#xff0c;用边框刷就可以 设定边框的横线&#xff0c;以及磅值&#xff0c;就可以像画三线表一样断开了

vue el-dialog嵌入video实现视频播放功能

video嵌入dialog实现视频播放 业务需求1、实现的效果图3、全部代码(复制粘贴即可实现) 业务需求 弹窗实现视频播放&#xff0c;并且切换不同选项卡播放不同视频 1、实现的效果图 3、全部代码(复制粘贴即可实现) <template><el-button style"margin-left: 60px&q…

警惕: 新的 “RustBucket “恶意软件变种针对macOS用户

研究人员已经揭开了苹果macOS恶意软件RustBucket更新版本的序幕&#xff0c;该版本具有改进的能力&#xff0c;可以建立持久性并避免被安全软件发现。 安全实验室的研究人员在本周发表的一份报告中表示&#xff1a;RustBucket的变种是一个针对macOS系统的恶意软件集合&#xf…

Cisco ISR 1000 Series IOS XE Release Dublin-17.11.1a ED

Cisco ISR 1000 Series IOS XE Release Dublin-17.11.1a ED 思科 1000 系列集成多业务路由器 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-isr-1000/&#xff0c;查看最新版。原创<品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 思科 1000…

关于NISP,收藏这个就够了!

01 全面认知NISP 什么是NISP证书&#xff1f; 为提高各领域人才信息安全意识&#xff0c;落实国家信息安全人才培养战略&#xff0c;缓解我国信息安全领域专业人才存在的供需矛盾&#xff0c;加快我国信息安全专业人才队伍的建设&#xff0c;逐步形成一支政治可靠、技能过硬…

VUE小白学习-2023年6月7日

VUE小白学习-2023年6月7日 前端工程化 日期&#xff1a;2023年6月7日 前端工程化

SVN服务器简单配置过程

一、概述 SVN的全称是Subversion&#xff0c;是一个流行的开源的版本控制系统。Subversion可管理随时间改变的数据&#xff0c; 这些数据放置在一个中央资料档案库(repository) 中。 它就像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样当需要回退时&#xff0c;…

【Java可执行命令】(十)JAR文件签名工具 jarsigner:通过数字签名及验证保证代码信任与安全,深入解析 Java的 jarsigner命令~

Java可执行命令之jarsigner 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法3.1.1 可选参数&#xff1a;jarsigner -keystore < url>3.1.2 可选参数&#xff1a;jarsigner -storepass <口令>3.1.3 可选参数&#xff1a;jarsigner -keypass <口令>3.1.4 可选参…

数字信号处理复习(一):离散傅里叶变换(DFT)

一&#xff1a;为什么需要离散傅里叶变换 我们知道在傅里叶变换中存在连续信号和离散信号变换从而诞生了有拉普拉斯变换&#xff08;连续信号&#xff09;、Z变换&#xff08;离散信号&#xff09;&#xff0c;这两种变换是方便以前没有计算机时工程师们手动计算傅里叶变换。而…

同构:编程中的数学(文末送书4本)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

多项目管理难在哪,多项目同时进行该如何做好进度管理?

最近&#xff0c;听到群里的项目经理吐槽&#xff0c;手上有10多个项目同时进行&#xff0c;工作起来手忙脚乱&#xff0c;杂乱无章&#xff0c;让他压力特别大。 对于项目经理来说&#xff0c;多项目并行推进的情况已是常态。从工作层面来说&#xff0c;不仅在各项目之间抢资…

解决 fatal: Authentication failed for ‘https://github.com/*/*.git/‘

原因&#xff1a;github 的认证策略发生了改变&#xff0c;在 2021年8月13日 的时候&#xff0c;用户名加密码的认证方式被去掉了&#xff0c;换成了 个人令牌&#xff08;Personal Access Token&#xff09;的校验方式。 官网解决方案&#xff1a;管理个人访问令牌 - GitHub …

数分面试题- 面试智力题

目录标题 1、如何用3L和5L桶量取4L水2、有两圈蚊香&#xff0c;一圈烧完需要1小时&#xff0c;怎么才能确定出15分钟/45分钟时间3、提灯过桥问题4、开关灯问题5、赛道赛跑问题6、砝码称重问题6.1 有10瓶药&#xff0c;每瓶有10粒药&#xff0c;其中有一瓶是变质的。好药每颗重1…

家政保洁维修上门预约系统开发;

家政保洁维修上门预约系统开发&#xff1b; 保洁&#xff0c;家电清洗等上门业务系统&#xff0c;支持派单接单&#xff0c;按区域&#xff0c;就近分配、套餐年卡等&#xff1b; 育婴月嫂系统 保姆筛选&#xff0c;简历主页&#xff0c;推荐跟进&#xff0c;在线合同&#xf…

IPO观察丨背靠百度、专注医疗内容营销,为何健康之路举步维艰?

互联网医疗赛道竞争加剧下&#xff0c;相关企业不仅在市场扩张上角逐&#xff0c;也在IPO道路上持续追赶。 仅就6月份而言&#xff0c;就有药师帮、方舟云康、健康之路等几家企业在持续推进上市进程&#xff0c;其中&#xff0c;药师帮已于6月28日成功登陆港交所&#xff0c;而…

pycharm断点调试

第一步&#xff1a;打上断点 第二步&#xff1a;进入调试模式 第三步&#xff1a;分析button作用 Resume Program&#xff1a;进入下一个断点show execution point (F10) &#xff1a;显示当前所有断点step over(F8) &#xff1a;单步调试&#xff0c;若函数A内存在子函数时&a…

改变下拉框中内容显示的顺序方法

在官网上&#xff1a; 如图所示&#xff1a;先点击龙须面&#xff0c;再点击虾仔煎的时候&#xff0c;会在下拉框中按照用户的点击顺序显示出来。 问题&#xff1a;前端如何按照黄金糕-双皮奶-虾仔煎-龙须面的顺序显示点击的值呢&#xff1f;这样做的一个好处就是按后端的顺序…