如何缩放二维坐标并保持相对欧几里得距离?
我有一组点,比如: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 个回答
步骤 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
。
你需要把 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
的两倍,那么在缩放后,这个距离依然会保持两倍的关系。你可以用勾股定理很容易地验证这一点。
假设你想把整个数据集的中心放在 (0.5, 0.5)
,并且在两个轴上的范围都是 (0,1)
,那么可以把整个过程分成三个简单的步骤来理解:
- 首先,把数据中心移到原点:
P.x -= (maxX + minX) / 2
P.y -= (maxY + minY) / 2
- 然后,把数据缩小到相同的比例,这样两个方向中范围更大的那个变成
(-0.5, 0.5)
:
scale = max(maxX - minX, maxY - minY)
P.x /= scale
P.y /= scale
- 最后,把所有点移动到
(0.5, 0.5)
,这样就能把它们放到你想要的位置:
P.x += 0.5
P.y += 0.5
这种方法的好处是可以完美适应任何输入数据,同时尽可能填满单位正方形,并保持长宽比(也就是相对距离不变)。