如何将一个矩形缩放到另一个矩形内可能的最大尺寸?

我有一个源矩形和一个目标矩形。我需要找到的最大规模,其中源可以缩放,同时拟合在目标矩形和 保持原来的高宽比

谷歌找到了 的方法,但我不确定它是否适用于所有情况。以下是我自制的解决方案:

  • 计算每个矩形的高度/宽度。这给出了对角线 msrcmdest的斜率。
  • 如果是 msrc < mdst,缩放源 宽度以适应目标 宽度(以相同比例缩放高度)
  • 否则,缩放源 身高以适应目标 身高(以相同比例缩放宽度)

寻找解决这个问题的其他可能的方法。我甚至不确定我的算法是否在所有情况下都有效!

31532 次浏览
  1. 计算出 destWidth / srcWidthdestHeight / srcHeight的最小值
  2. 按这个比例

编辑 它当然与您的方法相同,只是公式的各个部分被移动了一下。我的 意见是,这在语义上更清楚,但它只是一个意见。

另一个选项可能是缩放到最大宽度,然后检查缩放的高度是否大于允许的最大高度,如果是,则按高度缩放(反之亦然) :

scale = (dst.width / src.width);
if (src.height * scale > dst.height)
scale = dst.height / src.height;

我认为这个解决方案既简短、快捷又容易理解。

如果所有维度都是非零的,我将使用以下代码(基本上与您的代码相匹配)。

scaleFactor = (outerWidth / outerHeight > innerWidth / innerHeight)
? outerHeight / innerHeight
: outerWidth / innerWidth

这也可以修改,以允许任何尺寸为零,如果需要的话。

scale = min(dst.width/src.width, dst.height/src.height)

这是你的方法,但写得更干净。

要使用这种方法,按比例缩放的矩形应该具有以下形状:

width = src.width * scale
height = src.height * scale

当 source Width 或 source Height 变为零时,其他的回答可能会产生除以零的异常。为了防止这种情况,我们应该将比较重写为数学上等效的多重表达式。此外,附加的边缘条件,以捕捉无限尺度的情况。

除了比例之外,我真正想要的是目标矩形的尺寸,因此,在这里我将提供比例计算和目标矩形计算。

由于无穷大的边缘条件,我认为目标矩形将更加健壮/有用:

    if (sourceWidth == 0 && sourceHeight == 0) {
// scale = Infinity;
outputWidth = 0;
outputHeight = 0;
outputX = destWidth / 2;
outputY = destHeight / 2;
} else if (destWidth * sourceHeight > destHeight * sourceWidth) {
scale = destHeight / sourceHeight;
outputWidth = sourceWidth * destHeight / sourceHeight;
outputHeight = destHeight;
outputX = (destWidth - outputWidth) / 2;
outputY = 0;
} else {
scale = destWidth / sourceWidth;
outputWidth = destWidth;
outputHeight = sourceHeight * destWidth / sourceWidth;
outputX = 0;
outputY = (destHeight - outputHeight) / 2;
}