二维AABB box碰撞检测和优化

原文链接: 二维AABB box碰撞检测和优化

上一篇: 动态实时创建iframe, 实现类似sandbox的在线编程效果

下一篇: 如果我会说你好, 那么我还需要学习hello吗? ----碎碎念

同步和碰撞永远的神

确实好麻烦啊, ui写了半小时, 算法验证五分钟... 还好vue出活快... 看来需要快点熟悉cocos了

3d

https://www.cnblogs.com/lyggqm/p/5386174.html

https://blog.csdn.net/Windgs_YF/article/details/87884884

2d

https://zhuanlan.zhihu.com/p/163590893

效果

随机生成不同位置和大小的box,  任意拖动一个box, 在拖动的过程中检测是否和其他box相交

主要思想, 将二维AABB检测转换为两个矩形的各两条边的交叉问题

up-436dcf4fc9d535ec453307887a340bfd70e.png

由于一般情况下, 世界坐标系和元素坐标系都是直接按照像素来的, 所以我们可以通过简单的对比就能得到结果

网页中一般左上角为原点, x向右, y向下

核心代码


// 检查两条线段是否有交点
// 保证顺序 x1<=y1 x2<=y2
const checkLine = (aMin, aMax, bMin, bMax) => {
  if (aMax < bMin) return false
  if (aMin > bMax) return false
  return true
}

// 检查两个box是否相交
const checkBox = (box1, box2) => {
  return (
    checkLine(box1.x, box1.x + box1.width, box2.x, box2.x + box2.width) &&
    checkLine(box1.y, box1.y + box1.height, box2.y, box2.y + box2.height)
  )
}
/*
检查是否碰撞, 返回碰撞矩形的id
list中已经去除了 移动的box
*/
export const check = (item, list) => {
  const ans = []
  for (const box of list) {
    if (checkBox(item, box)) ans.push(box.id)
  }
  return ans
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值