简易碰撞检测算法

439 阅读1分钟

碰撞检测算法

点和矩形碰撞

//java
/** 
     *  
     * @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;
     }  

矩形碰撞

//java
    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 
     */
    public boolean isCollisionWithCircle(int x1, int y1, int x2, int y2, int r1, int r2) {
        // 直角坐标系,点1和点2做平行线, | x1 - x2 | 为横向直角边,|y1 - y2|为纵向直角边 根据勾股定理 c^2 = a^2 + b^2
        if (Math.sqrt(Math.pow(x1 - x2, 2)) <= r1 + r2) {
            return true;
        }
        return false;
    }