我有一个源矩形和一个目标矩形。我需要找到在目标矩形中拟合时可以缩放源的最大比例,并且保持其原始高宽比。
Google找到了one方法,但我不确定它是否适用于所有情况。这是我家酿的解决方案:
msrc
和mdest
的斜率。msrc < mdst
,缩放来源宽度以适合目标宽度(并按相同比例缩放比例)寻找此问题的其他可能解决方案。我甚至不确定我的算法是否适用于所有情况!
答案 0 :(得分:111)
scale = min( dst.width/src.width, dst.height/src.height)
这是你的方法,但写得更干净。
答案 1 :(得分:10)
另一种选择可能是缩放到最大宽度,然后检查缩放高度是否大于允许的最大高度,如果是这样,则按高度缩放(反之亦然):
scale = (dst.width / src.width);
if (src.height * scale > dst.height)
scale = dst.height / src.height;
我认为这个解决方案更短,更快,更容易理解。
答案 2 :(得分:1)
destWidth / srcWidth
和destHeight / srcHeight
编辑它当然与你的方法一样,随着公式的各个部分移动。我的意见是这在语义上更清晰,但它只是 - 一种意见。
答案 3 :(得分:1)
如果所有维度都不为零,我会使用以下代码(基本上与您的代码匹配)。
scaleFactor = (outerWidth / outerHeight > innerWidth / innerHeight)
? outerHeight / innerHeight
: outerWidth / innerWidth
如果需要,也可以修改此选项以允许任何维度为零。
答案 4 :(得分:0)
当sourceWidth或sourceHeight变为零时,其他答案可能会产生除零异常的风险。为了防止这种情况,我们应该将比较重写为数学上等效的多重表达式。此外,还有额外的边缘条件来捕捉无限规模的情景。
除了有比例尺,我真的想要目标矩形的尺寸,所以,在这里我将提供比例计算和目标矩形计算。
由于无限边缘条件,我认为目标矩形将更加强大/有用:
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;
}