Skip to content

在JavaScript中计算欧几里得距离

定义

两点之间的欧几里得距离连接它们的线段的长度。在二维空间中,计算欧几里得距离的公式等于一个直角三角形的斜边长度,由勾股定理给出。

实现

JavaScript的Math.hypot()方法可以用于计算二维空间中两点之间的欧几里得距离。

const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0);

distance(1, 1, 2, 3); // ~2.2361

三维空间中,公式相同,只是多了一个维度。为了提高可读性,我们还应该将每个点表示为一个数组

const distance = ([x0, y0, z0], [x1, y1, z1]) =>
  Math.hypot(x1 - x0, y1 - y0, z1 - z0);

distance([1, 1, 1], [2, 3, 2]); // ~2.4495

实际上,对于任意维度,我们可以使用相同的公式。使用Object.keys()Array.prototype.map(),我们可以将每个坐标映射到两个点之间的差值。然后,使用扩展运算符(...),我们可以将结果值传递给Math.hypot()

const euclideanDistance = (a, b) =>
  Math.hypot(...Object.keys(a).map(k => b[k] - a[k]));

euclideanDistance([1, 1], [2, 3]); // ~2.2361
euclideanDistance([1, 1, 1], [2, 3, 2]); // ~2.4495
euclideanDistance([1, 1, 1, 1], [2, 3, 2, 3]); // ~3.1623

复杂度

算法实现的时间复杂度O(n),其中n是维度的数量,这是由于Array.prototype.map()的复杂度。