[英]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.