private SimpleMatrix GetAdjustment(ScalePoint point, int level, int x, int y, out double dp) { dp = 0.0; if (point.Level <= 0 || point.Level >= (spaces.Length - 1)) { throw (new ArgumentException("point.Level is not within [bottom-1;top-1] range")); } ImageMap below = spaces[level - 1]; ImageMap current = spaces[level]; ImageMap above = spaces[level + 1]; SimpleMatrix H = new SimpleMatrix(3, 3); H[0, 0] = below[x, y] - 2 * current[x, y] + above[x, y]; H[0, 1] = H[1, 0] = 0.25 * (above[x, y + 1] - above[x, y - 1] - (below[x, y + 1] - below[x, y - 1])); H[0, 2] = H[2, 0] = 0.25 * (above[x + 1, y] - above[x - 1, y] - (below[x + 1, y] - below[x - 1, y])); H[1, 1] = current[x, y - 1] - 2 * current[x, y] + current[x, y + 1]; H[1, 2] = H[2, 1] = 0.25 * (current[x + 1, y + 1] - current[x - 1, y + 1] - (current[x + 1, y - 1] - current[x - 1, y - 1])); H[2, 2] = current[x - 1, y] - 2 * current[x, y] + current[x + 1, y]; SimpleMatrix d = new SimpleMatrix(3, 1); d[0, 0] = 0.5 * (above[x, y] - below[x, y]); d[1, 0] = 0.5 * (current[x, y + 1] - current[x, y - 1]); d[2, 0] = 0.5 * (current[x + 1, y] - current[x - 1, y]); SimpleMatrix b = (SimpleMatrix)d.Clone(); b.Negate(); H.SolveLinear(b); dp = b.Dot(d); return(b); }