实现:
/**
* @description: 获取多边形边界(边界框或包围盒算法)
* @param {*} polygon 多边形顶点数组
* @return {*} rect 顶点数组
*/
getBoundingRectangle(polygon) {
if (!Array.isArray(polygon) || polygon.length < 3) {
throw new Error('Polygon must have at least 3 points.');
}
// 使用 reduce 方法找到最小和最大坐标
const bounds = polygon.reduce(
([minX, minY, maxX, maxY], [x, y]) => [
Math.min(minX, x),
Math.min(minY, y),
Math.max(maxX, x),
Math.max(maxY, y)
],
[Infinity, Infinity, -Infinity, -Infinity]
);
// 解构赋值以获取最小和最大坐标
const [minX, minY, maxX, maxY] = bounds;
// 返回矩形的四个顶点坐标
return [
[minX, minY], // 左下角
[maxX, minY], // 右下角
[maxX, maxY], // 右上角
[minX, maxY] // 左上角
];
}
调用:
//多边形顶点坐标
const points = [
[225, 97],
[185, 144],
[151, 219],
[142, 284],
[177, 318],
[188, 381],
[207, 425],
[239, 438],
[287, 465],
[315, 448],
[359, 427],
[375, 375],
[387, 307],
[376, 237],
[340, 219],
[325, 180],
[313, 120],
[290, 93],
[259, 85]
];
//返回包围盒坐标
const box = this.getBoundingRectangle(points);
console.log(box)
效果:蓝色矩形为box,粉色区域为多边形区域。