如何快速计算3个值的幅度?

时间:2016-10-15 09:07:40

标签: c# math unity3d

如何对3个值使用快速幅度计算(而不是使用平方根)? (+/- 3%就足够了)

public void RGBToComparison(Color32[] color)
{
    DateTime start = DateTime.Now;
    foreach (Color32 i in color)
    {
        var r = PivotRgb(i.r / 255.0);
        var g = PivotRgb(i.g / 255.0);
        var b = PivotRgb(i.b / 255.0);

        var X = r * 0.4124 + g * 0.3576 + b * 0.1805;
        var Y = r * 0.2126 + g * 0.7152 + b * 0.0722;
        var Z = r * 0.0193 + g * 0.1192 + b * 0.9505;

        var LB = PivotXyz(X / 95.047);
        var AB = PivotXyz(Y / 100);
        var BB = PivotXyz(Z / 108.883);

        var L = Math.Max(0, 116 * AB - 16);
        var A = 500 * (LB - AB);
        var B = 200 * (AB - BB);

        totalDifference += Math.Sqrt((L-LT)*(L-LT) + (A-AT)*(A-AT) + (B-BT)*(B-BT));
    }
    totalDifference = totalDifference / color.Length;
    text.text = "Amount of Pixels: " + color.Length + "  Time(MilliSeconds):" + DateTime.Now.Subtract(start).TotalMilliseconds + "                                  Score (0 to 100)" + (totalDifference).ToString();
    RandomOrNot();
}
private static double PivotRgb(double n)
{
    return (n > 0.04045 ? Math.Pow((n + 0.055) / 1.055, 2.4) : n / 12.92) * 100.0;
}    
private static double PivotXyz(double n)
{
    return n > 0.008856 ? CubicRoot(n) : (903.3 * n + 16) / 116;
}    
private static double CubicRoot(double n)
{
    return Math.Pow(n, 1.0 / 3.0);
}

这是重要的部分:totalDifference += Math.Sqrt((L-LT)*(L-LT) + (A-AT)*(A-AT) + (B-BT)*(B-BT));

我知道在线有FastMagnitude次计算,但所有在线计算都是两个值,而不是三个。例如,我可以使用值之间的差异来获得准确的答案吗? (通过将差值应用到等式中,如果差异百分比很大,则回落到平方根上?)

添加值并每4像素迭代平方根是我能做的最后的手段。但首先,我想知道是否可以对3个值进行良好的FastMagnitude计算。

我知道我可以进行多线程和parllelize,但我想在我这样做之前优化我的代码。

1 个答案:

答案 0 :(得分:0)

如果您只是想比较这些值,为什么不将平方根留下来并使用长度平方?

或者使用1 + x平方根的taylor series并提前切断:)