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

VTK|类似CloudCompare的比例尺实现1-源码分析

文章目录

  • CloudCompare源码分析
    • void ccGLWindowInterface::drawScale(const ccColor::Rgbub& color)
      • 🧩 总体功能
      • 🧠 函数逐步解析
        • ✅ 1. 断言只在正交模式下使用
        • ✅ 2. 计算显示的实际长度
        • ✅ 3. 字体和图形区域准备
        • ✅ 4. 计算比例尺图形的绘制位置
        • ✅ 5. 绘制比例尺线段和端点刻度
        • ✅ 6. 绘制文字标签(比如 “10”)
      • 🧾 总结
      • ✅ 推荐你关注的点
    • double ccGLWindowInterface::computeActualPixelSize() const
      • ✅ 函数功能概述
      • 🧠 函数逐行解析
      • 🔁 举个例子说明
      • ✅ 总结
    • inline double RoundScale(double equivalentWidth)
    • ✅ 函数功能概述
      • 🧠 逐行详解
        • 1. 计算数量级 `k`
        • 2. 计算“粒度”或跳变步长
        • 3. 将输入值按 granularity 向下舍入
      • ✅ 举例
      • 🔧 总结

CloudCompare 的比例尺(Scale Bar)功能非常直观实用,它的实现具有以下几个关键点。下面将从 设计思想实现方式 两个方面详细说明,并与我们当前的实现思路进行对比,便于你优化自己的系统。


CloudCompare源码分析

源码链接:https://github.com/CloudCompare/CloudCompare
找到对应添加比例尺相关函数代码libs->qCC_glWindow->src->ccGLWindowInterface.cpp

void ccGLWindowInterface::drawScale(const ccColor::Rgbub& color)

在这里插入图片描述

void ccGLWindowInterface::drawScale(const ccColor::Rgbub& color)
{// 断言只在正交模式下使用assert(!m_viewportParams.perspectiveView); //a scale is only valid in ortho. mode!// 比例尺最大占屏幕宽度25%float scaleMaxW = glWidth() / 4.0f; //25% of screen width// 1像素对应的真实空间单位长度(如米)double pixelSize = computeActualPixelSize();// 将比例尺最大宽度(25% 屏幕)转换成实际长度(单位:米),并做了“美化舍入”,如 9.4 -> 10//we first compute the width equivalent to 25% of horizontal screen width//(this is why it's only valid in orthographic mode !)double equivalentWidth = RoundScale(scaleMaxW * pixelSize);// 字体和图形区域准备QFont font = getTextDisplayFont(); //we take rendering zoom into account!QFontMetrics fm(font); // 用于测量字体尺寸// 计算比例尺图形的绘制位置//we deduce the scale drawing widthfloat scaleW_pix = static_cast<float>(equivalentWidth / pixelSize);// 实际长度转换成像素长度float trihedronLength = computeTrihedronLength();// 屏幕上小坐标轴的长度float dW = 2.0f * trihedronLength + 20.0f * m_captureMode.zoomFactor;float dH = std::max(fm.height() * 1.25f, trihedronLength + 5.0f * m_captureMode.zoomFactor);float w = glWidth() / 2.0f - dW;float h = glHeight() / 2.0f - dH;float tick = 3.0f * m_captureMode.zoomFactor;ccQOpenGLFunctions* glFunc = functions();assert(glFunc);//force line widthglFunc->glPushAttrib(GL_LINE_BIT);glFunc->glLineWidth(1.0f);// 绘制比例尺线段和端点刻度//scale OpenGL drawingglColor3ubv_safe<ccQOpenGLFunctions>(glFunc, color);glFunc->glBegin(GL_LINES);// 主线段glFunc->glVertex3f(w - scaleW_pix, -h, 0.0f);glFunc->glVertex3f(w, -h, 0.0f);// 左刻度glFunc->glVertex3f(w - scaleW_pix, -h - tick, 0.0f);glFunc->glVertex3f(w - scaleW_pix, -h + tick, 0.0f);// 右刻度glFunc->glVertex3f(w, -h + tick, 0.0f);glFunc->glVertex3f(w, -h - tick, 0.0f);glFunc->glEnd();glFunc->glPopAttrib(); //GL_LINE_BIT// display label 绘制文字标签(比如 “10”)double textEquivalentWidth = RoundScale(scaleMaxW * pixelSize);QString text = QString::number(textEquivalentWidth);glColor3ubv_safe<ccQOpenGLFunctions>(glFunc, color);renderText(	glWidth() - static_cast<int>(scaleW_pix / 2 + dW) - fm.width(text) / 2,glHeight() - static_cast<int>(dH / 2) + fm.height() / 3,text,static_cast<uint16_t>(RenderTextReservedIDs::ScaleLabel),font);
}

