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

画布交互系统深度优化:从动态缩放、小地图到拖拽同步的全链路实现方案

画布交互系统深度优化:从动态缩放、小地图到拖拽同步的全链路实现方案

在这里插入图片描述


在可视化画布系统开发中,高效的交互体验与稳定的性能表现是核心挑战。本文针对复杂场景下的五大核心需求,提供完整的技术实现方案,涵盖鼠标中心缩放、节点尺寸限制、画布动态扩展、小地图导航及拖拽同步优化。

一、基于鼠标光标中心的智能缩放方案

(一)数学原理与坐标变换核心逻辑

通过「缩放中心补偿算法」确保缩放以鼠标光标为中心,避免传统视口缩放的偏移问题。核心流程如下:

  1. 计算当前光标在世界坐标系的坐标
  2. 应用缩放矩阵并反向补偿偏移量
  3. 限制缩放范围(建议0.25-4倍)
用户触发滚轮事件
获取当前光标屏幕坐标
转换为世界坐标系中心点
计算新旧缩放比例差值
更新视口偏移量并限制缩放范围
触发画布重绘

(二)视口管理器核心实现

class ViewportManager {private scale = 1;private offset = { x: 0, y: 0 };private readonly MIN_SCALE = 0.25;private readonly MAX_SCALE = 4;zoom(center: Point, delta: number) {const oldScale = this.scale;this.scale = Math.clamp(this.scale * (delta > 0 ? 1.1 : 0.9), this.MIN_SCALE, this.MAX_SCALE);// 核心补偿公式:新偏移量 = 旧偏移量 + 光标位置 * (1 - 旧比例/新比例)this.offset.x += (center.x - this.offset.x) * (1 - oldScale / this.scale);this.offset.y += (center.y - this.offset.y) * (1 - oldScale / this.scale);EventBus.emit('viewport-changed', { scale: this.scale, offset: this.offset });}screenToWorld(point: Point): Point {return {x: (point.x - this.offset.x) / this.scale,y: (point.y - this.offset.y) / this.scale};}
}

二、节点尺寸自适应与画布动态扩展

(一)防失真的节点尺寸控制

通过双向阈值限制,确保节点在极端缩放下仍可辨识:

  • 最小尺寸:8px(保证文字/图标可识别)
  • 最大尺寸:60px(避免遮挡关键信息)
  • 计算公式displaySize = clamp(BASE_SIZE * scale, MIN, MAX)
const renderNode = (node: Node, ctx: CanvasRenderingContext2D) => {const displaySize = Math.clamp(NODE_BASE_SIZE * viewport.scale, NODE_MIN_SIZE, NODE_MAX_SIZE);ctx.beginPath();ctx.arc(node.x, node.y, displaySize / 2, 0, 2 * Math.PI);ctx.fillStyle = node.color;ctx.fill();// 仅在节点足够大时显示标签if (displaySize > 20) {ctx.font = '12px Arial';ctx.fillText(node.label, node.x, node.y + displaySize / 2 + 15);}
}

(二)动态扩展画布边界

通过实时计算节点边界,确保画布始终容纳所有内容:

function updateCanvasBoundary(nodes: Node[]) {const bounds = nodes.reduce((acc, node) => ({left: Math.min(acc.left, node.x - NODE_PADDING),right: Math.max(acc.right, node.x + NODE_PADDING),top: Math.min(acc.top, node.y - NODE_PADDING),bottom: Math.max(acc.bottom, node.y + NODE_PADDING),}),{ left: Infinity, right: -Infinity, top: Infinity, bottom: -Infinity });canvas.style.width = `${bounds.right - bounds.left}px`;canvas.style.height = `${bounds.bottom - bounds.top}px`;return bounds;
}

三、高效导航:小地图功能实现

(一)架构设计与核心流程

主画布渲染完成
生成缩略图数据
视口管理器获取当前可见区域
小地图绘制视口边界
监听点击事件实现区域跳转

(二)核心代码实现

class Minimap {private scaleFactor = 0.1; // 缩略图比例private canvas: HTMLCanvasElement;constructor(container: HTMLElement) {this.canvas = document.createElement('canvas');this.canvas.width = mainCanvas.width * this.scaleFactor;this.canvas.height = mainCanvas.height * this.scaleFactor;container.appendChild(this.canvas);}render(nodes: Node[], viewport: ViewportState) {const ctx = this.canvas.getContext('2d')!;ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);// 绘制所有节点为简化图标nodes.forEach(node => {ctx.fillRect((node.x - viewport.offset.x) * this.scaleFactor,(node.y - viewport.offset.y) * this.scaleFactor,2, 2 // 缩略节点尺寸);});// 绘制当前视口边界ctx.strokeStyle = '#ff4d4f';ctx.strokeRect(0, 0,(mainCanvas.width / viewport.scale) * this.scaleFactor,(mainCanvas.height / viewport.scale) * this.scaleFactor);}handleClick(event: MouseEvent) {const rect = this.canvas.getBoundingClientRect();const x = (event.clientX - rect.left) / this.scaleFactor + viewport.offset.x;const y = (event.clientY - rect.top) / this.scaleFactor + viewport.offset.y;viewportManager.centerAt(x, y); // 视口跳转至点击区域}
}

四、拖拽交互优化与数据持久化

(一)拖拽同步性解决方案

通过「世界坐标系转换」确保拖拽操作与视口状态实时同步,流程如下:

