欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

javascript函数判断圆与矩形是否碰撞

程序员文章站 2022-03-13 13:41:23
...

代入初始坐标,返回碰撞结果

//计算两点间距离函数 (下面将用到)
function distance_between_two_points_square(a,b,x,y){
    distance=(x-a)*(x-a)+(y-b)*(y-b);
    return distance;
}
//判断圆与矩形是否碰撞函数,代入值 圆的x坐标,圆的y坐标, 圆半径, 矩形左上顶点x坐标,矩形左上顶点y坐标,矩形宽度, 矩形高度 
function circle_and_rect_collision(circle_x,circle_y,circle_r,rect_x,rect_y,width,height){
    if(circle_x>rect_x-circle_r && circle_x<rect_x+width+circle_r && circle_y>rect_y-circle_r && circle_y<rect_y+height+circle_r){
        if(circle_x>rect_x&&circle_x<rect_x+width&&circle_y>rect_y&&circle_y<rect_y+height){
            return 'inside';//圆心在矩形内
        }    
        else if(circle_x>=rect_x&&circle_x<=rect_x+width){
            if(circle_y<=rect_y){
                return 'up';//碰撞且圆心在矩形正上方
            }
            else{
                return 'down';//碰撞且圆心在矩形正下方
            }
        }
        else if(circle_y>=rect_y&&circle_y<=rect_y+height){
            if(circle_x<=rect_x){
                return 'left';//碰撞且圆心在矩形正左方
            }
            else{
                return 'right';//碰撞且圆心在矩形正右方
            }
        }
        
        else{
            if(circle_x<rect_x){
                if(circle_y<rect_y){
                    if(distance_between_two_points_square(circle_x,circle_y,rect_x,rect_y)<circle_r*circle_r){
                        return 'left_up_corner';//碰撞且圆心在矩形左上角
                    }
                    else{
                        return false;//未碰撞
                    }
                }
                else{
                    if(distance_between_two_points_square(circle_x,circle_y,rect_x,rect_y+height)<circle_r*circle_r){
                        return 'left_down_corner';//碰撞且圆心在矩形左下角
                    }
                    else{
                        return false;//未碰撞
                    }
                }
            }
            else {
                if(circle_y<rect_y){
                   if(distance_between_two_points_square(circle_x,circle_y,rect_x+width,rect_y)<circle_r*circle_r){
                        return 'right_up_corner';//碰撞且圆心在矩形右上角
                    } 
                   else{
                       return false;//未碰撞
                   }
                }
                else{
                    if(distance_between_two_points_square(circle_x,circle_y,rect_x+width,rect_y+height)<circle_r*circle_r){
                        return 'right_down_corner';//碰撞且圆心在矩形右下角
                    }
                    else{
                        return false;//未碰撞
                    }
                }
                    
                }
            }
            
    }
    else{
        return false;//未碰撞
    }
}