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

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

(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

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

猜你喜欢

转载自www.cnblogs.com/wodehao0808/p/9445263.html