医疗影像中,DICOM点云、三角面片实体混合渲染(VR)
此文章,涉及到专业性比较强,所以,大部分的内容,基本上都是示例代码的形式出现。以下的技术路径,完全经过实践验证,并且效果很好,可以放心使用。
1 概述
在医学影像中,对DICOM的渲染,通常采用Phong 冯氏光照模型来实现。具体细节可以参考我写的这篇文章
https://blog.csdn.net/rendaweibuaa/article/details/128910050?spm=1001.2014.3001.5501
这里只对一些VR渲染中,关键参数这里做一些补充。
1.1 渲染物体梯度计算 (N计算)
为了使沿着光线的方向显示的更平滑一下,梯度计算可以仿照滤波因子写一个梯度计算的方式;
1.2 阴影效果
为了显示效果更加逼真,近的物体更亮,远的物体更暗,这里采用距离的倒数作为亮度的权重。
上图明显可以看出来,近处亮远处暗的效果;
1.3 材质
因为DICOM中,没有材质属性,但是实际的渲染过程中,可以根据渲染骨,软组织来调整漫反射和镜面反射的参数。
2 STL格式的渲染
在工程中,通常有需要将STL格式和VR一起进行渲染的需求。例如假体的植入,例如牙科,关节置换等。STL格式这里就不具体展开介绍了。以下代码是,三角面片追踪渲染的代码;我把主要的注释都写在代码中。
/**
三角面片追踪渲染函数
输入是一个当前渲染前的rgba 的值
当前三角面的col
光线和三角片的交点 interactPoint
三角面片 trifaceV1 trifaceV2 trifaceV3
光线方向 dirLight
*/
__device__ float4 __trifaceTracing(float4 sum, //累计颜色float4 col, // 颜色和透明度float alphaAccObject,float3 interactPoint, // 位置float3 trifaceV1, // 三角面第一个顶点float3 trifaceV2, // 三角面第二个顶点float3 trifaceV3, // 三角面第三个顶点float3 dirLight, // 光线方向bool invertZ, float distanceInterAndO, // 交点与源点距离float vrBrightness // 亮暗的权值)
{float3 v1 = trifaceV2 - trifaceV1;float3 v2 = trifaceV3 - trifaceV2;float3 N = cross(v1, v2); // 法向量N = normalize(N);float diffuse = dot(N, dirLight);if (diffuse < 0)// 如果是表面渲染,光照在背面,不应该再有反射;但是对于当前的透视来说,直接N反过来;{diffuse = -1 * diffuse;}diffuse = diffuse < 5e-7f ? 1e-6f : diffuse;// Ka + Kd + Ks ≤ 1 这样可以避免光照过曝。不过,具体的比值可能因不同的材质和光照需求而有所不同float dr = distanceInterAndO + RAY_SOURCE_OFFSET; // RAY_SOURCE_OFFSET 用来调整距离,从而调整阴影效果float dr2 = pow(dr ,2);float invDr2 = 1.0f / dr2;float4 clrLight = col * 0.1f;// 以上已经将此点的Phong都计算出来float4 f4Temp = make_float4(0.0f);f4Temp = col * ( ((diffuse * 0.65f + 0.15f * (pow(diffuse, 64.0f))) * vrBrightness) * invDr2 );clrLight += f4Temp;float alphaWeightLeft = (1.0f - alphaAccObject) * col.w; // 给后续光线上的点,留下来的多少透明度(1.0f - alphaAccObject) 和 当前本身当前点的权值 乘return (sum + alphaWeightLeft * clrLight);
}
下面的代码是用来判断光线和三角面片是否相交
__device__ __forceinline__ bool rayIntersectTriangle(const float3& orig, const float3& dir,float3 v0, float3 v1, float3 v2, // 三角形的三个顶点float* t, float* u, float* v,float3* intersection)
{// 初始计算edge1和edge2float3 edge1 = make_float3(v1.x - v0.x, v1.y - v0.y, v1.z - v0.z);float3 edge2 = make_float3(v2.x - v0.x, v2.y - v0.y, v2.z - v0.z);// 计算pvec = dir × edge2float pvec_x = dir.y * edge2.z - dir.z * edge2.y;float pvec_y = dir.z * edge2.x - dir.x * edge2.z;float pvec_z = dir.x * edge2.y - dir.y * edge2.x;// 计算行列式det = edge1 · pvecfloat det = edge1.x * pvec_x + edge1.y * pvec_y + edge1.z * pvec_z;// 处理det为负的情况:交换v1和v2,反转法向量方向if (det < 0.0f) {// 交换v1和v2float3 temp = v1;v1 = v2;v2 = temp;// 重新计算edge1和edge2edge1 = make_float3(v1.x - v0.x, v1.y - v0.y, v1.z - v0.z);edge2 = make_float3(v2.x - v0.x, v2.y - v0.y, v2.z - v0.z);// 重新计算pvec和detpvec_x = dir.y * edge2.z - dir.z * edge2.y;pvec_y = dir.z * edge2.x - dir.x * edge2.z;pvec_z = dir.x * edge2.y - dir.y * edge2.x;det = edge1.x * pvec_x + edge1.y * pvec_y + edge1.z * pvec_z;}// 检查行列式是否接近零(考虑绝对值)if (fabsf(det) < 5e-7f){return false;}// 计算inv_det并继续后续步骤float inv_det = 1.0f / det;float3 tvec = make_float3(orig.x - v0.x, orig.y - v0.y, orig.z - v0.z);// 计算u并检查范围float local_u = (tvec.x * pvec_x + tvec.y * pvec_y + tvec.z * pvec_z) * inv_det;if (local_u < 0.0f || local_u > 1.0f) return false;// 计算qvec = tvec × edge1float qvec_x = tvec.y * edge1.z - tvec.z * edge1.y;float qvec_y = tvec.z * edge1.x - tvec.x * edge1.z;float qvec_z = tvec.x * edge1.y - tvec.y * edge1.x;// 计算v并检查范围float local_v = (dir.x * qvec_x + dir.y * qvec_y + dir.z * qvec_z) * inv_det;if (local_v < 0.0f || (local_u + local_v) > 1.0f) return false;// 计算t并检查正值float local_t = (edge2.x * qvec_x + edge2.y * qvec_y + edge2.z * qvec_z) * inv_det;if (local_t < 0.0f) return false;// 写入结果*t = local_t;*u = local_u;*v = local_v;// 计算交点坐标if (intersection) {intersection->x = orig.x + local_t * dir.x;intersection->y = orig.y + local_t * dir.y;intersection->z = orig.z + local_t * dir.z;}return true;
}
3 加速渲染(BVH树)
通过以上代码计算后,确实可以将三角面片和VR数据一次渲染出来。但是,当三角面片一多的时候,就会发现,渲染速度会变的非常慢。
此时,我们可以通过创建Bvh树来加速渲染。
原理可以参考https://blog.csdn.net/VIPCCJ/article/details/119550359,完全将时间复杂度从O(n)降低到O(logn)。
以下是创建BVH树的代码
// 计算包围盒
void BvhMethods::BvhCalculateBounds(const Facet3D* facets, int start, int end, float bounds[6]) {for (int i = 0; i < 6; ++i){if (i % 2 == 0)bounds[i] = FLT_MAX;elsebounds[i] = -FLT_MAX;}for (int i = start; i < end; ++i){const float* box = facets[i].boxes;for (int j = 0; j < 6; ++j){if (j % 2 == 0){if (box[j] < bounds[j])bounds[j] = box[j];}else{if (box[j] > bounds[j])bounds[j] = box[j];}}}
}// 合并两个包围盒
void BvhMethods::BvhMergeBounds(const float a[6], const float b[6], float out[6])
{for (int i = 0; i < 6; ++i) {out[i] = (i % 2 == 0) ? fminf(a[i], b[i]) : fmaxf(a[i], b[i]);}
}// 构建BVH
int BvhMethods::BvhBuildBVH(const std::vector<Facet3D>& facets, std::vector<BvhNode>& nodes, int start, int end) {int nodeIndex = nodes.size();nodes.push_back(BvhNode());// 计算当前节点的包围盒BvhCalculateBounds(&facets[0], start, end, nodes[nodeIndex].bounds);// 如果只有一个三角形,创建叶节点if (end - start == 1) {nodes[nodeIndex].left = -1;nodes[nodeIndex].right = -1;nodes[nodeIndex].start = start;nodes[nodeIndex].count = 1;return nodeIndex;}// 找到最佳分割轴float axisExtents[3];for (int axis = 0; axis < 3; ++axis) {float minVal = facets[start].boxes[axis];float maxVal = minVal;for (int i = start + 1; i < end; ++i) {minVal = fminf(minVal, facets[i].boxes[axis]);maxVal = fmaxf(maxVal, facets[i].boxes[axis]);}axisExtents[axis] = maxVal - minVal;}int splitAxis = 0;if (axisExtents[1] > axisExtents[splitAxis]) splitAxis = 1;if (axisExtents[2] > axisExtents[splitAxis]) splitAxis = 2;// 按分割轴排序三角形std::vector<int> indices(end - start);for (int i = 0; i < end - start; ++i) indices[i] = start + i;std::sort(indices.begin(), indices.end(), [splitAxis, &facets](int a, int b) {return facets[a].boxes[splitAxis] < facets[b].boxes[splitAxis];});// 找到中间点int middle = (start + end) * 0.5f;int split = middle;// 构建子节点int leftIndex = BvhBuildBVH(facets, nodes, start, middle);int rightIndex = BvhBuildBVH(facets, nodes, middle, end);nodes[nodeIndex].left = leftIndex;nodes[nodeIndex].right = rightIndex;nodes[nodeIndex].start = -1;nodes[nodeIndex].count = -1;return nodeIndex;
}
4 实验
下图是一个由59350个三角面片表示的左心室stl和整个心脏的DICOM点云数据,放在一起进行混合渲染效果图,笔记本上的显卡是RTX3050,整个程序跑起来很顺滑,完全没有任何问题。
相关文章:
医疗影像中,DICOM点云、三角面片实体混合渲染(VR)
此文章,涉及到专业性比较强,所以,大部分的内容,基本上都是示例代码的形式出现。以下的技术路径,完全经过实践验证,并且效果很好,可以放心使用。 1 概述 在医学影像中,对DICOM的渲染…...
程序运行报错分析文档
zryhuawei:~/src/modules/Connect$ ./newbuild/OpConnectAidTool \WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version. replace into process_tracking (step_id,date,status,context_data,start_time,end_time,error_log) values(?,?,?…...
C++数据结构——红黑树
文章目录 一、背景二、关键操作1. 旋转2. 变色3. 查找4. 插入5. 删除 三、面试考点 一、背景 红黑树(Red-Black Tree)是一种自平衡的二叉搜索树(BST),通过颜色标记和旋转操作保证树的高度平衡,从而确保插入…...
【Java实战】线程池 并发 并行 生命周期(详细解释)
线程池: 一种复用线程的技术 不使用线程池的问题: 用户每提出一个需求,都要创建一个新的线程。 创建线程池的方法: JDK 5.0起提供了一个代表线程池的接口:ExecutorService。 方式一: 使用ExecutorServic…...
Qwen3多方位评测
一、Qwen3核心优势 结论,针对这些场景:上下文理解、任务编排、工具调用、数据要素抽取等环节,Qwen3-32B已接近DeepSeek-R1。 二、关键测试环节 1、上下文改写 Qwen3-32B对绝对时间语境理解优于Qwen2.5-72B。 其余改写方面,三…...
银行反欺诈理论、方法与实践总结(下):解决方案
一、金融反欺诈防控体系 反欺诈防控体系是金融机构应对欺诈风险的重要工具,它通常包括事前识别、事中决策和事后处置三个关键阶段。 事前识别阶段:此阶段涉及欺诈情报的收集和账户安全的保护,通过名单和画像的构建来识别潜在风险。例如&…...
自回归图像编辑 EditAR: Unified Conditional Generation with Autoregressive Models
Paperhttps://arxiv.org/pdf/2501.04699 Code (coming soon) 目录 方法 实验 EditAR是一个统一的自回归框架,用于各种条件图像生成任务——图像编辑、深度到图像、边缘到图像、分割到图像。 next-token预测的功效尚未被证明用于图像编辑。 EditAR主要构建在Ll…...
Java中的集合详解
下面是文章详细介绍了 Java 集合框架的基本思路、主要接口与实现、各类集合之间的区别与各自的适用场景,以及一些常见的使用技巧和最佳实践,供你参考。 Java中的集合详解 在 Java 开发中,集合(Collection)作为存储和操…...
前端mjs和js文件区别,mjs和cjs区别---.es.js和.mjs的区别
https://www.cnblogs.com/jocongmin/p/18432236 同一份配置如下,一般打包出来的结果时是一样的,只不过扩展名不一样 export default defineConfig({build: {rollupOptions: {output: [// 同一份配置,仅扩展名不同{ format: es, entryFileNames: [name].mjs },{ fo…...
【深度学习】Transformer 的应用
目录 一、自然语言处理领域 1、自然语言处理领域的应用 2、BART模型 3、BERTSum模型与自动文本摘要 4、SG-Net与机器阅读理解 5、SG-Net的应用 6、总结 二、计算机视觉领域 1、图像分类 (1)背景与挑战 (2)Transformer的…...
C#学习10——泛型
一、什么是泛型? 官方理解:允许开发者在定义类、接口、方法或委托时使用类型参数 个人理解: 类型模具(类似Object变色龙) 二、泛型有什么用? 通过参数化类型实现代码复用,提升类型安全性并…...
Spring Validation校验
使用 JSR 303 (Bean Validation) 校验接口参数 JSR 303,也称为Bean Validation规范,提供了一种在Java应用程序中执行验证的标准化方式。它允许你通过注解直接在领域或者DTO(数据传输对象)类上定义校验规则。 1. 添加依赖 首先需…...
精益数据分析(72/126):MVP的核心法则——消除阻碍与聚焦关键指标
精益数据分析(72/126):MVP的核心法则——消除阻碍与聚焦关键指标 在创业领域,许多失败案例源于对产品开发的认知偏差——过度追求功能完善或盲目跟风增长,却忽略了用户核心需求的最直接满足。今天,我们结合…...
从头实现react native expo本地生成APK
根据github上老外的经验制作了一个react native expo项目起始模版,准备放到资源下载里(已经免积分放置好),这个起始模版带有个人非常喜欢的tailwindcss,由于raact native使用sheetstyle这种风格的样式,不太喜欢.当然,我们使用react native paper组件库时,就要对组件库里的组件使…...
打卡第二十三天
仔细回顾一下之前21天的内容,没跟上进度的同学补一下进度。 作业: 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码。 使用Kaggle平台的注意点 Kaggle是一个数据科学竞赛平台,提供了丰富的数据…...
关于汇编语言与接口技术——单片机串行口的学习心得
学习目标: 1.了解AT89S51单片机片内串行口的基本工作原理 2.掌握与串行口有关的特殊功能寄存器以及四种工作方式 一、串行口内部结构 单片机串行口有两个独立的接收、发送缓冲器SBUF,属于特殊功能寄存器,可以同时发送、接收数据;…...
汇川PLC通过Profinet转ModbusTCP网关读取西门子PLC数据案例
Modbus TCP主站即Modbus TCP客户端,Modbus TCP主站最多支持同时与31个Modbus TCP从站 。(Modbus TCP服务器)进行通信。 第一步设置PLC IP地址; 默认PLC IP地址为192.168.1.88。根据需要判断是否需要修改。 第二步添加Modbus TCP…...
2025-05-20 模型下载--文本向量化--Faiss检索
模型下载 使用Python脚本进行下载 from huggingface_hub import snapshot_download # import os# os.environ["HF_ENDPOINT"] "https://hf-mirror.com" # 自定义下载目录(Windows 路径建议用 raw string 或 pathlib) download_di…...
idea本地debug断点小技巧
idea本地debug断点小技巧 简单的设置断点条件 断点后,右键这个断点,可以在 condition 中填写能得出布尔的表达式 a 1 你如果写如下,表示先给他赋值,然后断住 a 2; true 断点后设置某个变量的值 在 debug 区域可以设置变量…...
Mybatis面向接口编程
添加与Mapper接口的映射 <!--UserMapper.xml--> <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> …...
谈谈对《加密算法》的理解
文章目录 一、什么是加密算法?二、常见的加密算法有哪些?2.1 对称加密2.2 非对称加密2.3 哈希算法 三、加密算法代码展示3.1 MD5加密3.2 秘钥加密3.3 AES加密解密 四、加密算法的使用场景 一、什么是加密算法? 加密算法是一种通过数学方法将…...
代码随想录算法训练营第60期第四十二天打卡
大家好,今天还是继续我们的动态规划里面的背包问题,前面我们主要接触的是0-1背包和完全背包,其实这两个背包问题主要就是看看每一件物品我们是否有多件,如果每一件物品我们只能取一次的话那这样我们就是0-1背包,如果每…...
Java并发进阶系列:深度讨论官方关于jdk1.8ConcurrentHashMap的computeIfAbsent源代码修复逻辑
在文章中《深度解析官方关于jdk1.8的resizeStamp的bug处理过程》,我们讨论关于CHM的核心设计——resizeStam需要修复的处理过程,本文再次基于openJDK的bugs讨论组提出的CHM源代码另外一个会造成死循环的bug,默认读者已经掌握CHM的核心源代码实…...
npm vs npx 终极指南:从原理到实战的深度对比 全面解析包管理器与包执行器的核心差异,助你精准选择工具
npm vs npx 终极指南:从原理到实战的深度对比 全面解析包管理器与包执行器的核心差异,助你精准选择工具 一、核心定位差异 #mermaid-svg-xM2GZt0lejj6hYk6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}…...
RK3588 IREE+Vulkan ResNet50推理测试
RK3588 IREE+Vulkan ResNet50推理测试 背景一.性能数据【暂不考虑该框架】二.操作步骤2.1 搭建NFS服务,解决IREE编译时,空间不足的问题2.2 编译、安装`IREE`2.2.1 挂载NFS2.2.2 安装依赖2.2.3 编译`IREE`2.2.4 获取驱动及设备信息2.2.5 下载推理图片2.2.6 生成`onnx`模型转换脚…...
Blaster - Multiplayer P77-P89: 武器瞄准机制
P78_ Blaster HUD And Player Controller P78_1 创建PC和HUD P78_2 Tick Component > SetHUDCrosshairs() P79_ Drawing the Crosshairs DrawHUD() Call Every Tick. #include "HUD/BlasterHUD.h"void ABlasterHUD::DrawHUD() {Super::DrawHUD();FVector2D View…...
【每天一个MCP】【记录向】:准备工作,创建github项目
记录一下: 新建一个仓库 各种填写项目信息 点击创建 👆不错,开张了~ 尝试一下这个桌面版的github 登录 果然方便 太高级了。~...
元宇宙中的虚拟经济:机遇与挑战
随着元宇宙概念的兴起,虚拟经济逐渐成为全球科技和经济领域关注的焦点。元宇宙不仅是一个虚拟的社交和娱乐空间,更是一个充满经济活动的全新生态系统。从虚拟货币到数字资产,从虚拟商品交易到去中心化金融(DeFi)&#…...
多环境回测模拟不同市场条件下的策略表现
Backtrader库的核心组件包括数据源、策略、执行引擎和结果分析器。通过组合这些组件,可以构建一个完整的交易系统。 在进行回测之前,需要准备历史市场数据。Backtrader支持多种数据格式,如CSV文件、Pandas数据框等。 加载数据 可以使用Backtrader提供的bt.feeds.YahooFina…...
nRF Connect SDK开发之(1)环境搭建
目录 一、安装 nRF Connect SDK 开发环境 1)git 2)python 3) J-Link 编辑 4)nrfutil 1.将nrfutil应用程序所在目录添加到系统路径PATH 2.在命令行中输入nrfutil检测是否可以正常运行 3.运行命令以列出可用命令:nrfutil search 4.安装 device 、toolchain-man…...
武汉火影数字|数字展厅展馆制作:沉浸式体验,全方位互动
在科技飞速发展的当下,数字技术正以前所未有的速度渗透到各个领域,展厅展馆行业也不例外。数字展厅展馆作为传统展厅展馆的创新升级,正逐渐成为展示领域的新宠,为观众带来前所未有的沉浸式体验。 与传统展厅相比,数字展…...
MinIO集群故障,其中一块driver-4异常
现象 driver-4 Offline,驱动状态为未知。 处理过程 建议每个驱动下面新建个文件,便于根据目录里面的drive-x文件区分驱动 rootpve:/mnt/drive-4# df -h Filesystem Size Used Avail Use% Mounted on /dev/sdb 3.7T 695G 3.0T 19% …...
整型数相加的溢出
当正溢出时,返回TMax,负溢出时,返回TMin。这种运算常用在执行数字信号处理的程序中。 程序代码 int saturating_add(int x,int y);void main() {static int x,y;static int i1,sum;x(i<<15)-1;y(i<<15)-1;sumsaturating_add(x,…...
科目一知识点快速回顾与总结
科目一知识点笔记 扣12分的情况 高速上倒掉逆12;普通路上倒掉1逆3 使用伪造,变造的驾驶证(行驶证)一次记12 饮酒驾驶12 代替实际机动车驾驶人接受交通违法行为处罚和记分牟取经济利益的,一次记12 驾驶校车&#x…...
大模型高效微调技术全面解析:从PEFT原理到实战应用
目录 1. 大语言模型与微调概述 1.1 大语言模型(LLM)简介 1.2 微调的必要性与挑战 2. 参数高效微调(PEFT)技术原理 2.1 PEFT概述 2.2 主要PEFT方法 2.2.1 适配器(Adapters) 2.2.2 LoRA(低秩自适应) 2.2.3 QLoRA(量化LoRA) 2.2.4 IA3(通过抑制和放大内部激活注入适配器)…...
51单片机编程学习笔记——无源蜂鸣器演奏《祝你生日快乐》
大纲 蜂鸣器分类有源蜂鸣器无源蜂鸣器 电路图发声演奏《祝你生日快乐》模拟88键钢琴发声音符时值(Note Value)演奏完整代码 蜂鸣器是一种常用的电子发声器件,有源蜂鸣器和无源蜂鸣器在工作原理和特性上有明显区别。 蜂鸣器分类 有源蜂鸣器 …...
大语言模型的评估指标
介绍 语言模型的 BLEU、ROUGE 和 困惑度(Perplexity) 三种常用的语言模型评估指标,帮助你快速理解它们的含义、计算方法及优缺点。 概览 这些指标都是为了解决:「我们自动生成的句子到底有多好?」这个问题࿱…...
绿色免安装 批量重命名软件 标签管理,文件整理提升效率
各位文件整理小能手们,今天给大家介绍一款超牛的工具——拖把更名器!它是专门搞批量文件重命名的实用家伙,能对文件名、扩展名还有音乐文件标签进行高效管理。 咱先说说它的核心功能。首先是基础重命名操作,它能添加、删除、替换…...
python-leetcode 68.有效的括号
题目: 给定一个只包括“(”),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足:左括号必须用相同类型的右括号闭合;左括号必须以正确的顺序闭合,…...
ES(Elasticsearch) 基本概念(一)
Elasticsearch作为当前最流行的开源搜索和分析引擎,广泛应用于日志分析、全文搜索、业务智能等领域。Elasticsearch是一个基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展数据存储和矢量数据库。它针对生产级工作负载的速度和相关性进行了优化。使用 Elasti…...
软考软件评测师—— 操作系统综合知识
目录 嵌入式操作系统 三态模型 操作系统概念 其他操作系统 绝对路径与相对路径 段页式管理 嵌入式操作系统 嵌入式操作系统(EOS)具有以下特点: 可裁剪性:支持开发性和可伸缩性的体系结构,能够根据需求进行功能…...
简单的re(零基础AI做题)
签到题一般简单,上来就是IDA(不管了,IDA!!!) 找主函数,这个题类似的做过好几个了 int __fastcall main(int argc, const char **argv, const char **envp) {__int64 v3; // rdx__i…...
一文掌握 LoRA 常见变体
上文主要是对于 LoRA 的原理和一些常见问题进行了讲解,该篇主要是讲解一些常见的 LoRA 变体。本笔记供个人学习总结使用。 QLoRA QLoRA 是在 LoRA 的基础上进行的改进,旨在进一步减少微调大语言模型时的内存占用,同时保持或仅轻微牺牲性能。主…...
QT高DPI支持
核心函数: qputenv("QT_SCREEN_SCALE_FACTORS", envVar); 如: qputenv("QT_SCREEN_SCALE_FACTORS", "1.2"); 这是我个人目前用的效果最好的,可惜数值不能小于1,小于1的时候,会出问题。 需要程序…...
数据仓库是什么?常见问题解答
在当今数字化时代,企业每天都会产生和收集大量数据。如何有效地存储、管理和分析这些数据,从而为企业决策提供支持,成为了一个关键问题。数据仓库作为一种专门设计的数据存储和管理系统,正是为解决这一问题而生。 数据仓库的定义…...
Java 02入门,封装继承多态
static关键字 1.介绍 静态的意思,可以修饰变量以及函数2.特点 1.被类的所有对象所共享 2.多了一种调用方式,可以通过类名进行调用 3.随着类的加载而加载,优先于对象存在*****3.作用 1.在一个对象里面的一个变量改为static,那么…...
企业级 Hosts 自动化管理实战:基于 HTTP 检测的高可用域名解析方案
摘要 本文针对企业级域名解析稳定性需求,提供一套从IP 检测到Hosts 更新的完整自动化解决方案。通过 HTTP 状态码检测、权威 DNS 解析、原子化文件操作等核心技术,结合多行业真实案例,详细阐述方案设计、脚本实现与生产部署,帮助…...
HTTP/HTTPS与SOCKS5协议在隧道代理中的兼容性设计解析
目录 引言 一、协议特性深度对比 1.1 协议工作模型差异 1.2 隧道代理适配难点 二、兼容性架构设计 2.1 双协议接入层设计 2.2 统一隧道内核 三、关键技术实现 3.1 协议转换引擎 3.1.1 HTTP→SOCKS5转换 3.1.2 SOCKS5→HTTP转换 3.2 连接管理策略 3.2.1 智能连接池 …...
AGI大模型(29):LangChain Model模型
1 LangChain支持的模型有三大类 大语言模型(LLM) ,也叫Text Model,这些模型将文本字符串作为输入,并返回文本字符串作为输出。聊天模型(Chat Model),主要代表Open AI的ChatGPT系列模型。这些模型通常由语言模型支持,但它们的API更加结构化。具体来说,这些模型将聊天消…...
鸿蒙开发进阶:深入解析ArkTS语言特性与开发范式
一、前言 在鸿蒙生态开发体系中,DevEco Studio作为核心开发工具为开发者提供了高效的集成环境。而在掌握工具使用之后,深入理解鸿蒙开发语言成为构建高质量应用的关键。本文将聚焦于鸿蒙系统的核心开发语言——ArkTS,全面解析其起源演进、声…...