簡體   English   中英

與縱橫比匹配的最小尺寸

[英]Minimum size that matches aspect ratio

我需要找到長寬比恰好(或在0.001以內)某個值的最小尺寸。 這樣做有什么快速的數學技巧或框架技巧嗎?

這是我在O(n^2)運行的當前主意的偽代碼:

epsilon = 0.001;

from x = 1 to MAX_X
{
  from y = 1 to MAX_Y
  {
    if(Abs(x / y - aspectRatio) <= epsilon)
    {
      return new Size(x, y);
    }
  }
}
return Size.Empty;

異常。 你需要找到最大的公約數,並用它來划分寬度和高度。 該算法由歐幾里德提出,已有兩千三百年的歷史。 細節在這里

您可以將aspectRatio寫成一個分數 (如果您希望它達到0.001的預定值,則可以使用round(aspectRatio,3)/ 1000)

然后, 簡化這一部分 得到的分數是您正在尋找的x / y。

更快捷的方法,但仍然不是公式化的,只能查看可能的y值,而不是迭代到MAX_Y。 例如:

    static Size FindMinSize(double requiredRatio, double epsilon)
    {
        int x = 1;
        do
        {
            int y = (int)(x * requiredRatio);
            if (Test(x, y, requiredRatio, epsilon))
            {
                return new Size(x, y);
            }

            y = (int)((x + 1) * requiredRatio);
            if (Test(x, y, requiredRatio, epsilon))
            {
                return new Size(x, y);
            }
            x++;
        } while (x != int.MaxValue);

        return new Size(0, 0);
    }

    static bool Test(int x, int y, double requiredRatio, double epsilon)
    {
        double aspectRatio = ((double)y)/x;
        return Math.Abs(aspectRatio - requiredRatio) < epsilon;
    }

而不是測試所有可能的組合,只需增加使您更接近寬高比的一面:

public static Size GetSizeFromAspectRatio(double aspectRatio) {
  double epsilon = 0.001;
  int x = 1;
  int y = 1;
  while (true) {
    double a = (double)x / (double)y;
    if (Math.Abs(aspectRatio - a) < epsilon) break;
    if (a < aspectRatio) {
      x++;
    } else {
      y++;
    }
  }
  return new Size(x, y);
}

縱橫比是x和y之間的比率。 您可以將縱橫比定義為x / y或y / x。

最小寬高比為0/0。

必須定義一些其他最小值,最小x或最小y。

min x =(min y * x)/ y

min y =(min x * y)/ x

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM