6

我有一组点,例如: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)

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

4

5 回答 5

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重新缩放之前的两倍,那么重新缩放后的距离也将是两倍。您应该能够使用勾股定理很容易地向自己证明这一点。

于 2010-03-15T19:59:25.950 回答
9

假设您希望整个数据集以两个轴(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

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

于 2010-03-15T20:16:04.870 回答
4

第 1 步:重新定位原点
让您的新“原点”为 ( minimum_x_value, minimum_y_value)。minimum_x_value通过从所有 x 坐标中减去和minimum_y_value从所有 y 坐标中减去来移动所有数据点。

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

于 2010-03-15T20:26:53.647 回答
3

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

于 2010-03-15T19:58:22.223 回答
3

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

我会忘记减去最小值(注意:这部分仅在点始终为正时才成立,这是我通常的用例),只需除以两个最大值中的最大值:

maxval = max(max(A.x), max(A.y)) #or however you find these
A.x = A.x/maxval
A.y = A.y/maxval
于 2010-03-15T19:58:49.120 回答