调整非线性值

时间:2015-07-18 18:25:08

标签: c# math pixel sfml brightness

我有一个值对列表,用于描述给定像素的距离以及我想设置的亮度百分比:

Distance    Brightness
0px         100%
1px         99%
2px         98%
3px         97%
etc.

我想转换我的值,以便亮度值形成某种曲线。更接近的值(最多10px)可能在100-95之间,其余值将更快地消除。

enter image description here

第一行是我已经拥有的第一行,第二行是我的目标。

另一个例子,我想要实现的目标: 我现在拥有的:

enter image description here

我想要的是:

enter image description here

我正在编写一个增亮画笔。如您所见,亮度是线性的。我希望它在圆圈的中间变得更亮,并且更大的“脱落”到圆形边缘。

用于计算像素距离和亮度值的代码示例

    private static Color LightenPixel(Vector2f center, Vector2f pixel, Color color)
    {
        //Calculate distance to circle origin
        double x = Math.Pow((double)(center.X - pixel.X),2);
        double y = Math.Pow((double)(center.Y - pixel.Y), 2);
        double distance = Math.Sqrt(x + y);

        //Get the percentual distance to the origin and flip the percentual value
        // E.G. 80% becomes 20% for brightness => closer to origin => brighter
        // -1 = 100% Darkness
        // +1 = 100% Brightness
        float brightness = (float)(1 - (distance * 100 / radius) / 100);
        return ChangeColorBrightness(color, brightness);
    }

编辑: 关于我如何想要它的另一个例子:

enter image description here

红色是我拥有的,绿色是我想要的(不知何故)。

1 个答案:

答案 0 :(得分:1)

我认为你只需要使用Log function。 日志函数的下降速度比输入值快。

Math.Log10(10D); // 1
Math.Log10(9D);  // 0.95
Math.Log10(8D);  // 0.90
Math.Log10(7D);  // 0.84
Math.Log10(6D);  // 0.77
Math.Log10(5D);  // 0.69
Math.Log10(4D);  // 0.60
Math.Log10(3D);  // 0.47
...

所以基本上,当你离中心越来越近时,你会得到一个越来越小的值。 如果您需要的是相反的(更接近中心=更大的值),那么只需使用1/Math.Log(distance);

所以在你的例子中,例如:

brightness = (float)Math.Log10(brightness + 1);

应该成功......