Collision detection between a line and a circle in JavaScript

前端 未结 4 1571
故里飘歌
故里飘歌 2020-12-06 18:57

I\'m looking for a definitive answer, maybe a function cos I\'m slow, that will determine if a line segment and circle have collided, in javascript (working with canvas)

4条回答
  •  有刺的猬
    2020-12-06 19:33

    I Spent about a day and a half to make it perfect.. Hope this helps.

    function collisionCircleLine(circle,line){ // Both are objects
    
        var side1 = Math.sqrt(Math.pow(circle.x - line.p1.x,2) + Math.pow(circle.y - line.p1.y,2)); // Thats the pythagoras theoram If I can spell it right
    
        var side2 = Math.sqrt(Math.pow(circle.x - line.p2.x,2) + Math.pow(circle.y - line.p2.y,2));
    
        var base = Math.sqrt(Math.pow(line.p2.x - line.p1.x,2) + Math.pow(line.p2.y - line.p1.y,2));
    
        if(circle.radius > side1 || circle.radius > side2)
            return true;
    
        var angle1 = Math.atan2( line.p2.x - line.p1.x, line.p2.y - line.p1.y ) - Math.atan2( circle.x - line.p1.x, circle.y - line.p1.y ); // Some complicated Math
    
        var angle2 = Math.atan2( line.p1.x - line.p2.x, line.p1.y - line.p2.y ) - Math.atan2( circle.x - line.p2.x, circle.y - line.p2.y ); // Some complicated Math again
    
        if(angle1 > Math.PI / 2 || angle2 > Math.PI / 2) // Making sure if any angle is an obtuse one and Math.PI / 2 = 90 deg
            return false;
    
    
            // Now if none are true then
    
            var semiperimeter = (side1 + side2 + base) / 2;
    
            var areaOfTriangle = Math.sqrt( semiperimeter * (semiperimeter - side1) * (semiperimeter - side2) * (semiperimeter - base) ); // Heron's formula for the area
    
            var height = 2*areaOfTriangle/base;
    
            if( height < circle.radius )
                return true;
            else
                return false;
    
    }
    

    And that is how you do it..

提交回复
热议问题