我有一组点,如: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)
这会改变相对距离(?),因此数据无法用于我的目的。有没有办法缩放这些坐标,同时保持它们的相对距离完整?
答案 0 :(得分:10)
您需要将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
开始,重新缩放后它将是两倍。你应该能够使用毕达哥拉斯定理很容易地证明这一点。
答案 1 :(得分:8)
假设您希望整个数据集在(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
这种方法的优点是可以完美地处理任何给定的输入数据,并且在保持纵横比(以及相对距离)的同时尽可能多地填充单位平方。
答案 2 :(得分: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
。
答案 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