internal static Image makeTexturedColorizer(List <Color> colors, List <float> positions) { int count = colors.Count; D.assert(count >= 2); bool bottomHardStop = ScalarUtils.ScalarNearlyEqual(positions[0], positions[1]); bool topHardStop = ScalarUtils.ScalarNearlyEqual(positions[count - 2], positions[count - 1]); int offset = 0; if (bottomHardStop) { offset += 1; count--; } if (topHardStop) { count--; } if (offset != 0 || count != colors.Count) { colors = colors.GetRange(offset, count); positions = positions.GetRange(offset, count); } return(_cache.getGradient(colors, positions)); }
public static float[] get1DGaussianKernel(float gaussianSigma, int radius) { var width = 2 * radius + 1; D.assert(width <= 25); var key = new _GaussianKernelKey(gaussianSigma, radius); return(_gaussianKernels.putIfAbsent(key, () => { var kernel = new float[25]; float twoSigmaSqrd = 2.0f * gaussianSigma * gaussianSigma; if (ScalarUtils.ScalarNearlyZero(twoSigmaSqrd)) { for (int i = 0; i < width; ++i) { kernel[i] = 0.0f; } return kernel; } float denom = 1.0f / twoSigmaSqrd; float sum = 0.0f; for (int i = 0; i < width; ++i) { float x = i - radius; // Note that the constant term (1/(sqrt(2*pi*sigma^2)) of the Gaussian // is dropped here, since we renormalize the kernel below. kernel[i] = Mathf.Exp(-x * x * denom); sum += kernel[i]; } // Normalize the kernel float scale = 1.0f / sum; for (int i = 0; i < width; ++i) { kernel[i] *= scale; } return kernel; })); }
static float[] calculateKernel(float _cur_gaussian_sigma, int _cur_width, int _cur_radius) { var kernel = new float[25]; float twoSigmaSqrd = 2.0f * _cur_gaussian_sigma * _cur_gaussian_sigma; if (ScalarUtils.ScalarNearlyZero(twoSigmaSqrd)) { for (int i = 0; i < _cur_width; ++i) { kernel[i] = 0.0f; } return(kernel); } float denom = 1.0f / twoSigmaSqrd; float sum = 0.0f; for (int i = 0; i < _cur_width; ++i) { float x = i - _cur_radius; // Note that the constant term (1/(sqrt(2*pi*sigma^2)) of the Gaussian // is dropped here, since we renormalize the kernel below. kernel[i] = Mathf.Exp(-x * x * denom); sum += kernel[i]; } // Normalize the kernel float scale = 1.0f / sum; for (int i = 0; i < _cur_width; ++i) { kernel[i] *= scale; } _cur_gaussian_sigma = -1; _cur_radius = -1; return(kernel); }