Circle line-segment collision detection algorithm?

前端 未结 28 1815
被撕碎了的回忆
被撕碎了的回忆 2020-11-22 06:38

I have a line from A to B and a circle positioned at C with the radius R.

\"Image\"

What is a good alg

28条回答
  •  别那么骄傲
    2020-11-22 07:18

    Weirdly I can answer but not comment... I liked Multitaskpro's approach of shifting everything to make the centre of the circle fall on the origin. Unfortunately there are two problems in his code. First in the under-the-square-root part you need to remove the double power. So not:

    var underRadical = Math.pow((Math.pow(r,2)*(Math.pow(m,2)+1)),2)-Math.pow(b,2));

    but:

    var underRadical = Math.pow(r,2)*(Math.pow(m,2)+1)) - Math.pow(b,2);

    In the final coordinates he forgets to shift the solution back. So not:

    var i1 = {x:t1,y:m*t1+b}

    but:

    var i1 = {x:t1+c.x, y:m*t1+b+c.y};

    The whole function then becomes:

    function interceptOnCircle(p1, p2, c, r) {
        //p1 is the first line point
        //p2 is the second line point
        //c is the circle's center
        //r is the circle's radius
    
        var p3 = {x:p1.x - c.x, y:p1.y - c.y}; //shifted line points
        var p4 = {x:p2.x - c.x, y:p2.y - c.y};
    
        var m = (p4.y - p3.y) / (p4.x - p3.x); //slope of the line
        var b = p3.y - m * p3.x; //y-intercept of line
    
        var underRadical = Math.pow(r,2)*Math.pow(m,2) + Math.pow(r,2) - Math.pow(b,2); //the value under the square root sign 
    
        if (underRadical < 0) {
            //line completely missed
            return false;
        } else {
            var t1 = (-m*b + Math.sqrt(underRadical))/(Math.pow(m,2) + 1); //one of the intercept x's
            var t2 = (-m*b - Math.sqrt(underRadical))/(Math.pow(m,2) + 1); //other intercept's x
            var i1 = {x:t1+c.x, y:m*t1+b+c.y}; //intercept point 1
            var i2 = {x:t2+c.x, y:m*t2+b+c.y}; //intercept point 2
            return [i1, i2];
        }
    }
    

提交回复
热议问题