private void HybridMulti_CalculateWeights()
{
for (var i = 0; i < Noise.MAX_SOURCES; ++i)
{
expArray[i] = Math.Pow(Lacunarity, -i * H);
}
// Calculate scale/bias pairs by guessing at minimum and maximum values and remapping to [-1,1]
const double a = -1.0;
const double b = 1.0;
var minvalue = Offset - 1.0;
var maxvalue = Offset + 1.0;
var weightmin = Gain * minvalue;
var weightmax = Gain * maxvalue;
var scale = (b - a) / (maxvalue - minvalue);
var bias = a - minvalue * scale;
correct[0, 0] = scale;
correct[0, 1] = bias;
for (var i = 1; i < Noise.MAX_SOURCES; ++i)
{
if (weightmin > 1.00) weightmin = 1.00;
if (weightmax > 1.00) weightmax = 1.00;
var signal = (Offset - 1.0) * expArray[i];
minvalue += signal * weightmin;
weightmin *= Gain * signal;
signal = (Offset + 1.0) * expArray[i];
maxvalue += signal * weightmax;
weightmax *= Gain * signal;
scale = (b - a) / (maxvalue - minvalue);
bias = a - minvalue * scale;
correct[i, 0] = scale;
correct[i, 1] = bias;
}
}