代码之家  ›  专栏  ›  技术社区  ›  Agnel Kurian

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

  •  55
  • Agnel Kurian  · 技术社区  · 5 年前

    我有一个源矩形和一个目标矩形。我需要找到源在适应目标矩形和 保持其原始纵横比 .

    谷歌发现 one 但我不确定它是否适用于所有情况。这是我自制的解决方案:

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

    寻找这个问题的其他可能的解决方案。我甚至不确定我的算法是否适用于所有情况!

    5 回复  |  直到 5 年前
        1
  •  109
  •   tom10    15 年前
    scale = min( dst.width/src.width, dst.height/src.height)
    

    这是你的方法,但写得更清楚。

        2
  •  10
  •   Guss    15 年前

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

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

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

        3
  •  1
  •   AakashM    15 年前
    1. 计算出较小的 destWidth / srcWidth destHeight / srcHeight
    2. 按比例缩放

    编辑 当然,这和你的方法是一样的,公式的各个部分都在移动。我的 意见 这在语义上更清楚了,但这只是一个观点。

        4
  •  1
  •   Daniel Brückner    15 年前

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

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

    如果需要的话,也可以修改它以允许任何维度为零。

        5
  •  0
  •   Stephen Quan    6 年前

    当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;
        }