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

C++ Qt/VTK装配体组成联动连接杆

效果

在这里插入图片描述

关键代码

#include "View3D.h"
#include "Axis.h"#include <vtkActor.h>
#include <vtkAppendPolyData.h >
#include <vtkAreaPicker.h>
#include <vtkAxesActor.h>
#include <vtkBox.h>
#include <vtkCamera.h>
#include <vtkCaptionActor2D.h>
#include <vtkCellArray.h>
#include <vtkCleanPolyData.h >
#include <vtkContourFilter.h>
#include <vtkCubeSource.h>
#include <vtkCylinder.h>
#include <vtkCylinderSource.h>
#include <vtkDataSet.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkImplicitBoolean.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkLine.h>
#include <vtkMinimalStandardRandomSequence.h>
#include <vtkNamedColors.h>
#include <vtkObjectFactory.h>
#include <vtkOrientationMarkerWidget.h>
#include <vtkPlane.h>
#include <vtkPolyDataMapper.h>
#include <vtkPolyDataNormals.h>
#include <vtkPropPicker.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkRendererCollection.h>
#include <vtkReverseSense.h>
#include <vtkSTLReader.h>
#include <vtkSampleFunction.h>
#include <vtkSmartPointer.h>
#include <vtkSphere.h>
#include <vtkTransform.h>
#include <vtkTransformPolyDataFilter.h>// 主体为长方体,端部两个半圆,半圆的圆心是空洞
decltype(auto) View3D::buildBoard(double r, double g, double b)
{// 创建长方体vtkNew<vtkCubeSource> cube;// 长度1,宽度0.2,厚度0.05cube->SetXLength(1);cube->SetYLength(0.05);cube->SetZLength(0.2);cube->Update();// 创建半圆vtkNew<vtkCylinderSource> cy;// 半径0.1,高度0.05,圆心0.5,0,0cy->SetRadius(0.1);cy->SetHeight(0.05);cy->SetCenter(0.5, 0, 0);cy->SetResolution(100);cy->Update();// 创建独立的对称半圆vtkNew<vtkCylinderSource> cy1;// 半径0.1,高度0.05,圆心-0.5,0,0cy1->SetRadius(0.1);cy1->SetHeight(0.05);cy1->SetResolution(100);cy1->SetCenter(-0.5, 0, 0);cy1->Update();// 小圆柱vtkNew<vtkCylinderSource> cy2;cy2->SetRadius(0.05);cy2->SetHeight(0.06);cy2->SetResolution(100);cy2->SetCenter(0.5, 0, 0);cy2->Update();// 小圆柱vtkNew<vtkCylinderSource> cy3;cy3->SetRadius(0.05);cy3->SetHeight(0.06);cy3->SetResolution(100);cy3->SetCenter(-0.5, 0, 0);cy3->Update();// 创建长方体和半圆的合体vtkNew<vtkAssembly> assembly;// cube actorvtkNew<vtkPolyDataMapper> cudeMapper;cudeMapper->SetInputConnection(cube->GetOutputPort());vtkNew<vtkActor> cudeActor;cudeActor->SetMapper(cudeMapper);cudeActor->GetProperty()->SetColor(r, g, b);assembly->AddPart(cudeActor);vtkNew<vtkPolyDataMapper> cyMapper;cyMapper->SetInputConnection(cy->GetOutputPort());vtkNew<vtkActor> cyActor;cyActor->SetMapper(cyMapper);cyActor->GetProperty()->SetColor(r, g, b);assembly->AddPart(cyActor);vtkNew<vtkPolyDataMapper> cy1Mapper;cy1Mapper->SetInputConnection(cy1->GetOutputPort());vtkNew<vtkActor> cy1Actor;cy1Actor->SetMapper(cy1Mapper);cy1Actor->GetProperty()->SetColor(r, g, b);assembly->AddPart(cy1Actor);vtkNew<vtkPolyDataMapper> cy2Mapper;cy2Mapper->SetInputConnection(cy2->GetOutputPort());vtkNew<vtkActor> cy2Actor;cy2Actor->SetMapper(cy2Mapper);cy2Actor->GetProperty()->SetColor(0.8, 0, 0);assembly->AddPart(cy2Actor);vtkNew<vtkPolyDataMapper> cy3Mapper;cy3Mapper->SetInputConnection(cy3->GetOutputPort());vtkNew<vtkActor> cy3Actor;cy3Actor->SetMapper(cy3Mapper);cy3Actor->GetProperty()->SetColor(0.8, 0, 0);assembly->AddPart(cy3Actor);return assembly;
}decltype(auto) View3D::buildConnectRod()
{// 淡绿色auto actor1 = buildBoard(0.5, 1, 0.5);// 淡黄色auto actor2 = buildBoard(1, 1, 0.5);// 淡蓝色auto actor3 = buildBoard(0.5, 1, 1);// 平移actoractor1->AddPosition(0.5, 0, 0);actor2->AddPosition(1.5, 0.05, 0);actor3->AddPosition(2.5, 0.1, 0);vtkNew<vtkAssembly> assembly1, assembly2, assembly3;assembly1->AddPart(actor1);assembly1->AddPart(assembly2);assembly2->AddPart(actor2);assembly2->AddPart(assembly3);assembly3->AddPart(actor3);assembly2->SetOrigin(1, 0.05, 0);assembly3->SetOrigin(2, 0, 0);return std::make_tuple(vtkSmartPointer<vtkAssembly>(assembly1),vtkSmartPointer<vtkAssembly>(assembly2),vtkSmartPointer<vtkAssembly>(assembly3));
}View3D::View3D(QWidget* parent): QVTKOpenGLNativeWidget(parent)
{vtkNew<vtkRenderer> renderer;this->renderWindow()->AddRenderer(renderer);renderer->AddActor(baseAxes = getBaseAxes());addGuideLine(3, 0.2);connectRods = buildConnectRod();auto&& [actor1, actor2, actor3] = connectRods;renderer->AddActor(actor1);// 水平旋转renderer->GetActiveCamera()->Azimuth(90);renderer->GetActiveCamera()->SetRoll(-90);renderer->GetActiveCamera()->Azimuth(45);renderer->GetActiveCamera()->Elevation(15);renderer->GetActiveCamera()->SetPosition(3, 3, 1);vtkSmartPointer<vtkOrientationMarkerWidget> widget = vtkSmartPointer<vtkOrientationMarkerWidget>::New();;this->borderWidget = widget;vtkSmartPointer<vtkAxesActor> widgetAxesActor = vtkSmartPointer<vtkAxesActor>::New();widgetAxesActor->SetPosition(0, 0, 0);widgetAxesActor->SetShaftType(0);widgetAxesActor->SetCylinderRadius(0.02);// 设置大小widgetAxesActor->SetTotalLength(2, 2, 2);widget->SetOrientationMarker(widgetAxesActor);widget->SetInteractor(this->interactor());widget->SetEnabled(1);widget->InteractiveOn();// 连接信号槽connect(this, &View3D::rotateBased, this, &View3D::rotateBaseSlot);connect(this, &View3D::rotateBigArmed, this, &View3D::rotateBigArmSlot);connect(this, &View3D::rotateMiddleArmed, this, &View3D::rotateMiddleArmSlot);connect(this, &View3D::rotateSmallArmed, this, &View3D::rotateSmallArmSlot);
}void View3D::addAxis(const Axis& axis)
{vtkNew<vtkTransform> transform;transform->Translate(axis.xyz.x(), axis.xyz.y(), axis.xyz.z());vtkAxesActor* axes = vtkAxesActor::New();transform->RotateX(axis.xyzR.x());transform->RotateY(axis.xyzR.y());transform->RotateZ(axis.xyzR.z());axes->SetUserTransform(transform);// 设置大小axes->SetTotalLength(axis.xyzL.x(), axis.xyzL.y(), axis.xyzL.z());// 设置箭头大小axes->SetConeRadius(axis.xyzL[0] * 0.1);axes->SetCylinderRadius(axis.xyzL[0] * 0.1);axes->SetConeResolution(100);axes->SetCylinderResolution(100);axes->SetXAxisLabelText(axis.labels[0].toStdString().c_str());axes->SetYAxisLabelText(axis.labels[1].toStdString().c_str());axes->SetZAxisLabelText(axis.labels[2].toStdString().c_str());auto xLabelProperty = axes->GetXAxisCaptionActor2D();// 缩小xLabelProperty->SetWidth(axis.xyzL.x() * 0.1);auto yLabelProperty = axes->GetYAxisCaptionActor2D();yLabelProperty->SetWidth(axis.xyzL.y() * 0.1);auto zLabelProperty = axes->GetZAxisCaptionActor2D();zLabelProperty->SetWidth(axis.xyzL.z() * 0.1);// 添加到第一个renderthis->renderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(axes);this->renderWindow()->Render();
}void View3D::rotateBaseSlot(double angle)
{auto&& [a, b, c] = connectRods;// a世界坐标系旋转角归零a->SetOrientation(0, 0, 0);// a 绕世界坐标系旋转到anglea->RotateWXYZ(angle, 0, 0, 1);refresh();
}void View3D::rotateBigArmSlot(double angle)
{auto&& [a, b, c] = connectRods;a->RotateY(angle - a->GetOrientation()[1]);refresh();
}void View3D::rotateMiddleArmSlot(double angle)
{auto&& [a, b, c] = connectRods;b->RotateY(angle - b->GetOrientation()[1]);refresh();
}void View3D::rotateSmallArmSlot(double angle)
{auto&& [a, b, c] = connectRods;c->RotateY(angle - c->GetOrientation()[1]);refresh();
}void View3D::addGuideLine(float r, float space)
{// 创建网格线,间距space,范围-r~rvtkNew<vtkCellArray> lines;vtkNew<vtkPoints> points;for (size_t i = 0; i <= static_cast<unsigned long long>(r / space) * 2; i++) {points->InsertNextPoint(-r, r - space * i, 0);points->InsertNextPoint(r, r - space * i, 0);points->InsertNextPoint(-r + space * i, r, 0);points->InsertNextPoint(-r + space * i, -r, 0);}for (size_t i = 0; i <= static_cast<unsigned long long>(r / space) * 4 + 1; i++) {vtkNew<vtkLine> line;line->GetPointIds()->SetId(0, i * 2);line->GetPointIds()->SetId(1, i * 2 + 1);lines->InsertNextCell(line);}vtkNew<vtkPolyData> linesPolyData;linesPolyData->SetPoints(points);linesPolyData->SetLines(lines);vtkNew<vtkPolyDataMapper> mapper;mapper->SetInputData(linesPolyData);vtkNew<vtkActor> actor;actor->SetMapper(mapper);// 设置透明度actor->GetProperty()->SetOpacity(0.5);this->renderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(actor);this->renderWindow()->Render();
}vtkNew<vtkAxesActor> View3D::getBaseAxes()
{vtkNew<vtkAxesActor> axes;axes->SetTotalLength(1.0, 1.0, 1.0);axes->SetPosition(0, 0, 0);axes->SetShaftType(0);axes->SetConeResolution(100);axes->SetCylinderResolution(100);axes->SetConeRadius(0.1);axes->SetCylinderRadius(0.01);return axes;
}void View3D::refresh()
{this->renderWindow()->Render();
}

