Vec3 sumInRegion(Config config, Kernel k, Func <Position, Vec3> pos2val) { var result = new Vec3(0, 0, 0); For.AllPixelsOfRegion(config, k, (_, i) => { result += pos2val(i); }); return(result); }
double sumInRegion(Config config, Kernel k, Func <Position, double> pos2val) { double result = 0; For.AllPixelsOfRegion(config, k, (_, i) => { result += pos2val(i); }); return(result); }
int index(Config config, Position i, Kernel k) { int rx = (int)(4 * config.rx + 1); int ry = (int)(4 * config.ry + 1); int ox = -(int)(1.5 * config.rx); int oy = -(int)(1.5 * config.ry); int x = (int)i.p.x - k.xi - ox; int y = (int)i.p.y - k.yi - oy; int w = (int)(4 * config.rx + 1); int h = (int)(4 * config.ry + 1); if (0 <= x && x < w && 0 <= y && y < h) { return(x + y * (int)(4 * config.rx + 1)); } return(-1); }
double calcGaussian(Kernel k, Position i) { var dpos = i.p - m[k.index]; var invS = S[k.index].Inverse(); var posTerm = -0.5 * dpos * invS * dpos; var dcol = c[i.index] - v[k.index]; var colTerm = -Vec3.DistanceSqr(c[i.index], v[k.index]) / (2 * s[k.index] * s[k.index]); try { double val = Math.Max(-1e2, Math.Min(1e2, posTerm + colTerm)); var result = Math.Exp(val); System.Diagnostics.Debug.Assert(double.IsNaN(result) == false); return(result); } catch (Exception ex) { return(0); } }
double[] g(Kernel k) { return(g_[k.index]); }
double[] w(Kernel k) { return(w_[k.index]); }