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