我需要编写一个函数(使用Javascript),该函数接受线段的端点和一个附加点,并返回该点相对于起点的坐标。因此,根据这张图片:

javascript - 相对于线段平移坐标-LMLPHP

function perpendicular_coords(x1,y1, x2,y2, xp,yp)


返回[xp',yp'],其中xp'是沿垂直于线段的直线到(xp,yp)的距离,而yp'是从(x1,y1)到垂直线与线段相交的点的距离。

到目前为止,我已经尝试过:

function rotateRad(cx, cy, x, y, radians) {
    var cos = Math.cos(radians),
        sin = Math.sin(radians),
        nx = (cos * (x - cx)) + (sin * (y - cy)) + cx,
        ny = (cos * (y - cy)) - (sin * (x - cx)) + cy;
    return [nx, ny];
}

[xp', yp'] = rotateRad(x1,y1, xp, yp, Math.atan2(y2-y1,x2-x1));


我没有写函数;从https://stackoverflow.com/a/17411276/1368860获得

最佳答案

通过结合两个功能,我采取了另一种方法:


为了得到yp',我使用以下答案找到交点:Perpendicular on a line from a given point
为了得到xp',我使用以下公式计算(xp,yp)与线之间的距离:https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line


这不是最优雅的解决方案,但似乎可行。

结果代码https://jsfiddle.net/qke0m4mb/

function perpendicular_coords(x1, y1, x2, y2, xp, yp) {
  var dx = x2 - x1,
      dy = y2 - y1;

  //find intersection point
  var k = (dy * (xp-x1) - dx * (yp-y1)) / (dy*dy + dx*dx);
  var x4 = xp - k * dy;
  var y4 = yp + k * dx;

  var ypt = Math.sqrt((y4-y1)*(y4-y1)+(x4-x1)*(x4-x1));
  var xpt = distance(x1, y1, x2, y2, xp, yp);
  return [xpt, ypt];
}

// Distance of point from line
function distance(x1, y1, x2, y2, xp, yp) {
  var dx = x2 - x1;
  var dy = y2 - y1;

  return Math.abs(dy*xp - dx*yp + x2*y1 - y2*x1) / Math.sqrt(dy*dy + dx*dx);
}

10-08 03:49