C#:如何计算纵横比

12

我是一个相对新手的程序员。我需要根据给定的尺寸(比如axb)计算出宽高比(16:9或4:3)。请问如何在C#中实现这个功能?非常感谢您的帮助。

public string AspectRatio(int x, int y)
{
 //code am looking for
 return ratio
}

谢谢。


获取宽高比 - V4Vendetta
3
可能是 Calculate a Ratio in C# 的重复问题。 - V4Vendetta
@V4Vendetta,它只包含相同的不太好的解决方案。 - kirilloid
4个回答

15

你需要找到最大公约数,然后将x和y都除以它。

static int GCD(int a, int b)
{
    int Remainder;

    while( b != 0 )
    {
        Remainder = a % b;
        a = b;
        b = Remainder;
    }

    return a;
}

return string.Format("{0}:{1}",x/GCD(x,y), y/GCD(x,y));

提示

如果你想处理像 16:10 这样的比例(可以被两个数字整除),你需要准备一个预定义表,其中包含((float)x)/y - 比例对。


非常感谢。让我试试看。 - user1321391
这对于比例为“16:10”的情况失败了... ;) - Lucero
1366x768分辨率的笔记本用户真可怜=( - kirilloid

6

既然您只需要在16:9和4:3之间做出选择,这里有一个更简单的解决方案。

public string AspectRatio(int x, int y)
{
    double value = (double)x / y;
    if (value > 1.7)
        return "16:9";
    else
        return "4:3";
}

5
只有几种标准比例,如:4:35:416:1016:9GCD 是一个好主意,但至少对于 16:10 的比例和 1366x768 的分辨率会失败。
纯 GCD 算法将为 1366x768 得到 683:384,因为 683 是质数,而分辨率几乎是 16:9(16.0078125)。
我认为,对于真正的任务,需要实现相当复杂的算法:
首先尝试已知的宽高比(在 wikipedia 上查找),允许一些误差,然后再使用 GCD 作为后备。
不要忘记 32:10 ;-)

非常感谢。是的,像你提到的那样,有一些特殊情况。 - user1321391
@kirilloid 我一直在使用GCD,现在正在寻求有关那些“相当复杂的算法”的见解。你知道从哪里开始学习更全面的内容吗? - Ben Racicot
@TR3B 寻找最佳近似值,使用小于等于20的分母,然后使用其他自定义映射,例如8:5实际上是16:10或39:18实际上是19.5:9(一些现代智能手机)。谷歌各种屏幕分辨率,在维基百科上阅读,以获取见解。 - kirilloid
所以最后就归结为这个问题了...我们为什么要谈论计算AR,当你没有进行映射就无法覆盖所有的规格要求呢? - Ben Racicot
由于纵横比远少于分辨率,且例外更少。如果你正在寻找具有自定义设置的dp(设备无关像素),那么枚举所有例外情况将会很困难,祝好运。因为它们是不可约的。 - kirilloid
1
我认为随着长型智能手机的推出,如19:9、19.5:9、20:9等,这一点得到了很好的体现。 - kirilloid

1
你需要找到最大公约数(http://zh.wikipedia.org/wiki/最大公约数),然后:
return x/GCD + ":" + y/GCD;

这对于宽高比为16:10的情况失败了... ;) - Lucero
4
"16:10"也被称为"8:5" :) - V4Vendetta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接