这个函数 ccGLWindowInterface::drawScale() 是 CloudCompare 中 绘制比例尺(Scale Bar) 的主要函数。比例尺通常显示在右下角,仅在**正交视图(Orthographic View)**下启用,用于提示用户当前显示视图的空间尺度。


🧩 总体功能

绘制一个代表实际长度的线段比例尺(如 10m、100m 等),并在旁边绘制文字标签标注其长度。


🧠 函数逐步解析

✅ 1. 断言只在正交模式下使用
assert(!m_viewportParams.perspectiveView); // only valid in ortho. mode!

比例尺仅在正交投影下有效,透视模式下尺寸不再固定,比例尺无意义。


✅ 2. 计算显示的实际长度
float scaleMaxW = glWidth() / 4.0f; // 比例尺最大占屏幕宽度25%
double pixelSize = computeActualPixelSize(); // 1像素对应的真实空间单位长度(如米)
double equivalentWidth = RoundScale(scaleMaxW * pixelSize);
  • pixelSize: 当前视图下 1 像素等于多少“实际单位”(比如米)。
  • equivalentWidth: 将比例尺最大宽度(25% 屏幕)转换成实际长度(单位:米),并做了“美化舍入”,如 9.4 -> 10。

✅ 3. 字体和图形区域准备
QFont font = getTextDisplayFont();
QFontMetrics fm(font); // 用于测量字体尺寸

✅ 4. 计算比例尺图形的绘制位置
float scaleW_pix = equivalentWidth / pixelSize; // 实际长度转换成像素长度
float trihedronLength = computeTrihedronLength(); // 屏幕上小坐标轴的长度
float dW = 2.0f * trihedronLength + 20.0f * m_captureMode.zoomFactor;
float dH = max(fm.height() * 1.25f, trihedronLength + 5.0f * zoomFactor);
float w = glWidth() / 2.0f - dW;
float h = glHeight() / 2.0f - dH;
  • scaleW_pix: 比例尺显示为多长(像素数)。
  • w, h: 比例尺右端点坐标,一般在窗口右下角往左上偏移。
  • dW, dH: 距离边缘和文字的位置偏移量。

✅ 5. 绘制比例尺线段和端点刻度
glFunc->glBegin(GL_LINES);
// 主线段
glVertex3f(w - scaleW_pix, -h, 0.0f);
glVertex3f(w, -h, 0.0f);
// 左刻度
glVertex3f(w - scaleW_pix, -h - tick, 0.0f);
glVertex3f(w - scaleW_pix, -h + tick, 0.0f);
// 右刻度
glVertex3f(w, -h + tick, 0.0f);
glVertex3f(w, -h - tick, 0.0f);
glFunc->glEnd();

绘制了如下图形:

 |     ------------     |^ 左端点     ^ 右端点

✅ 6. 绘制文字标签(比如 “10”)
QString text = QString::number(textEquivalentWidth);
renderText(..., text, ..., font);

将比例尺的实际长度以文字形式显示在比例尺下方居中位置。


🧾 总结

功能实现
只在正交视图下启用assert(!m_viewportParams.perspectiveView)
以屏幕宽度 25% 为上限,计算比例尺真实长度scaleMaxW * pixelSize
比例尺线段与刻度绘制OpenGL glBegin(GL_LINES)...
长度文字标签绘制renderText(...)
缩放自适应pixelSizezoomFactor 控制

✅ 推荐你关注的点

  • RoundScale():控制比例尺长度的跳变规则(如 1/2/5/10/…)
  • computeActualPixelSize():控制比例尺单位与视图缩放的匹配方式
  • renderText():文字绘制细节,是否自动适配 DPI

double ccGLWindowInterface::computeActualPixelSize() const


