我有一个值对列表,用于描述给定像素的距离以及我想设置的亮度百分比:
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);
}
编辑: 关于我如何想要它的另一个例子:
红色是我拥有的,绿色是我想要的(不知何故)。
答案 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);
应该成功......