cocos2d-x JS 各类点、圆、矩形之间的简单碰撞检测

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

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

点和圆的碰撞检测:

1.计算点和圆心的距离

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


[javascript] view plain copy
 
  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

[javascript] view plain copy
 
  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.判断两圆心之间的距离是否小于两圆的半径之和

[javascript] view plain copy
 
  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坐标的距离是否小于两个矩形高度一半之和

[javascript] view plain copy
 
  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. }  

圆和矩形的碰撞检测:

[javascript] view plain copy
 
  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://www.cnblogs.com/luorende/p/8806841.html