double ccGLWindowInterface::computeActualPixelSize() const
{double pixelSize = m_viewportParams.computePixelSize(glWidth()); // we now use the width as the driving dimension for scaling// but we have to compensate for the aspect ratio is h > wdouble ar = static_cast<double>(glHeight()) / glWidth();if (ar > 1.0){pixelSize *= ar;}return pixelSize;}

你贴出的 ccGLWindowInterface::computeActualPixelSize() 是 CloudCompare 中**计算当前视图下每个像素所代表的真实空间长度(单位:米或其他单位)**的函数,是比例尺绘制逻辑的核心支撑之一。


✅ 函数功能概述

这个函数返回一个 pixelSize 值,即 “一个屏幕像素在当前视图中对应的实际长度(单位:米)”。这个值用于:

  • 比例尺长度的换算(实际长度 ↔ 屏幕像素长度)
  • label/文本等图元的缩放保持一致性

🧠 函数逐行解析

double pixelSize = m_viewportParams.computePixelSize(glWidth());
  • 使用 viewport 参数中的方法,传入当前窗口宽度(像素),计算当前视图下的单位像素长度
  • m_viewportParamsccViewportParameters 类型,表示当前视角的投影和缩放状态。
  • 默认使用 窗口宽度(X方向) 作为基础缩放维度。

double ar = static_cast<double>(glHeight()) / glWidth();
if (ar > 1.0)
{pixelSize *= ar;
}
  • 这一步是为了补偿高宽比不为1时的缩放失真

    • 当视图是竖屏(高度 > 宽度)时,Y方向单位会拉伸,比例尺就可能被拉短。
    • 通过乘上 aspectRatio = height / width,来补正这种拉伸,使得比例尺长度不变形。

🔁 举个例子说明

假设窗口是 800x600:

  • pixelSize = m_viewportParams.computePixelSize(800):表示800像素宽对应的实际场景宽度(如20米),那 1 像素就是 0.025米。
  • 如果是竖屏(高大于宽,比如 1200x800),Y方向会被压缩,因此乘以 1.5 来修正,让比例尺视觉效果正确。

✅ 总结

作用说明
控制比例尺精度决定 1 像素对应多少实际长度
正交视图缩放适配保证不同窗口尺寸、缩放下比例尺始终反映真实比例
支持非等比例窗口高宽比校正,避免变形显示

inline double RoundScale(double equivalentWidth)


inline double RoundScale(double equivalentWidth)
{//we compute the scale granularity (to avoid width values with a lot of decimals)int k = static_cast<int>(std::floor(std::log(equivalentWidth) / std::log(10.0f)));double granularity = std::pow(10.0, static_cast<double>(k)) / 2.0;//we choose the value closest to equivalentWidth with the right granularityreturn std::floor(std::max(equivalentWidth / granularity, 1.0))*granularity;
}

RoundScale() 是 CloudCompare 中用于**“美化”比例尺长度值**的函数,它会将任意的实际长度(如 92.342 米)舍入到一个“看起来舒服”的值(如 100 米)。


✅ 函数功能概述

inline double RoundScale(double equivalentWidth)

这个函数的目的:

  • equivalentWidth(比如 92.3 米)舍入为一个人类友好的、整洁的数值
  • 保证比例尺看起来是 10/20/50/100/500 这种“好看的刻度”

🧠 逐行详解

1. 计算数量级 k
int k = static_cast<int>(std::floor(std::log(equivalentWidth) / std::log(10.0f)));
  • 这是在算 equivalentWidth 的数量级(10 的几次方):

    • equivalentWidth = 92.3,则 log10(92.3) ≈ 1.965floor(...) = 1,说明是两位数 ≈ 10¹。
    • equivalentWidth = 734,则 k = 2(因为 10² = 100)。

2. 计算“粒度”或跳变步长
double granularity = std::pow(10.0, static_cast<double>(k)) / 2.0;
  • 使用 10 的 k 次方除以 2 得到跳变粒度:

    • 对于 92.3,k = 110¹ / 2 = 5.0
    • 对于 734,k = 2100 / 2 = 50.0
  • 这就让比例尺的跳变是:

    • 单位范围 10~100:每 5 增长(10, 15, 20…)
    • 单位范围 100~1000:每 50 增长(100, 150, 200…)

3. 将输入值按 granularity 向下舍入
return std::floor(std::max(equivalentWidth / granularity, 1.0)) * granularity;
  • equivalentWidth / granularity 得到倍数(如 92.3 / 5 = 18.46)

  • std::floor(...) * granularity → 向下舍入为最近的 granularity 倍数:

    • 92.3 → 18 * 5 = 90
    • 734 → 14 * 50 = 700
  • std::max(..., 1.0) 确保不会出现 0 值


✅ 举例

输入值 (equivalentWidth)粒度 (granularity)最终结果 (RoundScale)
92.3590
73450700
0.830.50.5
0.040.050.05

🔧 总结

目的实现
美化比例尺数字按数量级推导跳变步长
保证整齐可读避免像 92.387 这样的杂数
自适应范围自动在 0.05、0.5、5、50、500 之间切换

相关文章:

VTK|类似CloudCompare的比例尺实现1-源码分析

文章目录 CloudCompare源码分析void ccGLWindowInterface::drawScale(const ccColor::Rgbub& color)&#x1f9e9; 总体功能&#x1f9e0; 函数逐步解析✅ 1. 断言只在正交模式下使用✅ 2. 计算显示的实际长度✅ 3. 字体和图形区域准备✅ 4. 计算比例尺图形的绘制位置✅ 5.…...

【计算机视觉】OpenCV实战项目:基于Tesseract与OpenCV的字符识别系统深度解析

基于Tesseract与OpenCV的字符识别系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 图像预处理流水线1) 形态学操作2) 自适应阈值 2.2 Tesseract OCR引擎 3. 实战部署指南3.1 环境配置3.2 项目结构优化建议3.3 增强版代码实现 4. 常见问题与解决方案4.1 Tesseract路径错误4.2…...

