Projection of a point on line defined by 2 points

后端 未结 3 1467
逝去的感伤
逝去的感伤 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:27

    This is an old question and I found the Corey Ogburn solution quite useful. But I thought it might be helpful for others to post a less "map" version of the javascript code - which I used in canvas drawing.

    export const pointOnLine = (p0, p1, q) => {
    
      // p0 and p1 define the line segment
      // q is the reference point (aka mouse)
      // returns point on the line closest to px
    
      if (p0.x == p1.x && p0.y == p1.y) p0.x -= 0.00001;
    
      const Unumer = ((q.x - p0.x) * (p1.x - p0.x)) + ((q.y - p0.y) * (p1.y - p0.y));
      const Udenom = Math.pow(p1.x - p0.x, 2) + Math.pow(p1.y - p0.y, 2);
      const U = Unumer / Udenom;
    
      const r = {
        x: p0.x + (U * (p1.x - p0.x)),
        y: p0.y + (U * (p1.y - p0.y))
      }
    
      const minx = Math.min(p0.x, p1.x);
      const maxx = Math.max(p0.x, p1.x);
      const miny = Math.min(p0.y, p1.y);
      const maxy = Math.max(p0.y, p1.y);
    
      const isValid = (r.x >= minx && r.x <= maxx) && (r.y >= miny && r.y <= maxy);
    
      return isValid ? r : null;
    }
    

提交回复
热议问题