我想找到不只是最近的点,但在5点对象的数组3个最近点。 我已尝试仅使用距离(几个实验d
每个点)变量。 但我无法弄清楚如何通过每个点迭代,比较它利用勾股定理/距离公式另一点,然后找到最接近3.如果数组有5个点,我猜我需要存储的结果在具有距离(阵列每次迭代d
)值,排序由所述距离值,然后删除新的数组中的最后一项。 这里是数组:
var points = [
{ id: 1, x: 0.0, y: 0.0 },
{ id: 2, x: 10.1, y: -10.1 },
{ id: 3, x: -12.2, y: 12.2 },
{ id: 4, x: 38.3, y: 38.3 },
{ id: 5, x: 79.0, y: 179.0 },
];
我有一个基于一个查找最近的3个点的函数d
的距离键值:
function closest(n, { id, d }) {
return points
.filter(o => o.id !== id)
.sort((a, b) => Math.abs(a.d - d) - Math.abs(b.d - d))
.slice(0, n);
};
我有办法把这个函数和控制台日志结果让它打印“ID:1stClosest,2ndClosest,3rdClosest”:
result = points.map(o =>
Object.assign({}, o, { closest: closest(3, o) }));
result.forEach((item) => {
console.log(item.id + ': ' + item.closest[0].id + ', ' + item.closest[1].id + ', ' + item.closest[2].id);});
现在,我只是想通过每一个点进行迭代,应用距离公式来获得D:值对于每个点的比较,把它推到一个新的数组,我假设,然后应用以上的部分( result
和closest
函数)。 我怎样才能做到这一点? 这是我到目前为止有:
points.forEach((item) => {
var newArray = [item];
var pt = null;
var d = null;
for (var i = 0; i < points.length; i = i + 1) {
//compare this point with all of the other points
for (var j = i + 1; j < points.length; j = j + 1) {
//compute distance
var curr = Math.sqrt(Math.pow(points[i][0] - points[j][0], 2) + Math.pow(points[i][1] - points[j][1], 2));
//get the distance between each point and push to a new array
if (d === null || curr < d) {
o = points.id[i];
pt = points.id[j];
d = curr;
}
}
}
newArray.push = {
"id": o,
"pt": pt,
"d": d
};
console.log(newArray);
});