C# 非线性调整值

C# 非线性调整值,c#,math,pixel,sfml,brightness,C#,Math,Pixel,Sfml,Brightness,我有一个值对列表,描述到给定像素的距离和我要设置的亮度百分比: Distance Brightness 0px 100% 1px 99% 2px 98% 3px 97% etc. 我想变换我的值,使亮度值形成某种曲线。更接近的值(高达10px)可能在100-95之间,其余值的衰减速度更快 第一排是线性的,我已经有了,第二排是我的目标 另一个例子,我想要实现的是: 我现在所拥有的: 我想要的是: 我正在编程一个亮画笔。正

我有一个值对列表,描述到给定像素的距离和我要设置的亮度百分比:

Distance    Brightness
0px         100%
1px         99%
2px         98%
3px         97%
etc.
我想变换我的值,使亮度值形成某种曲线。更接近的值(高达10px)可能在100-95之间,其余值的衰减速度更快

第一排是线性的,我已经有了,第二排是我的目标

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

我想要的是:

我正在编程一个亮画笔。正如你所看到的,亮度是线性的。我希望它在圆的中间变亮,对圆边有更大的“脱落”。

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

    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);
    }
编辑: 关于我想要它的另一个例子:


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

我想你只需要使用一个。 日志功能的减少速度比输入速度快

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)

在您的示例中,类似于:

亮度=(浮点)数学.Log10(亮度+1)


你能告诉我们你已经做了什么吗?(你有一些代码吗?)我添加了一个代码示例,说明如何计算给定像素到圆原点的距离和亮度值。哇,看起来很简单。我正在寻找可能的方法来实现这一点,后勤职能似乎是完美的。你能告诉我如何用Log函数改变“fall-off”吗?如果你能提供一个zip文件,我可以在其中使用源代码,我可能会有所帮助。。。否则会有点棘手:)酷:)在这里你可以下载VS2013解决方案+项目。。。我正在使用SFML NuGet软件包进行图形处理。方法“LightePixel”和“ChangeColorBrightness”应该是有趣的方法。感谢您花时间,但这并不正是我需要的:(我尝试过它,但找不到最佳值。现在我创建了一个可视化“曲线”的小测试应用程序)…如果您想查看:…我还添加了另一个屏幕截图,说明我希望曲线看起来如何(或类似)