通过多个点,计算出中心点,我这里是JavaScript方法,其他大家懂其他语言也可以进行转换,我写的主要是一个思路。
求出来的并不是原有的点,而是原有点的中心位置的点。这个中心点是尽可能包括多个点。
通过两点形成的矩形,看能包括多个点。包括最多的点的两个点,再求这两个点的中心点,这就是最终的中心点。可能我说的有点难理解,下面看代码就可以知道了。如果有什么不对,欢迎评论和指正。
代码:
<!DOCTYPE html>
<html>
<head>
<title>计算中心点</title>
</head>
<body>
<script>
function mathCenterPoint(pointList) {
let centerPoint;
let centerMap = new Map();
let maxFlag = 0;
for (let i = 0; i < pointList.length; i++) {
for (let j = i + 1; j < pointList.length; j++) {
//两两点组合
let aPoint = pointList[i];
let bPoint = pointList[j];
let maxX = Math.max(aPoint[0], bPoint[0])
let maxY = Math.max(aPoint[1], bPoint[1])
let minX = Math.min(aPoint[0], bPoint[0])
let minY = Math.min(aPoint[1], bPoint[1])
let flag = 0;
//开始比较
for (let k = 0; k < pointList.length; k++) {
//判断c点是否在这两个点形成的矩形框中间
let cPoint = pointList[k];
if ((cPoint[0] >= minX && cPoint[0] <= maxX) &&
(cPoint[1] >= minY && cPoint[1] <= maxY)) {
flag++;
}
}
let tempCenterPoint = [(maxX + minX) / 2, (maxY + minY) / 2];
if (flag >= maxFlag) {
maxFlag = flag;
if (centerMap.has(maxFlag)) {
tempCenterPointX = centerMap.get(maxFlag);
if (Math.abs(tempCenterPoint[0] - tempCenterPoint[1]) <= Math.abs(tempCenterPointX[0] - tempCenterPointX[1])) {
centerMap.set(maxFlag, tempCenterPoint);
}
} else {
centerMap.set(maxFlag, tempCenterPoint);
}
} else {
centerMap.set(flag, tempCenterPoint);
}
//说明这两个点围成的矩形包裹了全部点
if (flag == pointList.length) {
//那么中心点就是中间点
console.log("矩形包裹了全部点");
centerPoint = centerMap.get(maxFlag);
return centerPoint;
}
}
}
if (!centerPoint) {
console.log("覆盖和多少个点:", maxFlag)
centerPoint = centerMap.get(maxFlag)
}
return centerPoint;
}
let pointList = [
[2, 3],
[1, 1],
[4, 22],
[9, 14],
[10, 1],
[11, 23]
]
let centerPoint = mathCenterPoint(pointList);
console.log("centerPoint:", centerPoint)
</script>
</body>
</html>