缩放2D坐标并保持其相对的欧氏距离完好无损?

时间:2010-03-15 19:53:27

标签: python math coordinates scale

我有一组点,如: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 个答案:

答案 0 :(得分:10)

您需要将x值和y值缩放相同的数量!我建议按两个范围中较大的一个进行缩放(xy)。在伪代码中,你会有像

这样的东西
scale = max(maximum_x_value - minimum_x_value,
            maximum_y_value - minimum_y_value)

然后点之间的所有距离都将按scale进行缩放,这是我认为你要求的,所以如果点p_1距离点p_2两倍远,那么在重新缩放之前从p_3开始,重新缩放后它将是两倍。你应该能够使用毕达哥拉斯定理很容易地证明这一点。

答案 1 :(得分:8)

假设您希望整个数据集在(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
  4. 这种方法的优点是可以完美地处理任何给定的输入数据,并且在保持纵横比(以及相对距离)的同时尽可能多地填充单位平方。

答案 2 :(得分:4)

第1步:重新找到原点
让你的新“起源”为(minimum_x_valueminimum_y_value)。通过从所有x坐标中减去minimum_x_value并从所有y坐标中减去minimum_y_value来移动所有数据点。

第2步:规范化剩余数据
缩小其余数据以适应0.0-1.0窗口。将max_coord视为最大x值或最大y值中较大的一个。将所有x和y坐标除以max_coord

答案 3 :(得分:3)

如果您的意思是不保持纵横比:只需缩放到最小边界而不是最小边界矩形。您应该选择沿两个轴的比例因子到max(dx,dy)。

答案 4 :(得分:3)

您必须按相同因子缩放它们以保持距离相同。

我忘了减去最小值(注意:这部分只有在积分总是正数时才是真的,这是我通常的用例),并且除以两个最大值的最大值:

maxval = max(max(A.x), max(A.y)) #or however you find these
A.x = A.x/maxval
A.y = A.y/maxval