我想建立一个单数的常数数组(1..200)来制作一个'查找表',将值为1 - 200的滚动条的位置转换为一个值,用于将伽玛校正应用于图像。
第一个数组值的某个值大约为7.0 - 9.9(photoshop使用9.9)。中间的一个,数组值100,需要精确到1.0。数组值200约为0.01。
有谁能告诉我使用哪种算法?
我一直试图在一些基于函数Power(i,2.2)的测试代码中使用'试错'来制作数组,但是没有任何结果。
我正在使用Delphi。我不是在问代码,只是朝着正确的方向迈进。任何帮助将不胜感激。
答案 0 :(得分:4)
这不是一个编程问题,而是一个数学问题。
假设二次函数,其形式为y = ax 2 + bx + c。
填写已知的三个价值对:
9.9 = a + b + c
1 = 10000a + 100b + c
0.01 = 40000a + 200b + c
三个方程+三个unknows =可通过简单替换解决。
9.9 = a + b + c
c = 9.9 - a - b
1 = 10000a + 100b + c
1 = 10000a + 100b + 9.9 - a - b
1 = 9999a + 99b + 9.9
1 - 99b = 9999a + 9.9
-99b = 9999a + 9.9 - 1
-99b = 9999a + 8.9
b = -101a - 8.9/99
0.01 = 40000a + 200b + c
0.01 = 40000a + 200b + 9.9 - a - b
0.01 = 39999a + 199b + 9.9
0.01 = 39999a + 199(-101a - 8.9/99) + 9.9
0.01 = 39999a - 20099a - 17.89 + 9.9
0.01 = 19900a - 7.99
0.01 - 19900a = -7.99
-19900a = -8
a = 8/19900
a = 0.000402
b = -101a - 8.9/99
b = -808/19900 - 8.9/99
b = -0.1305
c = 9.9 - a - b
c = 10.0301
换句话说:Gamma = 0.000402 * Pos^2 - 0.1305 * Pos + 10.0301
答案 1 :(得分:0)
为什么不采取差异并按步数分割。
实施例。 9.9-1 / 100然后你知道要增加的金额。
我在javascript中做了一个简单的例子来说明我的意思:
doWork = function() {
var result = '';
var first = 9.9;
var middle = 1;
var last = 0.01;
var firstSteps = (first - middle) / 99;
var lastSteps = (middle - last) / 100;
result = result + 'first=' + firstSteps + '<br>';
result = result + 'last=' + lastSteps + '<br>';
var value = first;
for (var i = 1; i < 201; i++) {
var showValue = Math.round(value * 100) / 100;
result = result + i + ' => ' + showValue + '<br/>';
if (i > 99) {
value = value - lastSteps;
}
else if (i == 99) {
value = middle;
}
else {
value = value - firstSteps;
}
}
document.getElementById('info').innerHTML = result;
}