碰撞检测算法:点和矩形碰撞、点和圆形碰撞、矩形碰撞、圆形碰撞

点和矩形碰撞

[java]  view plain  copy
  1. /** 
  2.      *  
  3.      * @param x1 点 
  4.      * @param y1 点 
  5.      * @param x2 矩形view x 
  6.      * @param y2 矩形view y 
  7.      * @param w  矩形view 宽 
  8.      * @param h  矩形view 高 
  9.      * @return 
  10.      */  
  11.     public static boolean isCollision(int x1, int y1, int x2, int y2, int w, int h) {  
  12.         if (x1 >= x2 && x1 <= x2 + w && y1 >= y2 && y1 <= y2 + h) {  
  13.             return true;  
  14.         }   
  15.         return false;  
  16.     }  

矩形碰撞

[java]  view plain  copy
  1. /** 
  2.      * 检测两个矩形是否碰撞 
  3.      * @return 
  4.      */  
  5.     public boolean isCollisionWithRect(int x1, int y1, int w1, int h1,   
  6.             int x2,int y2, int w2, int h2) {  
  7.         if (x1 >= x2 && x1 >= x2 + w2) {  
  8.             return false;  
  9.         } else if (x1 <= x2 && x1 + w1 <= x2) {  
  10.             return false;  
  11.         } else if (y1 >= y2 && y1 >= y2 + h2) {  
  12.             return false;  
  13.         } else if (y1 <= y2 && y1 + h1 <= y2) {  
  14.             return false;  
  15.         }  
  16.         return true;  
  17.     }  

点(x1,x2) , 圆心(x2,y2) ,半径r

[java]  view plain  copy
  1. if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) <= r) {  
  2.             // 如果点和圆心距离小于或等于半径则认为发生碰撞  
  3.             return true;  
  4.         }  

圆和圆

[java]  view plain  copy
  1. /** 
  2.      * 圆形碰撞 
  3.      *  
  4.      * @param x1 
  5.      *            圆形1的圆心X坐标 
  6.      * @param y1 
  7.      *            圆形2的圆心X坐标 
  8.      * @param x2 
  9.      *            圆形1的圆心Y坐标 
  10.      * @param y2 
  11.      *            圆形2的圆心Y坐标 
  12.      * @param r1 
  13.      *            圆形1的半径 
  14.      * @param r2 
  15.      *            圆形2的半径 
  16.      * @return 
  17.      */  
  18.     private boolean isCollisionWithCircle(int x1, int y1, int x2, int y2,  
  19.             int r1, int r2) {  
  20.         // Math.sqrt:开平方  
  21.         // Math.pow(double x, double y): X的Y次方  
  22.         //直角坐标系,依点1和点2做平行线,|x1-x2|为横向直角边,|y1-y2|为纵向直角边 依勾股定理 c^2=a^2+b^2  
  23.         if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) <= r1 + r2) {  
  24.             // 如果两圆的圆心距小于或等于两圆半径和则认为发生碰撞  
  25.             return true;  
  26.         }  
  27.         return false;  
  28.     }  

猜你喜欢

转载自blog.csdn.net/a133900029/article/details/80502275