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
      };
   }
}

 

Tags: