Circle line-segment collision detection algorithm?

前端 未结 28 1813
被撕碎了的回忆
被撕碎了的回忆 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 06:58

    I have created this function for iOS following the answer given by chmike

    + (NSArray *)intersectionPointsOfCircleWithCenter:(CGPoint)center withRadius:(float)radius toLinePoint1:(CGPoint)p1 andLinePoint2:(CGPoint)p2
    {
        NSMutableArray *intersectionPoints = [NSMutableArray array];
    
        float Ax = p1.x;
        float Ay = p1.y;
        float Bx = p2.x;
        float By = p2.y;
        float Cx = center.x;
        float Cy = center.y;
        float R = radius;
    
    
        // compute the euclidean distance between A and B
        float LAB = sqrt( pow(Bx-Ax, 2)+pow(By-Ay, 2) );
    
        // compute the direction vector D from A to B
        float Dx = (Bx-Ax)/LAB;
        float Dy = (By-Ay)/LAB;
    
        // Now the line equation is x = Dx*t + Ax, y = Dy*t + Ay with 0 <= t <= 1.
    
        // compute the value t of the closest point to the circle center (Cx, Cy)
        float t = Dx*(Cx-Ax) + Dy*(Cy-Ay);
    
        // This is the projection of C on the line from A to B.
    
        // compute the coordinates of the point E on line and closest to C
        float Ex = t*Dx+Ax;
        float Ey = t*Dy+Ay;
    
        // compute the euclidean distance from E to C
        float LEC = sqrt( pow(Ex-Cx, 2)+ pow(Ey-Cy, 2) );
    
        // test if the line intersects the circle
        if( LEC < R )
        {
            // compute distance from t to circle intersection point
            float dt = sqrt( pow(R, 2) - pow(LEC,2) );
    
            // compute first intersection point
            float Fx = (t-dt)*Dx + Ax;
            float Fy = (t-dt)*Dy + Ay;
    
            // compute second intersection point
            float Gx = (t+dt)*Dx + Ax;
            float Gy = (t+dt)*Dy + Ay;
    
            [intersectionPoints addObject:[NSValue valueWithCGPoint:CGPointMake(Fx, Fy)]];
            [intersectionPoints addObject:[NSValue valueWithCGPoint:CGPointMake(Gx, Gy)]];
        }
    
        // else test if the line is tangent to circle
        else if( LEC == R ) {
            // tangent point to circle is E
            [intersectionPoints addObject:[NSValue valueWithCGPoint:CGPointMake(Ex, Ey)]];
        }
        else {
            // line doesn't touch circle
        }
    
        return intersectionPoints;
    }
    

提交回复
热议问题