CVE-2025-31258 macOS远程视图服务沙箱逃逸漏洞PoC已公开

苹果公司近日针对macOS系统中新披露的CVE-2025-31258漏洞发布补丁&#xff0c;该漏洞可能允许恶意应用程序突破沙箱限制&#xff0c;获取未授权的系统资源访问权限。在安全研究员Seo Hyun-gyu公开概念验证&#xff08;PoC&#xff09;利用代码后&#xff0c;该漏洞已在macOS Se…...

使用CAS操作实现乐观锁的完整指南

乐观锁是一种高效的并发控制机制&#xff0c;而CAS(Compare-And-Swap)是实现乐观锁的核心技术。下面我将详细介绍如何通过CAS操作实现乐观锁。 一、CAS操作原理 CAS(Compare-And-Swap)是一种原子操作&#xff0c;包含三个操作数&#xff1a; 内存位置(V)预期原值(A)新值(B) …...

java之网络编程

文章目录 网络编程概述什么是网络编程基本的通信架构CS架构BS架构 Java提供了哪些网络编程解决方案&#xff1f; 网络编程三要素IPIP地址IP域名&#xff08;Domain Name&#xff09;DNS域名解析&#xff08;Domain Name System&#xff09;公网IP、内网IP本机IPInetAddress类In…...

苍穹外卖--新增菜品

1.需求分析和设计 产品原型 业务规则&#xff1a; 菜品名称必须是唯一的 菜品必须属于某个分类下&#xff0c;不能单独存在 新增菜品时可以根据情况选择菜品的口味 每个菜品必须对应一张图片 接口设计&#xff1a; 根据类型查询分类(已完成) 文件上传 新增菜品 根据类型…...

Spark处理过程-转换算子

&#xff08;一&#xff09;RDD的处理过程 Spark使用Scala语言实现了RDD的API,程序开发者可以通过调用API对RDD进行操作处理。RDD的处理过程如图所示&#xff1b; RDD经过一系列的“转换”操作&#xff0c;每一次转换都会产生不同的RDD&#xff0c;以供给下一次“转换”操作使…...

运行Spark程序-在Spark-shell——RDD

一、基本概念 RDD&#xff08;弹性分布式数据集&#xff09;是 Apache Spark 的核心抽象&#xff0c;是 Spark 提供的最基本的数据处理单元。理解 RDD 的概念对于掌握 Spark 编程至关重要。以下是 RDD 的核心概念和特性&#xff1a; 1. 什么是 RDD&#xff1f; 定义&#xf…...

Qt应用程序启动时的一些思路:从单实例到性能优化的处理方案

