get closest point to a line

后端 未结 12 1989
逝去的感伤
逝去的感伤 2020-11-28 04:45

I\'d like to have a straight forward C# function to get a closest point (from a point P) to a line-segment, AB. An abstract function may look like this. I\'ve search through

12条回答
  •  情歌与酒
    2020-11-28 05:03

    I wrote this a long time ago, it's not much different to what others have said, but it's a copy/paste solution in C# if you have a class (or struct) named PointF with members X and Y:

    private static PointF ClosestPointToSegment(PointF P, PointF A, PointF B)
    {
        PointF a_to_p = new PointF(), a_to_b = new PointF();
        a_to_p.X = P.X - A.X;
        a_to_p.Y = P.Y - A.Y; //     # Storing vector A->P  
        a_to_b.X = B.X - A.X;
        a_to_b.Y = B.Y - A.Y; //     # Storing vector A->B
    
        float atb2 = a_to_b.X * a_to_b.X + a_to_b.Y * a_to_b.Y;
        float atp_dot_atb = a_to_p.X * a_to_b.X + a_to_p.Y * a_to_b.Y; // The dot product of a_to_p and a_to_b
        float t = atp_dot_atb / atb2;  //  # The normalized "distance" from a to the closest point
        return new PointF(A.X + a_to_b.X * t, A.Y + a_to_b.Y * t);
    }
    

    Update: Looking at the comments it looks like I adapted it to C# from the same source code mentioned in the accepted answer.

提交回复
热议问题