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