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

eia*_*lid 6 python math scale coordinates

我有一组点,如: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)
Run Code Online (Sandbox Code Playgroud)

这会改变相对距离(?),因此使数据无法用于我的目的.有没有办法缩放这些坐标,同时保持它们的相对距离完整?

Pil*_*lsy 10

您需要将x值和y值缩放相同的量!我建议按两个范围中较大的一个(或者x或者y)进行缩放.在伪代码中,你会有类似的东西

scale = max(maximum_x_value - minimum_x_value,
            maximum_y_value - minimum_y_value)
Run Code Online (Sandbox Code Playgroud)

那么点之间的所有距离都将按比例缩放scale,这就是我认为你要求的,所以如果点距离重新缩放之前的点数p_1是两倍,那么重新缩放之后它将是两倍.你应该能够使用毕达哥拉斯定理很容易地向自己证明这一点.p_2p_3


tza*_*man 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

这种方法的优点是可以完美地处理任何给定的输入数据,并且在保持纵横比(以及相对距离)的同时尽可能多地填充单位平方.


Ale*_*ing 3

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