get closest point to a line

后端 未结 12 1992
逝去的感伤
逝去的感伤 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:08

    The answer from Justin L. is almost fine, but it doesn't check if the normalized distance is less than 0, or higher than the AB vector magnitude. Then it won't work well when P vector proyection is out of bounds (from the line segment AB). Here's the corrected pseudocode:

        function GetClosestPoint(A, B, P)
    {
      vectorAP = (p.x - a.x, p.y - a.y)     //Vector from A to P
      vectorAB = (b.x - a.x, b.y - a.y)     //Vector from A to B
    
      magnitudeAB = vectorAB[0]^2 + vectorAB[1]^2  
      //Magnitude of AB vector (it's length)
    
    
      ABAPproduct = vectorAB[0]*vectorAP[0] + vectorAB[1]*vectorAP[1] 
      //The product of a_to_p and a_to_b
    
    
      distance = ABAPproduct / magnitudeAB       
      //The normalized "distance" from a to your closest point
    
      if ( distance < 0)     //Check if P projection is over vectorAB
        {
            returnPoint.x = a.x
            returnPoint.y = a.y
        }   
      else if (distance > magnitudeAB)
        {
            returnPoint.x = b.x
            returnPoint.y = b.y
        }
      else
        {
            returnPoint.x = a.x + vectorAB[0]*distance
            returnPoint.y = a.y + vectorAB[1]*distance
        }
    
    }
    

提交回复
热议问题