相关文章:

C++ Qt/VTK装配体组成联动连接杆

效果 关键代码 #include "View3D.h" #include "Axis.h"#include <vtkActor.h> #include <vtkAppendPolyData.h > #include <vtkAreaPicker.h> #include <vtkAxesActor.h> #include <vtkBox.h> #include <vtkCamera.h>…...

File文件查找

用的是递归调用&#xff0c; &#xff08;递归死循环的结果是导致栈内存溢出错误&#xff09; 一.代码 package org.example;import java.io.File;public class day03 {public static void main(String[] args) {//文件查找&#xff0c;在d&#xff1a;temp下查找改名.mp4sea…...

小程序 wxml2canvas开发文档

wxml: <view class"share__canvas share__canvas1"><view class"share__canvas1-text draw_canvas" data-type"text" data-text"这是一段无边距文字">这是一段无边距文字</view> </view> <canvas canvas-…...

SpringCloud微服务 【实用篇】| 认识微服务

目录 一&#xff1a;认识微服务 1. 微服务框架介绍 2. 服务架构演变 3. 微服务技术对比 4. SpringCloud 图书推荐&#xff1a;《巧用ChatGPT快速提高职场晋升力》 一&#xff1a;认识微服务 本课程学习于黑马&#xff0c;会通过分层次学习&#xff0c;分为三部分去讲解微…...

