在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()
的复杂度。