  1. 拖拽开始:记录光标在世界坐标系的初始位置
  2. 拖拽过程:实时计算偏移量并更新节点临时位置
  3. 拖拽结束:将最终坐标转换为物理坐标并持久化存储
User Frontend Viewport Database 按下鼠标开始拖拽 获取当前缩放/偏移状态 转换为世界坐标系起点 移动鼠标 计算世界坐标系偏移量 实时更新节点预览位置 释放鼠标结束拖拽 提交物理坐标数据 返回存储成功 User Frontend Viewport Database

(二)数据存储优化(防抖批量提交)

class CanvasDatabase {private debounceTimer: number | null = null;private pendingUpdates = new Map<string, Node>();updateNodePosition(node: Node) {this.pendingUpdates.set(node.id, node);if (this.debounceTimer) clearTimeout(this.debounceTimer);this.debounceTimer = setTimeout(() => {this.commitUpdates();this.debounceTimer = null;}, 300); // 300ms防抖间隔}private commitUpdates() {const nodes = Array.from(this.pendingUpdates.values());// 调用后端API批量更新fetch('/api/canvas/nodes', {method: 'POST',body: JSON.stringify(nodes),});this.pendingUpdates.clear();}
}

五、架构解耦与可扩展性设计

(一)模块解耦核心策略

  1. 视口管理独立化:通过接口隔离具体图形库(如Konva/PixiJS)
interface IViewport {screenToWorld(point: Point): Point;worldToScreen(point: Point): Point;on(events: 'change', handler: (state: ViewportState) => void): void;
}
  1. 策略模式控制节点尺寸:支持不同场景的尺寸算法动态切换
interface ISizePolicy {calculate(baseSize: number, scale: number): number;
}class DefaultSizePolicy implements ISizePolicy {calculate(base: number, scale: number) {return Math.clamp(base * scale, 8, 60);}
}
  1. 事件驱动架构:通过统一事件总线解耦模块间依赖
发布change事件
发布drag事件
订阅change事件
订阅drag事件
Viewport
EventBus
Nodes
Minimap
Canvas

(二)可测试性优化

通过纯函数与命令模式实现无副作用逻辑,支持独立单元测试:

// 无状态坐标转换函数(可直接测试)
function screenToWorld(point: Point, viewport: ViewportState): Point {return {x: (point.x - viewport.offset.x) / viewport.scale,y: (point.y - viewport.offset.y) / viewport.scale};
}// 命令模式支持撤销/重做
class MoveNodeCommand {constructor(private node: Node, private delta: Point) {}execute() {this.node.x += this.delta.x;this.node.y += this.delta.y;}undo() {this.node.x -= this.delta.x;this.node.y -= this.delta.y;}
}

总结

本文提供的解决方案通过以下核心机制,实现复杂场景下的稳定交互体验:

