zoukankan      html  css  js  c++  java
  • 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. }  

    源码下载:点击打开链接

  • 相关阅读:
    数学之美系列十八 矩阵运算和文本处理中的分类问题
    数学之美系列一 统计语言模型
    数学之美系列十三 信息指纹及其应用
    数学之美系列十六 谈谈最大熵模型
    数学之美系列十五 繁与简 自然语言处理的几位精英
    数学之美系列十七 谈谈搜索引擎作弊问题(Search Engine AntiSPAM)
    数学之美系列三 隐含马尔可夫模型在语言处理中的应用
    数学之美系列十四 谈谈数学模型的重要性
    数学之美系列十二 余弦定理和新闻的分类
    数学之美系列十一 Google 阿卡 47 的制造者阿米特.辛格博士
  • 原文地址:https://www.cnblogs.com/luorende/p/8806841.html
Copyright © 2011-2022 走看看