程序启动时优化的价值 在桌面软件开发领域&#xff0c;应用程序的启动过程就像音乐的序曲&#xff0c;决定了用户对软件品质的第一印象。比如首次启动等待超过3秒时&#xff0c;会让大多数用户产生负面看法&#xff0c;而专业工具软件的容忍阈值甚至更低。Qt框架作为跨平台开发…...

vue3父子组件传值

父 → 子&#xff1a;props 父组件 <template><ChildComponent :message"parentMessage" :user"user" /> </template><script setup> import ChildComponent from ./ChildComponent.vue; const parentMessage Hello from paren…...

中国品牌日 | 以科技创新为引领,激光院“风采”品牌建设结硕果

品牌&#xff0c;作为企业不可或缺的隐形财富&#xff0c;在当今竞争激烈的市场环境中&#xff0c;其构建与强化已成为推动企业持续繁荣的关键基石。为了更好地保护自主研发产品&#xff0c;激光院激光公司于2020年3月7日正式注册“风采”商标&#xff0c;创建拥有自主知识产权…...

合合信息上线智能文档处理领域首批MCP服务,助力企业快速搭建Agent

随着大模型及Agent技术的飞速发展&#xff0c;通过大模型调用外部工具正在成为AI应用开发的新范式。然而&#xff0c;由于不同大模型的调用结构和参数格式各异&#xff0c;开发者需要分别编写工具调用逻辑&#xff0c;AI工具集成效率低下&#xff0c;MCP&#xff08;Model Cont…...

佰力博科技与您探讨表面电阻的测试方法及应用领域

表面电阻测试是一种用于测量材料表面电阻值的技术&#xff0c;广泛应用于评估材料的导电性能、静电防护性能以及绝缘性能。 1、表面电阻的测试测试方法&#xff1a; 表面电阻测试通常采用平行电极法、同心圆电极法和四探针法等方法进行。其中&#xff0c;平行电极法通过在试样…...

【DeepSeek】判断两个 PCIe 设备是否属于**同一个 PCIe 子树

在 Linux 系统中&#xff0c;判断两个 PCIe 设备是否属于**同一个 PCIe 子树&#xff08;Subtree&#xff09;**是 P2P 通信的关键前提。以下是具体方法和步骤&#xff1a; 一、基本原理 两个 PCIe 设备属于同一子树的条件&#xff1a; 共享同一 Root Port&#xff1a;它们的…...

一份完整的高级前端性能优化手册

以下是一份完整的高级前端性能优化手册,涵盖核心原理、关键指标、优化策略及工具链,适合中大型项目深度优化: 高级前端性能优化手册 🚀 以用户体验为核心的极致性能实践 一、性能指标体系与度量 1. 核心性能指标 (Core Web Vitals) LCP (Largest Contentful Paint):最大…...

Leetcode 3543. Maximum Weighted K-Edge Path

Leetcode 3543. Maximum Weighted K-Edge Path 1. 解题思路2. 代码实现 题目链接&#xff1a;3543. Maximum Weighted K-Edge Path 1. 解题思路 这一题思路上就是一个遍历的思路&#xff0c;我们只需要考察每一个节点作为起点时&#xff0c;所有长为 k k k的线段的长度&…...

agentmain对业务的影响

前面一篇已经说了java agent技术主要有premain和agentmain两种形式&#xff0c;如果大部分业务已经在线上运行的话&#xff0c;不方便用premain的方式来实现&#xff0c;所以agentmain的方式是更加通用、灵活的 由于RASP是与用户业务运行在同一个jvm中的 &#xff0c;所以RASP…...

【前端】【JavaScript】【总复习】四万字详解JavaScript知识体系

JavaScript 前端知识体系 &#x1f4cc; 说明&#xff1a;本大纲从基础到高级、从语法到应用、从面试到实战&#xff0c;分层级讲解 JavaScript 的核心内容。 一、JavaScript 基础语法 1.1 基本概念 1.1.1 JavaScript 的发展史与用途 1. 发展简史 1995 年&#xff1a;JavaS…...

开源模型应用落地-qwen模型小试-Qwen3-8B-融合VLLM、MCP与Agent(七)

一、前言 随着Qwen3的开源与技术升级,其在企业中的落地场景正加速拓展至多个垂直领域。依托Agent智能体能力 和MCP协议的工具调用接口 ,Qwen3可深度融入企业业务流程,为企业提供从需求解析到自动化开发的全链路支持。 本篇将介绍如何实现Qwen3-8B模型集成MCP实现智能体交互。…...

