有一个多边形(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; } `