  1. 数学驱动的缩放算法:确保视觉焦点稳定,避免眩晕感
  2. 双向阈值控制:平衡缩放自由度与内容可读性
  3. 分层架构设计:视口管理、渲染引擎、数据存储三层解耦
  4. 渐进优化策略:从基础交互到架构优化的分阶段实现

相关文章:

画布交互系统深度优化:从动态缩放、小地图到拖拽同步的全链路实现方案

画布交互系统深度优化&#xff1a;从动态缩放、小地图到拖拽同步的全链路实现方案 在可视化画布系统开发中&#xff0c;高效的交互体验与稳定的性能表现是核心挑战。本文针对复杂场景下的五大核心需求&#xff0c;提供完整的技术实现方案&#xff0c;涵盖鼠标中心缩放、节点尺寸…...

GTS-400 系列运动控制器板(七)----修改限位开关触发电平

运动控制器函数库的使用 运动控制器驱动程序、dll 文件、例程、Demo 等相关文件请通过固高科技官网下载,网 址为:www.googoltech.com.cn/pro_view-3.html 1 Windows 系统下动态链接库的使用 在 Windows 系统下使用运动控制器,首先要安装驱动程序。在安装前需要提前下载…...

学习前端(前端技术更新较快,需持续关注技术更新)

目录 1. 基础三件套 1.1 HTML 1.2 CSS 1.3 JavaScript 2. 前端框架 2.1 React 2.2 Vue 2.3 Angular 3. 工程化工具 3.1 构建工具 3.2 代码质量 4. 网络和安全 4.1 HTTP/HTTPS 4.2 性能优化 5. 前沿技术 5.1 TypeScript 5.2 WebAssembly 5.3 微前端 5.4 可视…...

视频转换为MP4格式,小白工具批量转换,在线操作,简单快捷,超实用

小白工具https://www.xiaobaitool.net/videos/convert-to-mp4/ 是一款适合在线将视频转换为MP4格式的工具&#xff0c;尤其适合希望快速转换且无需下载安装软件的用户。以下是对该工具的详细推荐及使用建议&#xff1a; 一、工具特点 在线操作&#xff0c;无需下载 用户只需通…...

PDF处理控件Aspose.PDF指南:使用 Python 将 EPUB 转换为 PDF

EPUB是一种流行的电子书格式&#xff0c;用于可重排内容&#xff0c;而PDF则广泛用于固定版式文档&#xff0c;非常适合共享和打印。如果您想使用 Python 将 EPUB 转换为 PDF&#xff0c;Aspose.PDF for Python 提供了一个简单可靠的解决方案。在本教程中&#xff0c;我们将向您…...

超级扩音器手机版:随时随地,大声说话

在日常生活中&#xff0c;我们常常会遇到手机音量太小的问题&#xff0c;尤其是在嘈杂的环境中&#xff0c;如KTV、派对或户外活动时&#xff0c;手机自带的音量往往难以满足需求。今天&#xff0c;我们要介绍的 超级扩音器手机版&#xff0c;就是这样一款由上海聚告德业文化发…...

Jenkins的地位和作用

所处位置 Jenkins 是一款开源的自动化服务器&#xff0c;广泛应用于软件开发和测试流程中&#xff0c;主要用于实现持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;。它在开发和测试中的位置和作用可以从以下几个方面来理解&#xff1a; 1. 在开发和测…...

NumPy进阶:广播机制、高级索引与通用函数详解

目录 一、广播机制&#xff1a;不同形状数组间的运算 1. 概念 2. 广播规则 3. 实例 二、高级索引&#xff1a;布尔索引与花式索引 1. 布尔索引 &#xff08;1&#xff09;创建布尔索引 &#xff08;2&#xff09;布尔索引的应用 2. 花式索引 &#xff08;1&#xff0…...

Trino分布式 SQL 查询引擎

Trino&#xff08;以前称为 PrestoSQL&#xff09;是一个开源的分布式 SQL 查询引擎&#xff0c;专为交互式分析查询设计&#xff0c;可对大规模数据集进行快速查询。以下从多个方面详细介绍 Trino&#xff1a; 主要特点 多数据源支持&#xff1a;Trino 能够连接多种不同类型…...

Oracle DBA 高效运维指南:高频实用 SQL 大全

大家好&#xff0c;这里是 DBA学习之路&#xff0c;专注于提升数据库运维效率。 目录 前言Top SQL表空间使用率RMAN 备份DataGuard等待事件行级锁在线日志切换用户信息ASM 磁盘组DBLink数据文件收缩AWR 写在最后 前言 作为一名 Oracle DBA&#xff0c;在日常数据库运维工作中&…...

SpringBoot原生实现分布式MapReduce计算

一、架构设计调整 核心组件替换方案&#xff1a; 1、注册中心 → 数据库注册表 2、任务队列 → 数据库任务表 3、分布式锁 → 数据库行级锁 4、节点通信 → HTTP REST接口 二、数据库表结构设计 节点注册表 CREATETABLE compute_nodes (node_id VARCHAR(36)PRIMARYKEY,last_…...

可吸收聚合物:医疗科技与绿色未来的交汇点

可吸收聚合物&#xff08;Biodegradable Polymers&#xff09;作为生物医学工程的核心材料&#xff0c;正引领一场从“金属/塑料植入物”到“智能降解材料”的范式转移。根据QYResearch&#xff08;恒州博智&#xff09;预测&#xff0c;2031年全球可吸收聚合物市场销售额将突破…...

Java从入门到“放弃”(精通)之旅——抽象类和接口⑨

Java从入门到“放弃”&#xff08;精通&#xff09;之旅&#x1f680;——抽象类和接口⑨ 引言 在Java面向对象编程中&#xff0c;抽象类和接口是两个非常重要的概念。它们为代码提供了更高层次的抽象能力&#xff0c;是设计灵活、可扩展系统的关键工具。 &#x1f7e6;一、抽…...

游戏引擎学习第239天:通过 OpenGL 渲染游戏

回顾并为今天的内容做准备 今天&#xff0c;我想继续完成这部分内容&#xff0c;因为实际上我们已经完成了大部分工作&#xff0c;剩下的部分并不复杂。我计划今天完成这部分实现&#xff0c;至少是那些不涉及纹理的部分。正如昨天所说&#xff0c;纹理部分才是唯一比较复杂的…...

基于Python的多光谱遥感数据处理与分类技术实践—以农作物分类与NDVI评估为例

多光谱遥感数据包含可见光至红外波段的光谱信息&#xff0c;Python凭借其丰富的科学计算库&#xff08;如rasterio、scikit-learn、GDAL&#xff09;&#xff0c;已成为处理此类数据的核心工具。本文以Landsat-8数据为例&#xff0c;演示‌辐射校正→特征提取→监督分类→精度评…...

数字空间与VR有什么关系?什么是数字空间?

数字空间与VR的关系 数字空间与虚拟现实&#xff08;VR&#xff09;之间存在着紧密而复杂的关系&#xff0c;它们相互影响、共同促进发展。为了深入理解这一关系&#xff0c;我们需要明确数字空间的基本概念及其与VR技术的相互作用。 数字空间的概念 数字空间&#xff0c;通常…...

navicat导入sql文件 所有问题解决方法集合

问题一&#xff1a;mysql导入大批量数据出现MySQL server has gone away的解决方法 方法一&#xff1a; 查看mysql max_allowed_packet的值 show global variables like max_allowed_packet;可以看到是64M(67108864/1024/1024) 调整为所需大小 例如我们需要调整为1024M(102…...

3、有Bluetooth,LCD,USB,SD卡,PSRAM,FLASH、TP等软硬件驱动开发经验优先考虑

首先&#xff0c;Bluetooth驱动开发经验。蓝牙是一种无线通信技术&#xff0c;广泛应用于设备之间的数据传输&#xff0c;比如耳机、键盘、智能家居设备等。驱动开发可能涉及底层协议的实现、与硬件的交互&#xff0c;以及确保兼容性和稳定性。需要了解蓝牙协议栈&#xff0c;如…...

【k8s】PV,PVC的回收策略——return、recycle、delete

PV 和 PVC 的回收策略主要用于管理存储资源的生命周期&#xff0c;特别是当 PVC 被删除时&#xff0c;PV 的处理方式。回收策略决定了 PV 在 PVC 被删除后的行为。 回收策略的类型 Kubernetes 提供了三种主要的回收策略&#xff0c;用于管理 PV 的生命周期&#xff1a; Reta…...

K8S探针的应用

目录&#xff1a; 1、探针的简介2、启用探针2.1、启用就绪探针2.2、启用存活探针2.3、启用启动探针&#xff08;可选&#xff09; 1、探针的简介 在Kubernetes中&#xff0c;探针&#xff08;Probes&#xff09;是用来检查容器健康状况的工具&#xff0c;它们帮助Kubernetes了…...

c++STL——stack、queue、priority_queue的模拟实现

文章目录 stack、queue、priority_queue的模拟实现使用部分模拟实现容器适配器deque的介绍原理真实结构deque的迭代器deque的操作deque的优缺点 stack的模拟实现按需实例化queue的模拟实现priority_queue的模拟实现为何引入仿函数代码实现 stack、queue、priority_queue的模拟实…...

【Redis】字符串类型List 常用命令详解

文章目录 1. 添加1.1 lpush - 从左或Rpush - 从右添加元素1.2 linsert - 插入新值到某个值前后 2. 获取2.1 lrange - 根据区间获取值2.2 lindex - 根据下标获取值2.3 llen - 获取列表的长度 3. 删除3.1 lpop - 移除最左或rpop - 最右的元素3.2 lrem - 移除指定的值3.3 rpoplpus…...

.NET仓储层在 using 块中创建 SqlSugarClient 的风险

如题&#xff0c;先看代码示例 using 块的使用 public ISugarQueryable<T> GetSet(Expression<Func<T, bool>> whereExpression null) {using (SqlSugarClient dbClient SqlSugarInstance.GetInstance()){var query dbClient.Queryable<T>();if (w…...

PowerQuery逆透视将二维表转换为一维表

PowerQuery逆透视将二维表转换为一维表 原因&#xff1a;为什么要转成一维表&#xff1f; 实例&#xff1a; 1.例如如果用二维表做占比图&#xff0c;我们需要将所有的指标列添加到值上&#xff0c;如图&#xff1a; 2.如果用一维表&#xff0c;我们只需要添加一个指标列和一…...

谐振模态图

t0时刻&#xff0c;原边Q6、Q7导通副边Q1、Q4导通 T1时刻&#xff0c;原边谐振回路电流&#xff0c;由负变正&#xff0c;过零点&#xff0c;副边绕组电流小于负载电流&#xff0c;输出电容放电 T2时刻&#xff0c;副边绕组电流等于负载电流&#xff0c;输出电容不充不放 T3时…...

Idea 配置 Git

1、下载Git 下载地址&#xff1a; Git - Downloading Package 2、win 打开 git bash &#xff0c;配置邮箱和用户名 //配置邮箱 git config --global user.email "710419844qq.com" //配置全局用户名 git config --global user.name "smelodys" 3、ide…...

B + 树与 B 树的深度剖析

在数据库领域&#xff0c;B 树和 B 树是两种极为关键的数据结构&#xff0c;它们对于数据的存储、查询以及索引的构建等方面都有着深远的影响。深刻理解这两种树的原理、特性以及它们之间的差异&#xff0c;对于数据库的性能优化、数据组织和管理等工作具有不可替代的重要作用…...

MongoDB索引

一、索引核心价值 MongoDB索引通过构建高效查询路径&#xff0c;从根本上改变数据检索方式。当未建立索引时&#xff0c;数据库引擎被迫执行全集合扫描&#xff08;COLLSCAN&#xff09;&#xff0c;如同在无序的书架上逐本查找目标书籍。通过建立索引&#xff0c;查询复杂度从…...

Docker--Docker网络原理

虚拟网卡 虚拟网卡&#xff08;Virtual Network Interface&#xff0c;简称vNIC&#xff09; 是一种在软件层面模拟的网卡设备&#xff0c;不依赖于物理硬件&#xff0c;而是通过操作系统或虚拟化技术实现网络通信功能。它允许计算机在虚拟环境中模拟物理网卡的行为&#xff0…...

Java 性能优化:如何在资源受限的环境下实现高效运行?

Java 性能优化&#xff1a;如何在资源受限的环境下实现高效运行&#xff1f; 在计算机系统中&#xff0c;性能优化是一项至关重要的任务&#xff0c;尤其是在资源受限的环境下&#xff0c;如何让 Java 程序高效运行是许多开发者面临的挑战。本文将深入探讨 Java 性能优化的策略…...

Spring之我见 - Spring MVC重要组件和基本流程

核心组件详解 前端控制器 - DispatcherServlet 作用&#xff1a;所有请求的入口&#xff0c;负责请求分发和协调组件。 public class DispatcherServlet extends HttpServlet {// 核心服务方法protected void doService(HttpServletRequest request, HttpServletResponse re…...

MongoDB常用命令

数据库操作 显示所有数据库 show dbs 切换/创建数据库 (如果数据库不存在则创建) use <database_name> 删除当前数据库 db.dropDatabase() 查看当前数据库 db 查看数据库状态 db.stats() 集合操作 显示当前数据库中的所有集合 show collections 创建集合 d…...

Java Set/List 知识点 Java面试 基础面试题

Java Set/List 知识点 Set与List区别 List 有序、值可重复,内部数据结构 Obejct[ ] 数组Set 无序、值不重复,内部数据结构 HashMap keyobject value固定new Object() ArrayList 有序存储元素允许元素重复&#xff0c;允许存储 null 值支持动态扩容非线程安全 HashSet、LinkedHa…...

C#委托介绍

委托可以将方法作为参数传递&#xff0c;同时委托也可以自己作为参数传递 委托可分为自定义委托delegate 无返回值的Action 与有返回值的Func委托 也有匿名委托与Lamada 委托支持多播是事件的基础 用处如在分线程调用主线程的UI invoke public delegate string Say(stri…...

三网通电玩城平台系统结构与源码工程详解(三):控制台与银商权限模块设计

本篇聚焦于三网通电玩城系统中的控制台管理系统及银商权限逻辑。通过深入解构后台系统的角色分权、账目明细管理、发卡接口与日志追踪机制&#xff0c;本文将提供完整的权限划分方案和部分关键实现代码&#xff0c;为平台运维与数据安全提供坚实基础。 一、控制台整体结构概览 …...

audio 核心服务AudioPolicyService 和AudioFlinger启动流程

目录 1、audioserver启动 2、AudioPolicyService启动 3、AudioFlinger启动 audio的核心服务有两个&#xff0c;AudioPolicyService 和AudioFlinger他们到在audioserver一个进程中 1、audioserver启动 设备开机&#xff0c;系统启动时将执行 /system/etc/init/audioserver.rc…...

Android自动化功能-使用Appium获取android页面节点元素信息

一、appium安装和使用 官方网站&#xff1a;https://appium.io/docs/en/latest/ github地址&#xff1a;https://github.com/appium/appium 安装步骤&#xff1a; 首先需要安装node.js 安装好node.js之后使用npm安装 appium npm install -g appium appium -v # 检查安装版本…...

springboot项目配置springMVC

为什么需要配置springMVC 在Spring Boot中配置Spring MVC&#xff0c;实际上是为了更好地集成和使用Spring框架提供的Web开发功能。 Spring Boot本身是为了简化Spring应用的配置和部署&#xff0c;它内置了一些默认的配置和组件&#xff0c;帮助开发者快速启动应用&#xff0c…...

解决 MongoDB 查询中的 `InvalidMongoDbApiUsageException` 错误

您在使用 Spring Data MongoDB 时遇到了 InvalidMongoDbApiUsageException 异常&#xff0c;错误信息如下&#xff1a; “由于 com.mongodb.BasicDocument 的限制&#xff0c;您无法添加第二个 ‘null’ 条件。查询已经包含 ‘{ “KaTeX parse error: Expected }, got EOF at e…...

多模态知识图谱:重构大模型RAG效能新边界

当前企业级RAG&#xff08;Retrieval-Augmented Generation&#xff09;系统在非结构化数据处理中面临四大核心问题&#xff1a; 数据孤岛效应&#xff1a;异构数据源&#xff08;文档/表格/图像/视频&#xff09;独立存储&#xff0c;缺乏跨模态语义关联&#xff0c;导致知识检…...

基于大模型的贲门失弛缓症手术全流程风险预测与治疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与技术路线 二、贲门失弛缓症概述 2.1 定义与发病机制 2.2 临床表现与诊断标准 2.3 治疗现状与挑战 三、大模型预测原理与数据基础 3.1 大模型介绍与选择依据 3.2 数据收集与预处理 3.3 模型训…...

C语言内存函数

1.memcpy函数 1.1:memcpy函数的介绍 1.2:模拟实现memcpy函数 我实现的memcpy函数无法处理两块重叠的内存的数据的拷贝 #include<assert.h> void* my_memcpy(void* dest, const void* src,size_t num) {assert(dest ! NULL && src ! NULL);//从src指向的内存位…...

Uniapp:navigator(页面跳转)

目录 一、基本概述二、属性说明三、具体使用 一、基本概述 页面跳转。该组件类似HTML中的<a>组件&#xff0c;但只能跳转本地页面。目标页面必须在pages.json中注册。 二、属性说明 属性名类型默认值说明平台差异说明urlString应用内的跳转链接&#xff0c;值为相对路…...

建造者模式详解及其在自动驾驶场景的应用举例(以C++代码实现)

模式定义 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;用于分步构造复杂对象。该模式将对象构建过程与其表示分离&#xff0c;支持通过相同构建过程生成不同表现形式&#xff0c;特别适合需要灵活配置的自动驾驶车辆系统搭建场景。 自…...

2025年数字媒体设计与文化交流国际会议 (DMACE 2025)

2025 International Conference on Digital Media Art and Cultural Exchange 【一】、大会信息 会议简称&#xff1a;DMACE 2025 大会地点&#xff1a;中国烟台 收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等 【二】会议…...

【MCP Node.js SDK 全栈进阶指南】利用TypeScript-SDK打造高效MCP应用

前言 在MCP(模型上下文协议)的世界中,SDK(软件开发工具包)是开发者构建应用的重要工具。作为MCP生态中最活跃的SDK之一,TypeScript-SDK提供了简洁而强大的接口,帮助开发者快速构建高效的MCP应用。本文将带你深入了解MCP的TypeScript-SDK,掌握其核心概念和使用方法,让…...

LangChain4j 搭配 Kotlin:以协程、流式交互赋能语言模型开发

Kotlin 支持 | LangChain4j Kotlin 是一种面向 JVM&#xff08;及其他平台&#xff09;的静态类型语言&#xff0c;能够实现简洁优雅的代码&#xff0c;并与 Java 库无缝互操作。 LangChain4j 利用 Kotlin 扩展和类型安全构建器来增强 Java API&#xff0c;为其增添特定于 Ko…...

搜索引擎的高级语法

文章目录 精确搜索&#xff1a;双引号站内搜索&#xff1a;site通配符搜索&#xff1a;*减号缩小范围&#xff1a;-文档搜索&#xff1a;filetypeURL搜索&#xff1a; inurl标题搜索&#xff1a;intitle正文搜索&#xff1a;intext参考链接 精确搜索&#xff1a;双引号 “ ” …...

探秘 SenseGlove Nova 2力反馈手套,解锁 VR 键盘交互新方式

在虚拟现实&#xff08;VR&#xff09;技术不断发展的现今&#xff0c;键盘交互体验的优化成为众多科研人员关注的重点。今天&#xff0c;让我们一同走进 Heilbronn 大学与 SenseGlove 的合作项目&#xff0c;探寻 SenseGlove Nova 2 力反馈手套为 VR 环境中的键盘交互带来的新…...

品牌如何通过朝日新闻出海日本?——某企业日本媒体发稿实战

文 | 言同数字亚太传播实验室 一、日本市场的隐形门槛&#xff1a;中国品牌的三大痛点 案例背景&#xff1a; 某中国灵芝保健品企业&#xff08;代号"ForestLife"&#xff09;&#xff0c;产品虽获中国/欧盟有机认证&#xff0c;但在日本市场面临&#xff1a; 认知…...