【Linux学习笔记】理解一切皆文件实现原理和文件缓冲区

【Linux学习笔记】理解一切皆文件实现原理和文件缓冲区 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 前言 哈喽&#xff0c;各位小伙伴大家好!上期我们讲了重定向 今天我们讲的是理解一切皆文件实现原理和文件缓冲区。话不…...

MCP-RAG 服务器:完整设置和使用指南

在快速发展的人工智能应用时代&#xff0c;结合静态领域知识和实时网络信息的系统需求比以往任何时候都更加迫切。传统的检索增强生成&#xff08;RAG&#xff09;模型通常依赖于预先索引的数据&#xff0c;这限制了它们对新发展的反应能力。MCP-RAG Server通过将基于语义的向量…...

裸金属服务器 VS 传统物理机

一&#xff1a;首先&#xff0c;我们先介绍一下&#xff0c;什么是裸金属服务器&#xff1f; 1.虚拟机的外表-平台可视化 可以通过后台管理界面查看当前所使用的全部信息包括&#xff1a;当前系统版本、CPU、内存、硬盘等相关信息。 2.虚拟机的外表-操作自动化 同样也可以在…...

React百日学习计划-Grok3

关键点 研究表明&#xff0c;100天内学习React是可行的&#xff0c;尤其是你已有HTML、JS和CSS基础。该计划包括基础知识、hooks、状态管理、路由、样式化及综合项目&#xff0c;适合初学者。建议每天花2-3小时学习&#xff0c;结合免费教程和社区支持。 开始学习 学习React…...

Android NDK 高版本交叉编译:为何无需配置 FLAGS 和 INCLUDES

引言&#xff1a;NDK 交叉编译的演进 Android NDK&#xff08;Native Development Kit&#xff09;是开发高性能C/C代码的核心工具链&#xff0c;而交叉编译&#xff08;在x86主机上生成ARM架构代码&#xff09;一直是NDK的核心功能。过去&#xff0c;开发者需要手动配置大量编…...

Java详解LeetCode 热题 100(15):LeetCode 189. 轮转数组(Rotate Array)详解

文章目录 1. 题目描述2. 理解题目3. 解法一&#xff1a;使用额外数组3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景 4. 解法二&#xff1a;环状替换法&#xff08;原地算法&#xff09;4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 陷阱与注意事…...

出于PCB设计层面考虑,连排半孔需要注意哪些事项?

通过拼接作为后处理运行&#xff0c;用拼接联排半孔填充铜的自由区域。为了使通缝成为可能&#xff0c;必须在不同的层上有重叠的铜区域连接到指定的网上。铜的支持区域包括填充、多边形和动力平面。 高电流对电路板的潜在负面影响的另一个例子是电路板结构的物理失效。制造原始…...

JIT+Opcache如何配置才能达到性能最优

首先打开php.ini文件&#xff0c;进行配置 1、OPcache配置 ; 启用OPcache opcache.enable1; CLI环境下启用OPcache&#xff08;按需配置&#xff09; opcache.enable_cli0; 预加载脚本&#xff08;PHP 7.4&#xff0c;加速常用类&#xff09; ; opcache.preload/path/to/prel…...

VR和眼动控制集群机器人的方法

西安建筑科技大学信息与控制工程学院雷小康老师团队联合西北工业大学航海学院彭星光老师团队&#xff0c;基于虚拟现实&#xff08;VR&#xff09;和眼动追踪技术实现了人-集群机器人高效、灵活的交互控制。相关研究论文“基于虚拟现实和眼动的人-集群机器人交互方法” 发表于信…...

LabVIEW与PLC通讯程序S7.Net.dll

下图中展示的是 LabVIEW 环境下通过调用S7.Net.dll 组件与西门子 PLC 进行通讯的程序。LabVIEW 作为一种图形化编程语言&#xff0c;结合S7.Net.dll 的.NET 组件优势&#xff0c;在工业自动化领域中可高效实现与 PLC 的数据交互&#xff0c;快速构建工业监控与控制应用。相较于…...

【华为】现场配置OSPF

