Projection of a point on line defined by 2 points

后端 未结 3 1456
逝去的感伤
逝去的感伤 2021-01-12 10:06

I have been trying to figure this out for sometime now..

The problem to solve..

Say I have 3 Points..

P1 ---------- P2, and P3 can be anywhe         


        
3条回答
  •  日久生厌
    2021-01-12 10:33

    Here's some javascript code we've used here at work (a GIS company) to figure out the closest point on a line the mouse is next to in a situation where a user wants to split the line by adding a vertex to it. Should be easy to move over to C#:

    function _pointOnLine(line1, line2, pt) {
        var isValid = false;
    
        var r = new Microsoft.Maps.Location(0, 0);
        if (line1.latitude == line2.latitude && line1.longitude == line2.longitude) line1.latitude -= 0.00001;
    
        var U = ((pt.latitude - line1.latitude) * (line2.latitude - line1.latitude)) + ((pt.longitude - line1.longitude) * (line2.longitude - line1.longitude));
    
        var Udenom = Math.pow(line2.latitude - line1.latitude, 2) + Math.pow(line2.longitude - line1.longitude, 2);
    
        U /= Udenom;
    
        r.latitude = line1.latitude + (U * (line2.latitude - line1.latitude));
        r.longitude = line1.longitude + (U * (line2.longitude - line1.longitude));
    
        var minx, maxx, miny, maxy;
    
        minx = Math.min(line1.latitude, line2.latitude);
        maxx = Math.max(line1.latitude, line2.latitude);
    
        miny = Math.min(line1.longitude, line2.longitude);
        maxy = Math.max(line1.longitude, line2.longitude);
    
        isValid = (r.latitude >= minx && r.latitude <= maxx) && (r.longitude >= miny && r.longitude <= maxy);
    
        return isValid ? r : null;
    }
    

    line1 is a point with a latitude and longitude to represent one of the endpoints of the line, equivalent to your P1. line2 is the other endpoint: P2. pt is your P3. This will return the point on the line that P3 is perpendicular through. If P3 is past either end of the line, this will return null which means that one of the two end points is the closest point to P3.

    For clarity:

    enter image description here

提交回复
热议问题