当前位置 博文首页 > 文章内容

    碰撞检测 :Rectangle

    作者: 栏目:未分类 时间:2020-09-07 10:01:24

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    目录

    引子

    Collision Detection :Point 中主要介绍了点的碰撞检测,接着来看看矩形的情况。

    以下示例未做兼容性检查,建议在最新的 Chrome 浏览器中查看。

    Rectangle/Point

    这是示例页面

    绘制矩形可以通过四个点的坐标进行绘制,也可以通过一个顶点的坐标,结合矩形的宽高进行绘制:

    59-rect-bounding-box

    矩形与点的碰撞检测,只要点的坐标在矩形的坐标范围之内即可:

    /*
     * (px,py) 点的坐标
     * (rx,ry) 矩形顶点的坐标
     * rw 矩形的宽度
     * rh 矩形的高度
     */
    function checkRectanglePoint({px,py,rx,ry,rw,rh}) {
      const isTrue = px >= rx && // 左边界
                     px <= rx + rw && // 右边界
                     py >= ry && // 上边界
                     py <= ry + rh; // 下边界
      if (isTrue) {
        return true; // 发生碰撞
      } else {
        return false; // 没有碰撞
      }
    }
    

    Rectangle/Rectangle

    这是示例页面

    矩形与矩形的碰撞检测,看下面一张图:

    59-rect-rect

    通过观察可以得知,两个矩形发生碰撞,需要符合的条件是:

    /*
     * (r1x,r1y) 矩形1顶点的坐标
     * (r2x,r2y) 矩形2顶点的坐标
     * r1w r1h 矩形1的宽度和高度
     * r2w r2h 矩形2的宽度和高度
     */
    function checkRectangleRectangle({r1x,r1y,,r1w,r1h,r2x,r2y,r2w,r2h}) {
      const isTrue = r1x + r1w >= r2x && // 矩形 2 左边界
                     r1x <= r2x + r2w && // 矩形 2 右边界
                     r1y + r1h >= r2y && // 矩形 2 上边界
                     r1y <= r2y + r2h; // 矩形 2 下边界
      if (isTrue) {
        return true; // 发生碰撞
      } else {
        return false; // 没有碰撞
      }
    }
    

    Rectangle/Circle

    这是示例页面

    矩形与圆的碰撞检测,思路是:

    1. 首先要确定圆处于矩形那个边界;
    2. 然后在边界上确定与圆心距离最短的点;
    3. 最后使用勾股定理计算出距离,与圆心半径进行比较。
    /*
     * (cx,cy) 圆心的坐标
     * radius 圆的半径
     * (rx,ry) 矩形顶点的坐标
     * rw 矩形的宽度
     * rh 矩形的高度
     */
    function checkRectangleCircle({cx,cy,radius,rx,ry,rw,rh}) {
      let nearestX = cx,nearestY = cy; // 初始化边界上离圆心最近的点坐标
      if (cx < rx) {
        nearestX = rx;
      } else if (cx > rx + rw) {
        nearestX = rx + rw;
      }
      if (cy < ry) {
        nearestY = ry;
      } else if (cy > ry + rh) {
        nearestY = ry + rh;
      }
      const distX = cx-nearestX;
      const distY = cy-nearestY;
      const distance = Math.sqrt( (distX*distX) + (distY*distY) );
    
      if (distance <= radius) {
        return true; // 发生碰撞
      } else {
        return false; // 没有碰撞
      }
    }
    

    参考资料