• (转)点、圆、矩形之间的简单碰撞检测


    这里总结了一下点、圆、矩形之间的简单碰撞检测算法

    (ps:矩形不包括旋转状态)

    点和圆的碰撞检测:

    1.计算点和圆心的距离

    2.判断点与圆心的距离是否小于圆的半

    
    
    1.  
      isCollision: function(point, circle)
    2.  
      {
    3.  
      //点与圆心的距离
    4.  
      var distance = Math.sqrt(Math.pow(point.x - circle.x, 2) + Math.pow(point.y - circle.y, 2));
    5.  
       
    6.  
      //圆的半径
    7.  
      var radius = circle.getContentSize().width / 2;
    8.  
       
    9.  
      //如果点与圆心距离小于圆的半径,返回true
    10.  
      if(radius > distance)
    11.  
      {
    12.  
      return true;
    13.  
      }
    14.  
      else
    15.  
      {
    16.  
      return false;
    17.  
      }
    18.  
      }

    点和矩形的碰撞检测:
    1.获得矩形的左上角坐标p1和右下角坐标p2
    2.判断点p的x坐标是否大于p1的x坐标,并且小于p2的x坐标,并且p的y坐标大于p2的y坐标,并且小于p2

    1.  
      isCollision: function(point, rect)
    2.  
      {
    3.  
      //获得矩形的左上角坐标p1和右下角坐标p2
    4.  
      var p1 = cc.p(rect.x - rect.width/2, rect.y + rect.height/2);
    5.  
      var p2 = cc.p(rect.x + rect.width/2, rect.y - rect.height/2);
    6.  
       
    7.  
      //判断点p的x坐标是否大于p1的x坐标,并且小于p2的x坐标,并且p的y坐标大于p2的y坐标,并且小于p2的y坐标
    8.  
      if(point.x > p1.x && point.x < p2.x && point.y > p2.y && point.y < p1.y)
    9.  
      {
    10.  
      return true;
    11.  
      }
    12.  
      else
    13.  
      {
    14.  
      return false;
    15.  
      }
    16.  
      }

    圆和圆的碰撞检测:
    1.计算两圆心之间的距离
    2.判断两圆心之间的距离是否小于两圆的半径之和

    1.  
      isCollision: function(circle1, circle2)
    2.  
      {
    3.  
      //圆心与圆心的距离
    4.  
      var distance = Math.sqrt(Math.pow(circle1.x - circle2.x, 2) + Math.pow(circle1.y - circle2.y, 2));
    5.  
       
    6.  
      //圆心半径
    7.  
      var r1 = circle1.getContentSize().width / 2;
    8.  
      var r2 = circle2.getContentSize().width / 2;
    9.  
       
    10.  
      //如果圆心与圆心距离小于两圆的半径,返回true
    11.  
      if(r1 + r2 > distance)
    12.  
      {
    13.  
      return true;
    14.  
      }
    15.  
      else
    16.  
      {
    17.  
      return false;
    18.  
      }
    19.  
      }

    矩形和矩形的碰撞检测:

    在水平方向上,判断两个矩形中点x坐标的距离是否小于两个矩形宽度一半之和

    在垂直方向上,判断两个矩形中点y坐标的距离是否小于两个矩形高度一半之和

    1.  
      isCollision: function(rect1, rect2)
    2.  
      {
    3.  
      //获取矩形1的宽高
    4.  
      var width1 = rect1.width;
    5.  
      var height1 = rect1.height;
    6.  
       
    7.  
      //获取矩形2的宽高
    8.  
      var width2 = rect2.width;
    9.  
      var height2 = rect2.height;
    10.  
       
    11.  
      var flag;
    12.  
      if(rect1.x >= rect2.x && rect2.x <= rect1.x - width1/2 - width2/2)
    13.  
      {
    14.  
      flag = false;
    15.  
      }
    16.  
      else if(rect1.x <= rect2.x && rect2.x >= rect1.x + width1/2 + width2/2)
    17.  
      {
    18.  
      flag = false;
    19.  
      }
    20.  
      else if(rect1.y >= rect2.y && rect2.y <= rect1.y - height1/2 - height2/2)
    21.  
      {
    22.  
      flag = false;
    23.  
      }
    24.  
      else if(rect1.y <= rect2.y && rect2.y >= rect1.y + height1/2 + height2/2)
    25.  
      {
    26.  
      flag = false;
    27.  
      }
    28.  
      else
    29.  
      {
    30.  
      flag = true;
    31.  
      }
    32.  
      }

    圆和矩形的碰撞检测:

    1.  
      isCollision: function(circle, rect)
    2.  
      {
    3.  
      //圆的半径
    4.  
      var radius = circle.width / 2;
    5.  
       
    6.  
      //圆形中心与矩形中心的相对坐标
    7.  
      var x = circle.x - rect.x;
    8.  
      var y = circle.y - rect.y;
    9.  
       
    10.  
      var minX = Math.min(x, rect.width/2);
    11.  
      var maxX = Math.max(minX, -rect.width/2);
    12.  
      var minY = Math.min(y, rect.height/2);
    13.  
      var maxY = Math.max(minY, -rect.height/2);
    14.  
       
    15.  
      if((maxX - x) * (maxX - x) + (maxY - y) * (maxY - y) <= radius * radius)
    16.  
      {
    17.  
      return true;
    18.  
      }
    19.  
      else
    20.  
      {
    21.  
      return false;
    22.  
      }
    23.  
      }

    源码下载:点击打开链接

    原文地址:https://blog.csdn.net/u013455818/article/details/44682343

    这里少了:矩形如果角度发生改变时,应该怎么检测碰撞?

  • 相关阅读:
    初始nginx(启动运行) 使用nginx做一个简单的静态资源服务器
    redis总结问题
    reids高可用(灾难备份-持久化)
    mybatis中将0识别为null的解决方法
    Spring MVC 通过反射将数据导出到excel
    spring mvc 中Uploadify插件的使用
    java搭建 SpringMVC+Mybatis(SMM)+mybatis-generate
    让ecshop用户名、手机号、email登陆方法
    ecmobile实现支付宝支付和百度云推送遇到的问题及解决方案(android)
    Oracle分页总汇
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/9445263.html
Copyright © 2020-2023  润新知