目 录

  1. 前言
  2. 物理边界的数学本质
  3. 核心代码实现
  4. 圆/矩形重叠判定:基础几何算法
  5. 分离轴定理 (SAT):多边形碰撞的终极方案
  6. 鸿蒙交互优化:点击热区与手势冲突解决
  7. 碰撞检测逻辑流程图
  8. 常用碰撞算法对照表
  9. 鸿蒙实战:自适应多端交互的物理热区
  10. 总结

前言

在 HarmonyOS NEXT 的全场景交互中,用户不再仅仅通过点击(Tap)来操作应用,更多的是通过拖拽、流转以及在折叠屏上的多点触控。当你在鸿蒙平板上拖动一个悬浮窗,或者在跨端游戏中控制角色移动时,如何判定物体之间是否“触碰”到了?

几何碰撞检测(Collision Detection)是实现真实感交互的底层逻辑。它不仅仅服务于游戏,更是优化 UI 点击热区、处理复杂手势冲突的数学利器。本文将带你解析从基础的“圆矩判定”到进阶的“分离轴定理(SAT)”,学习如何为鸿蒙应用构建严密的物理边界。


在这里插入图片描述

物理边界的数学本质

碰撞检测的本质是判断两个几何集合的交集是否为空。在二维平面内,物体通常被简化为包围盒:

  • AABB (Axis-Aligned Bounding Box):轴对齐包围矩形。
  • Circle:圆形包围盒。
  • OBB (Oriented Bounding Box):带旋转的角度包围盒。

3. 核心代码实现

在 Flutter 中,我们可以直接利用 Rect 类提供的基础判定,或者手动编写更高阶的几何算法。

3.1 基础 AABB 判定

Rect a = const Rect.fromLTWH(0, 0, 100, 100);
Rect b = const Rect.fromLTWH(50, 50, 100, 100);

// 判定两个矩形是否相交
bool isOverlap = a.overlaps(b);

3.2 圆形与矩形碰撞判定

bool checkCircleRectCollision(Offset circleCenter, double radius, Rect rect) {
  // 1. 寻找矩形上离圆心最近的点
  double closestX = circleCenter.dx.clamp(rect.left, rect.right);
  double closestY = circleCenter.dy.clamp(rect.top, rect.bottom);

  // 2. 计算圆心与该点的距离
  double distanceX = circleCenter.dx - closestX;
  double distanceY = circleCenter.dy - closestY;

  // 3. 勾股定理:距离平方是否小于半径平方
  return (distanceX * distanceX) + (distanceY * distanceY) < (radius * radius);
}

4. 圆/矩形重叠判定:基础几何算法

在鸿蒙系统常见的“气泡弹窗”或“悬浮球”交互中,圆形与矩形的碰撞最为常见。

  • 算法精髓:利用 clamp 函数锁定最近点。如果圆心到矩形边缘的距离小于半径,则判定为接触。这种算法性能极高,适合在 PointerMove 这种高频触发的回调中使用。

5. 分离轴定理 (SAT):多边形碰撞的终极方案

当涉及到旋转的组件(如 Matrix4 变换后的卡片)时,简单的 AABB 判定会失效。此时需要引入 分离轴定理 (Separating Axis Theorem)

数学原理:如果两个凸多边形不相交,那么一定存在一条直线,使得两个多边形在该直线上的投影不重叠。

  • 应用场景:跨端游戏开发、带旋转角度的 UI 组件库设计。
  • 计算步骤:检查每个多边形每一条边的法向量(投影轴),如果在任何一个轴上投影不重叠,则说明未碰撞。

6. 鸿蒙交互优化:点击热区与手势冲突解决

鸿蒙系统鼓励“精致”的手感。利用数学碰撞逻辑,我们可以实现:

  1. 不规则热区:例如圆形图标的点击判定,不应使用矩形范围,而应使用 (x-x0)^2 + (y-y0)^2 < r^2
  2. 手势吸附:当用户拖动元素靠近目标区域时,利用碰撞预测算法实现自动“吸附”效果。
  3. 冲突过滤:在折叠屏分栏状态下,通过判定坐标点是否在特定 RenderBox 的碰撞边界内,精确分发事件。

7. 碰撞检测逻辑流程图

矩形-矩形

圆形-矩形

复杂/旋转多边形

获取物体 A, B 实时坐标

包围盒类型?

AABB 快速判定

最近点 Clamp 算法

分离轴定理 SAT 投射

是否相交?

触发碰撞回调/物理反馈

保持自由运动


8. 常用碰撞算法对照表

算法名称 适用几何体 复杂度 性能开销 典型场景
AABB 非旋转矩形 O ( 1 ) O(1) O(1) 极低 列表项点击、基础布局
Distance 两个圆形 O ( 1 ) O(1) O(1) 极低 摇杆控制、粒子碰撞
Clamp-Point 圆形与矩形 O ( 1 ) O(1) O(1) 悬浮球贴边、进度条手势
SAT 任意凸多边形 O ( n + m ) O(n+m) O(n+m) 旋转卡片、策略类游戏

9. 鸿蒙实战:自适应多端交互的物理热区

在开发高性能交互组件时,我们可以封装一个碰撞检测器:

// 模拟鸿蒙桌面图标的物理吸附判定
void onIconDragged(Offset currentPos, List<Rect> slots) {
  for (var slot in slots) {
    // 增加一点“感知余量”,让吸附更灵敏
    if (slot.inflate(10.0).contains(currentPos)) {
       triggerHapticFeedback(); // 触发鸿蒙系统线性马达震动
       snapToPosition(slot.center);
       break;
    }
  }
}

10. 总结

几何碰撞检测是连接虚拟代码与物理现实的桥梁。在 HarmonyOS NEXT 的全场景开发中,利用数学逻辑构建严密的物理边界,能让应用的操作体验从“机械点击”升华为“真实触碰”。每一像素的精准判定,都是对用户操作的尊重。

记住,UI 的边界不仅仅是视觉上的线条,更是数学上的严密逻辑。在掌握了碰撞检测的秘籍后,下一篇我们将迎来数学专题的最终章——数据映射与归一化:构建高性能鸿蒙自定义图表

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