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

http://blog.csdn.net/shineflowers/article/details/41084329

点和矩形碰撞

/** 
     *  
     * @param x1 点 
     * @param y1 点 
     * @param x2 矩形view x 
     * @param y2 矩形view y 
     * @param w  矩形view 宽 
     * @param h  矩形view 高 
     * @return 
     */  
    public static boolean isCollision(int x1, int y1, int x2, int y2, int w, int h) {  
        if (x1 >= x2 && x1 <= x2 + w && y1 >= y2 && y1 <= y2 + h) {  
            return true;  
        }   
        return false;  
    }  

矩形碰撞

/** 
     * 检测两个矩形是否碰撞 
     * @return 
     */  
    public boolean isCollisionWithRect(int x1, int y1, int w1, int h1,   
            int x2,int y2, int w2, int h2) {  
        if (x1 >= x2 && x1 >= x2 + w2) {  
            return false;  
        } else if (x1 <= x2 && x1 + w1 <= x2) {  
            return false;  
        } else if (y1 >= y2 && y1 >= y2 + h2) {  
            return false;  
        } else if (y1 <= y2 && y1 + h1 <= y2) {  
            return false;  
        }  
        return true;  
    }  

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

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

圆和圆

/** 
     * 圆形碰撞 
     *  
     * @param x1 
     *            圆形1的圆心X坐标 
     * @param y1 
     *            圆形2的圆心X坐标 
     * @param x2 
     *            圆形1的圆心Y坐标 
     * @param y2 
     *            圆形2的圆心Y坐标 
     * @param r1 
     *            圆形1的半径 
     * @param r2 
     *            圆形2的半径 
     * @return 
     */  
    private boolean isCollisionWithCircle(int x1, int y1, int x2, int y2,  
            int r1, int r2) {  
        // Math.sqrt:开平方  
        // Math.pow(double x, double y): X的Y次方  
        //直角坐标系,依点1和点2做平行线,|x1-x2|为横向直角边,|y1-y2|为纵向直角边 依勾股定理 c^2=a^2+b^2  
        if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) <= r1 + r2) {  
            // 如果两圆的圆心距小于或等于两圆半径和则认为发生碰撞  
            return true;  
        }  
        return false;  
    }  





  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值