Csdn文章编写参考案例

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...

Jmeter性能测试:高并发分布式性能测试

​一、为什么要进行分布式性能测试 当进行高并发性能测试的时候&#xff0c;受限于Jmeter工具本身和电脑硬件的原因&#xff0c;无法满足我们对大并发性能测试的要求。 基于这种场景下&#xff0c;我们就需要采用分布式的方式来实现我们高并发的性能测试要求。 二、分布式性能…...

2015年亚太杯APMCM数学建模大赛B题城市公共交通服务水平动态评价模型求解全过程文档及程序

2015年亚太杯APMCM数学建模大赛 B题 城市公共交通服务水平动态评价模型 原题再现 城市公共交通服务评价是城市公共交通系统建设和提高公共交通运营效率的重要组成部分。对于公交企业&#xff0c;管理和规划部门&#xff0c;传统公交车站、线路和换乘枢纽的规划数据只是基于主…...

CCF CSP认证历年题目自练 Day40

题目 试题编号&#xff1a; 201412-3 试题名称&#xff1a; 集合竞价 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   某股票交易所请你编写一个程序&#xff0c;根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量…...

闲聊一下写技术博客的一些感想

大家好&#xff0c;我是阿赵。   在我的163博客关闭之后&#xff0c;我就把一部分的博文移到了CSDN这边。不过实际上我有好几年都没有写过博客&#xff0c;所以这个博客的浏览量和粉丝数一直都不高。直到今年2023年的2月底开始&#xff0c;打算总结一下3DsMax的MaxScript的用…...

