与纵横比匹配的最小尺寸

时间:2010-08-18 12:12:13

标签: c# .net algorithm

我需要找到长度比正好(或在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;

5 个答案:

答案 0 :(得分:6)

异常。你需要找到最大的公约数,并用它来划分宽度和高度。该算法由欧几里德提出,已有两千三百年的历史。详情are here

答案 1 :(得分:1)

您可以将aspectRatio写为分数(如果您希望它达到0.001的预定值,则可以使用round(aspectRatio,3)/ 1000)

然后,simplify this fraction。得到的分数是您正在寻找的x / y。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

不要测试所有可能的组合,只需增加使您更接近宽高比的一面:

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

答案 4 :(得分:0)

纵横比是x和y之间的比率。您可以将纵横比定义为x / y或y / x。

最小宽高比为0/0。

必须定义其他最小值,最小x或最小y。

min x =(min y * x)/ y

min y =(min x * y)/ x