zoukankan      html  css  js  c++  java
  • 碰撞检测 :Rectangle

    目录

    引子

    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; // 没有碰撞
      }
    }
    

    参考资料

  • 相关阅读:
    ylbtech-dbs-m-YinTai(银泰网)
    ylbtech-memorandum(备忘录)-数据库设计
    设计工作-Axure
    RegexHelper
    convert image to base64
    MVC Movie App
    ASP.NET MVC file download sample
    MVC架构、WebForm与MVC对比
    第2章 数字之魅——子数组之和的最大值(二维)
    第2章 数字之魅——求数组的子数组之和的最大值
  • 原文地址:https://www.cnblogs.com/thyshare/p/13625237.html
Copyright © 2011-2022 走看看