You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何理解JS碰撞检测函数中的crossHeight、crossWidth及计算逻辑?

矩形碰撞检测函数中crossWidth与crossHeight的含义解析

先明确函数里的核心变量定义:

  • dx:矩形r1中心与r2中心的x轴距离(r1中心x坐标 - r2中心x坐标)
  • dy:矩形r1中心与r2中心的y轴距离(r1中心y坐标 - r2中心y坐标)
  • width:两个矩形的半宽之和((r1宽度 + r2宽度)/2)
  • height:两个矩形的半高之和((r1高度 + r2高度)/2)

1. crossWidth和crossHeight的作用

这两个变量是判断碰撞发生在矩形哪一条边的核心依据,本质是通过交叉乘积的方式,把x、y两个维度的距离与尺寸转化为可直接比较的数值,从而判断哪个方向的碰撞优先级更高。

2. 为什么crossWidth是width * dy而非width * dx?

这里的命名容易造成误导,别被Width/Height的字面意思绑定到x/y维度。

函数里的crossWidth = width * dy、crossHeight = height * dx,其实是在做相对侵入比例的等价比较:
把两个式子做比值转换,crossWidth > crossHeight等价于 width*dy > height*dx,进一步变形就是 dy/height > dx/width。
这个比值的意义是:比较y方向上的中心距占半高之和的比例,与x方向上的中心距占半宽之和的比例——哪个比例更大,就说明哪个方向的碰撞更“突出”,优先判断该方向的碰撞边(比如y方向比例大,就判断是top或bottom;x方向比例大,就判断是left或right)。

如果换成width * dx,就失去了这种“跨维度比例比较”的作用,无法区分碰撞发生的具体边。

具体碰撞判断逻辑

当两个矩形确实发生碰撞(Math.abs(dx)<=width && Math.abs(dy)<=height):

  • 若crossWidth > crossHeight:说明y方向的相对侵入更明显,再通过crossWidth > -crossHeight判断是bottom还是left
  • 若crossWidth <= crossHeight:说明x方向的相对侵入更明显,再通过crossWidth > -crossHeight判断是right还是top

内容的提问来源于stack exchange,提问作者rtotalminer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:07:17