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”应该是有趣的方法。感谢您花时间,但这并不正是我需要的:(我尝试过它,但找不到最佳值。现在我创建了一个可视化“曲线”的小测试应用程序)…如果您想查看:…我还添加了另一个屏幕截图,说明我希望曲线看起来如何(或类似)