如何缩放二维坐标并保持相对欧几里得距离?

8 投票
5 回答
15154 浏览
提问于 2025-04-15 20:27

我有一组点,比如:pointA(3302.34,9392.32),pointB(34322.32,11102.03)等等。

我需要把这些点的坐标缩放到一个范围内,让每个x和y的值都在0.0到1.0之间。我试着先找出数据集中最大的x值(maximum_x_value)和最大的y值(minimum_y_value)。然后我做了以下操作:

pointA.x = (pointA.x - minimum_x_value) / (maximum_x_value - minimum_x_value)
pointA.y = (pointA.y - minimum_y_value) / (maximum_y_value - minimum_y_value)

这样做改变了点之间的相对距离,这让我觉得这些数据对我来说没用了。有没有办法在缩放这些坐标的同时,保持它们之间的相对距离不变呢?

5 个回答

4

步骤 1:重新定位原点
把你的新“原点”设定为 (minimum_x_value, minimum_y_value)。也就是说,你要把所有的数据点都移动一下,具体做法是:把每个点的 x 坐标减去 minimum_x_value,同时把每个点的 y 坐标减去 minimum_y_value

步骤 2:规范化剩余数据
把剩下的数据缩放到 0.0 到 1.0 这个范围内。首先找出 max_coord,它是你所有 x 值和 y 值中最大的一个。然后,把所有的 x 坐标和 y 坐标都除以 max_coord

11

你需要把 x 值和 y 值按相同的比例缩放!我建议你选择两个范围中更大的一个来进行缩放(要么是 x,要么是 y)。用伪代码来说,你可以这样写:

scale = max(maximum_x_value - minimum_x_value,
            maximum_y_value - minimum_y_value)

这样的话,所有点之间的距离都会按照 scale 这个值来缩放。我猜这就是你想要的意思,所以如果点 p_1 距离点 p_2 的距离是点 p_3 的两倍,那么在缩放后,这个距离依然会保持两倍的关系。你可以用勾股定理很容易地验证这一点。

11

假设你想把整个数据集的中心放在 (0.5, 0.5),并且在两个轴上的范围都是 (0,1),那么可以把整个过程分成三个简单的步骤来理解:

  1. 首先,把数据中心移到原点:
    P.x -= (maxX + minX) / 2
    P.y -= (maxY + minY) / 2
  2. 然后,把数据缩小到相同的比例,这样两个方向中范围更大的那个变成 (-0.5, 0.5)
    scale = max(maxX - minX, maxY - minY)
    P.x /= scale
    P.y /= scale
  3. 最后,把所有点移动到 (0.5, 0.5),这样就能把它们放到你想要的位置:
    P.x += 0.5
    P.y += 0.5

这种方法的好处是可以完美适应任何输入数据,同时尽可能填满单位正方形,并保持长宽比(也就是相对距离不变)。

撰写回答