我试图找到的不仅仅是最近的点,而是找到5个对象点数组中最近的3个点。我已经尝试了几个实验,每个点使用一个距离(outputStream
)变量。但我无法弄清楚如何迭代每个点,使用毕达哥拉斯定理/距离公式将其与其他点进行比较,然后找到最接近的3.如果数组有5个点,我猜我需要存储结果具有距离(d
)值的数组中的每次迭代,按距离值排序,然后删除新数组中的最后一项。这是数组:
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
我有办法应用这个功能和控制台记录结果,以便打印" ID:1stClosest,2ndClosest,3rdClosest":
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);
};
现在,我只想迭代每个点,应用距离公式来获得每个点比较的d:值,将其推送到一个新数组,我假设然后应用上面的部分({{1} }和 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);});
函数)。我怎样才能做到这一点?这就是我到目前为止所拥有的:
result
答案 0 :(得分:1)
如果我理解正确,这与closest pair of points问题类似。一种(直观但可能效率低下)的方法是简单地强制收集集合中的项目。也就是说,对于两个点,您使用两个for循环。那么,对于三个点,您可以使用三个嵌套循环。然后,您就会找到最大的紧密度。"我不确定你想要如何定义接近度,但我认为从A到B,B到C以及从C到A的距离总和会很好。测试点分组的每个枚举的最小距离"距离"会导致最接近的配对。
所以,我不确定你的其他功能会在哪里发挥作用。更大的问题是找到如何确定最近的""所以调用函数来做一个更大问题的子问题并不能检查出来。
如果你想要点三个最近的组,那么然后你需要跟踪每个配对的距离并确定你想要保持的方式它们彼此截然不同。即,你想让同一点在另一组点中吗?