js已知A,B两点坐标,在线段AB上有C点,已知AC的距离,求C点的坐标
/** * @param {Number} _x1 A点坐标 * @param {Number} _y1 A点坐标 * @param {Number} _x2 B点坐标 * @param {Number} _y2 B点坐标 * @param {Number} _distance AC距离 */ function getPoint(_x1, _y1, _x2, _y2, _distance) { let curPoint = { x: _x1, y: _y1 }; let nextPoint = { x: _x2, y: _y2 }; let L = _distance; //距离顶点的距离 // 第一步:求得直线方程相关参数y=kx+b let k = (curPoint.y - nextPoint.y) * 1.0 / (curPoint.x - nextPoint.x); // 坐标直线斜率k if (k == Infinity || k == -Infinity) { let x = curPoint.x; let y; if (curPoint.y > nextPoint.y) { y = curPoint.y - L; } else { y = curPoint.y + L; } return { x: x, y: y }; } else { let b = curPoint.y - k * curPoint.x; // 坐标直线b // 第二步:求得在直线y=kx+b上,距离当前坐标距离为L的某点 let A = Math.pow(k, 2) + 1; // A=k^2+1; let B = 2 * ((b - curPoint.y) * k - curPoint.x); // B=2[(b-y0)k-x0]; // C=(b-y0)^2+x0^2-L^2 let C = Math.pow(b - curPoint.y, 2) + Math.pow(curPoint.x, 2) - Math.pow(L, 2); // 两根x1,x2= [-B±√(B^2-4AC)]/2A let x1 = (-B + Math.sqrt(Math.pow(B, 2) - 4 * A * C)) / (2 * A); let x2 = (-B - Math.sqrt(Math.pow(B, 2) - 4 * A * C)) / (2 * A); let x = 0; if (x1 == x2) { x = x1; } else if (curPoint.x <= x1 && x1 <= nextPoint.x || nextPoint.x <= x1 && x1 <= curPoint.x) { x = x1; } else if (curPoint.x <= x2 && x2 <= nextPoint.x || nextPoint.x <= x2 && x2 <= curPoint.x) { x = x2; } let y = k * x + b; return { x: x, y: y }; } }