计算直角多边形分割点

有一个多边形(p0,p1,p2...pn),每一边平行于X轴或者Y轴,先给定数值K ,以P0为起始点将N边形分成K段,每一段长度相等,求等分点(T0,T1,T2...Tk)
`

   /**
   * @function 获取直角坐标系多边形等分点
   * @param {array} [[1,1], [1,3], [3,3], [3,4], [5,4], [5,1]]
   *
   */
  function getAvgCoordinatePointsBy(polygon, k) {
    const C = polygon.reduce((calc, currentPoint, index) => {
      // 获取相邻连接点
      const nextPoint =
        index === polygon.length - 1 ? polygon[0] : polygon[index + 1];
      // 计算连接点的长度
      const length = Math.abs(
        nextPoint[0] - currentPoint[0] + (nextPoint[1] - currentPoint[1])
      );
      return calc + length;
    }, 0);

    // 平均长度
    const svgLen = C / k;

    // 等分点第一个点就是多边形起始点
    const res = [polygon[0]];
    let arr = polygon;
    // 已知第一个的等分点,在计算k-1个点的坐标
    for (let i = 1; i < k; i++) {

      arr = getPoint(arr, svgLen);
      res.push(arr[0])
    }


    return res;
  }

  /**
   * @function 根据坐标路线获取指定长度的终点
   *
   */
  function getPoint(arr, length) {
    let res;
    let total = 0;
    for (let i = 0; i < arr.length; i++) {
      const curPoi = arr[i];
      const nextIndex = i === arr.length - 1 ? 0 : i + 1;
      const nextPoi = arr[nextIndex];
      // 有一个必为0,所以不需要在算差值的时候加绝对值
      const diffX = curPoi[0] - nextPoi[0];
      const diffY = curPoi[1] - nextPoi[1];

      const len = Math.abs(diffX + diffY);
      // 如果上一次循得到的总长度加上这次两点之间的距离比指定长度长的话,终点就在arr[i]和arr[nextIndex]之间
      if (total + len >= length) {
        let point;
        const diffLen = length - total; // 剩余需要的长度
        if (diffX === 0) {
          // 如果两点X坐标差值为0,则以Y轴坐标算距离
          // 根据正负号判断位移方向
          const y =
            nextPoi[1] - curPoi[1] >= 0
              ? curPoi[1] + diffLen
              : curPoi[1] - diffLen;
          const x = curPoi[0];
          point = [x, y];
        } else {
          // 如果两点Y坐标差值为0,则以X轴坐标算距离
          // 根据正负号判断位移方向
          const x =
            nextPoi[0] - curPoi[0] >= 0
              ? curPoi[0] + diffLen
              : curPoi[0] - diffLen;
          const y = curPoi[1];
          point = [x, y];
        }


        res = [point, ...arr.slice(i + 1)];
        // 如果第1、第2个元素相等,说明终点在拐点,去重
        if (res.length > 1 && res[0][0] === res[1][0] && res[0][1] === res[1][1]) {
          res.shift();
        }
        break;
      }

      total += len;
    }

    return res;
  }
  `

你可能感兴趣的:(javascript前端算法)