原创&#xff1a;厦门微思网络 实验目的 1、了解OSPF的运行原理 2、掌握OSPF的配置方法 实验拓扑 实验需求 1、根据实验拓扑图&#xff0c;完成设备的基本配置&#xff1b; 2、分别在R1、R2、R3上创建Loopback0接口&#xff0c;IP地址分别是1.1.1.1/32、2.2.2.2/32、3.3.3.…...

STM32-DMA数据转运(8)

目录 一、简介 二、存储器映像 三、DMA框图​编辑 四、DMA基本结构 五、两个数据转运的实例 一、简介 直接存储器存取简称DMA&#xff08;Direct Memory Access&#xff09;&#xff0c;它是一个数据转运小助手&#xff0c;主要用来协助CPU&#xff0c;完成数据转运的工作…...

课题推荐——低成本地磁导航入门,附公式推导和MATLAB例程运行演示

地磁导航利用地球磁场的自然特性&#xff0c;通过感知磁场变化&#xff0c;帮助机器人或无人设备实现定位和导航。相比于 GPS、激光雷达等导航方法&#xff0c;地磁导航具有以下优势&#xff1a; 低成本&#xff1a;使用地磁传感器&#xff08;如电子罗盘&#xff09;&#xff…...

微信小程序学习之底部导航栏

首先&#xff0c;我们在app.json中添加4个页面&#xff0c; "pages": ["pages/index/index","pages/category/category","pages/cart/cart","pages/user/user"], 其次我们把8张图片放到imaes文件夹下&#xff0c; 图标可…...

c++ std库中的文件操作学习笔记

1. 概述 C标准库提供了 头文件中的几个类来进行文件操作&#xff0c;这些类封装了底层的文件操作&#xff0c;提供了面向对象和类型安全的接口&#xff0c;使得文件读写更加便捷和高效。主要的文件流类包括&#xff1a; std::ifstream&#xff1a;用于从文件中读取数据。 st…...

多臂赌博机:探索与利用的平衡艺术

1. 引言 在机器学习领域&#xff0c;多臂赌博机&#xff08;Multi-Armed Bandit&#xff0c;MAB&#xff09;问题是强化学习的一个经典且基础的模型。这个名称源于赌场中的"单臂老虎机"&#xff08;One-armed Bandit&#xff09;&#xff0c;因为这种赌博机器像强盗…...

分布式异步强化学习框架训练32B大模型:INTELLECT-2

INTELLECT-2 模型详解 一、模型概述 INTELLECT-2 是一个拥有 320 亿参数的语言模型&#xff0c;其训练采用了一种创新的方式&#xff0c;即通过社区贡献的分布式、无需许可的 GPU 资源进行强化学习训练。该模型基于 qwen2 架构构建&#xff0c;因此与 vllm 或 sglang 等流行库…...

HTML应用指南:利用POST请求获取全国京东快递服务网点位置信息

京东快递作为中国领先的智能供应链与综合物流服务提供商,自2007年成立以来,始终致力于通过技术创新与高效运营,为客户提供安全、可靠、快速的物流解决方案。京东快递依托京东集团的强大资源支持,凭借其自营仓储、干线运输、末端配送一体化的物流网络,在激烈的市场竞争中脱…...

通过POI实现对word基于书签的内容替换、删除、插入

一、基本概念 POI&#xff1a;即Apache POI&#xff0c; 它是一个开源的 Java 库&#xff0c;主要用于读取 Microsoft Office 文档&#xff08;Word、Excel、PowerPoint 等&#xff09;&#xff0c;修改 或 生成 Office 文档内容&#xff0c;保存 为对应的二进制或 XML 格式&a…...

git进行版本控制时遇到Push cannot contain secrets的解决方法

git进行版本控制&#xff0c;push遇到Push cannot contain secrets的解决方法 最近在项目开发过程中&#xff0c;我遇到了一个让我头疼不已的问题。 问题的出现 一开始&#xff0c;我的项目远程仓库连接的是 Gitee&#xff0c;在开发过程中一切都很顺利&#xff0c;我也习惯…...

Java GUI 开发之旅:Swing 组件与布局管理的实战探索

在编程的世界里&#xff0c;图形用户界面&#xff08;GUI&#xff09;设计一直是提升用户体验的关键环节。Java 的 Swing 库为我们提供了强大的工具来构建跨平台的 GUI 应用。今天&#xff0c;我将通过一次实验&#xff0c;分享如何使用 Java Swing 开发一个功能丰富的 GUI 应用…...