单片机为什么一直用C语言,不用其他编程语言?

单片机为什么一直用C语言&#xff0c;不用其他编程语言&#xff1f; 51 单片机规模小得拮据&#xff0c;C 的优势几乎看不到。放个类型信息进去都费劲&#xff0c;你还想用虚函数&#xff1f;还想模板展开&#xff1f;程序轻松破 10k。最近很多小伙伴找我&#xff0c;说想要一些…...

利用HTTP2,新型DDoS攻击峰值破纪录

亚马逊、Cloudflare 和谷歌周二联合发布消息称&#xff0c;一种依赖于 HTTP/2 快速重置技术的攻击行为对它们造成了破纪录的分布式拒绝服务 (DDoS) 攻击。 根据披露的信息&#xff0c;该攻击自8月下旬以来便一直存在&#xff0c;所利用的漏洞被跟踪为CVE-2023-44487&#xff0c…...

android鼠标滚轮事件监听方法

Overridepublic boolean onGenericMotionEvent(MotionEvent event) { //The input source is a pointing device associated with a display. //输入源为可显示的指针设备&#xff0c;如&#xff1a;mouse pointing device(鼠标指针),stylus pointing device(尖笔设备)if (0 ! …...

【C语言|关键字】C语言32个关键字详解(4)——其他(typedef、sizeof)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

Hafnium简介和构建

安全之安全(security)博客目录导读 目录 一、Hafnium简介 二、Hafnium构建 2.1.1 先决条件 2.1.1.1 构建Host 2.1.1.2 工具链 2.1.1.3 依赖 2.1.1.4 获取源码 2.1.2 构建 一、Hafnium简介 可信固件为Armv8-A、Armv9-A和Armv8-M提供了安全软件的参考实现。它为SoC开发人…...

2023年香水行业数据分析:国人用香需求升级,高端香水高速增长

在人口结构变迁的背景下&#xff0c;“Z世代”作为当下我国的消费主力&#xff0c;正在将“悦己”消费推动成为新潮流。具备经济基础的“Z世代”倡导“高颜值”、“个性化”、“精致主义”&#xff0c;这和香水、香氛为代表的“嗅觉经济”的特性充分契合&#xff0c;因此&#…...

这可能是最简单的Page Object库

做过web自动化测试的同学&#xff0c;对Page object设计模式应该不陌生。 Page object库应该根据以下目标开发&#xff1a; Page object应该易于使用 清晰的结构 PageObjects 对于页面对象 PageModules对于页面内容 只写测试&#xff0c;而不是基础。 在可能的情况下防止…...

论文阅读——BERT

ArXiv&#xff1a;https://arxiv.org/abs/1810.04805 github&#xff1a;GitHub - google-research/bert: TensorFlow code and pre-trained models for BERT 一、模型及特点&#xff1a; 1、模型&#xff1a; 深层双向transformer encoder结构 BERT-BASE&#xff1a;(L12, H…...

竞赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满…...

Springboot创建多数据源

yml文件 spring:datasource:dynamic:# 设置默认的数据源或者数据源组,默认值即为 masterprimary: masterdatasource:# 主库数据源master:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?useUnicodetrue&characterEncodingutf8…...

【Hello Algorithm】滑动窗口内最大值最小值

滑动窗口介绍 滑动窗口是一种我们想象中的数据结构 它是用来解决算法问题的 我们可以想象出一个数组 然后再在这个数组的起始位置想象出两个指针 L 和 R 我们对于这两个指针做出以下规定 L 和 R指针只能往右移动L指针不能走到R指针的右边我们只能看到L指针和R指针中间的数字 …...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...