public void Update( )
{
int hits;
int i, n = values.Length;
int nM1 = n - 1;
float rangeLength = range.Length;
float rangeMin = range.Min;
max = 0;
min = n;
mean = 0;
stdDev = 0;
total = 0;
double sum = 0;
// calculate mean, min, max
for ( i = 0; i < n; i++ )
{
hits = values[i];
if ( hits != 0 )
{
// max
if ( i > max )
max = i;
// min
if ( i < min )
min = i;
}
// accumulate total value
total += hits;
// accumulate mean value
sum += ( ( (double) i / nM1 ) * rangeLength + rangeMin ) * hits;
}
if ( total != 0 )
{
mean = (float) ( sum / total );
}
min = ( min / nM1 ) * rangeLength + rangeMin;
max = ( max / nM1 ) * rangeLength + rangeMin;
// calculate stadard deviation
sum = 0;
double diff;
for ( i = 0; i < n; i++ )
{
hits = values[i];
diff = ( ( (double) i / nM1 ) * rangeLength + rangeMin ) - mean;
sum += diff * diff * hits;
}
if ( total != 0 )
{
stdDev = (float) Math.Sqrt( sum / total );
}
// calculate median
int m, halfTotal = total / 2;
for ( m = 0, hits = 0; m < n; m++ )
{
hits += values[m];
if ( hits >= halfTotal )
break;
}
median = ( (float) m / nM1 ) * rangeLength + rangeMin;
}
}