OpenVLA (2) 机器人环境和环境数据

文章目录 前言1 BridgeData V21.1 概述1.2 硬件环境 2 数据集2.1 场景与结构2.2 数据结构2.2.1 images02.2.2 obs_dict.pkl2.2.3 policy_out.pkl 前言 按照笔者之前的行业经验, 数据集的整理是非常重要的, 因此笔者这里增加原文中出现的几个数据集和环境的学习 1 BridgeData V…...

【Ansible】基于windows主机,采用NTLM+HTTPS 认证部署

我们现在准备Linux centos7&#xff08;Ansible控制机&#xff09;和Windows&#xff08;客户机&#xff09;环境下的详细部署步骤&#xff1a; 一、Windows客户机配置 1. 准备SSL证书 1.1 生成自签名证书&#xff08;测试用&#xff09; 以管理员身份打开PowerShell&#…...

React19源码系列之 API(react-dom)

API之 preconnect preconnect – React 中文文档 preconnect 函数向浏览器提供一个提示&#xff0c;告诉它应该打开到给定服务器的连接。如果浏览器选择这样做&#xff0c;则可以加快从该服务器加载资源的速度。 preconnect(href) 一、使用例子 import { preconnect } fro…...

鸿蒙Next开发 获取APP缓存大小和清除缓存

1. 鸿蒙Next开发 获取APP缓存大小和清除缓存 1.1. 介绍 1.1.1. 文件系统分类 在最新的Core File Kit套件中&#xff0c;按文件所有者的不同。分为如下三类&#xff1a;   &#xff08;1&#xff09;应用文件&#xff1a;文件所有者为应用&#xff0c;包括应用安装文件、应用…...

PNG转ico图标(支持圆角矩形/方形+透明背景)Python脚本 - 随笔

摘要 在网站开发或应用程序设计中&#xff0c;常需将高品质PNG图像转换为ICO格式图标。本文提供一份基于Pillow库实现的&#xff0c;能够完美保留透明背景且支持导出圆角矩形/方形图标的格式转换脚本。 源码示例 圆角方形 from PIL import Image, ImageDraw, ImageOpsdef c…...

『大模型笔记』Langchain作者Harrison Chase专访:环境智能体与全新智能体收件箱

Langchain作者Harrison Chase专访:环境智能体与全新智能体收件箱 文章目录 摘要访谈内容什么环境智能体为什么要探索环境智能体怎么让人类能更方便地和环境智能体互动参考文献摘要 LangChain 的 CEO Harrison Chase 提出了_“环境智能体”(Ambient Agents)的概念,这是一种…...

GPT( Generative Pre-trained Transformer )模型:基于Transformer

GPT是由openAI开发的一款基于Transformer架构的预训练语言模型&#xff0c;拥有强大的生成能力和多任务处理能力&#xff0c;推动了自然语言处理&#xff08;NLP&#xff09;的快速发展。 一 GPT发展历程 1.1 GPT-1&#xff08;2018年&#xff09; 是首个基于Transformer架构…...

游戏引擎学习第275天:将旋转和剪切传递给渲染器

回顾并为今天的内容定下基调 我们认为在实现通用动画系统之前&#xff0c;先学习如何手写动画逻辑是非常有价值的。虽然加载和播放预设动画是合理的做法&#xff0c;尤其是在团队中有美术人员使用工具制作动画的情况下更是如此&#xff0c;但手动编写动画代码能让我们更深入理…...

conda 输出指定python环境的库 输出为 yaml文件

conda 输出指定python环境的库 输出为 yaml文件。 有时为了项目部署&#xff0c;需要匹配之前的python环境&#xff0c;需要输出对应的python依赖库。 假设你的目标环境名为 myenv&#xff0c;运行以下命令&#xff1a; conda env export -n myenv > myenv_environment.ym…...

ES6 语法

扩展运算符 … 口诀&#xff1a;三个点&#xff0c;打散数组&#xff0c;逐个放进去 例子&#xff1a; let arr [1, 2];let more [3, 4];arr.push(...more); // arr 变成 [1, 2, 3, 4]解构赋值 口诀&#xff1a;左边是变量&#xff0c;右边是值&#xff0c;一一对应 例子&…...