public float?GetAverageHeightFromNeighbourhood(int pKernelSizeMultiplier) { int pKernelSize = CGroundArray.GetKernelSize(); pKernelSize *= pKernelSizeMultiplier; int defined = 0; float heightSum = 0; for (int x = -pKernelSize; x < pKernelSize; x++) { for (int y = -pKernelSize; y < pKernelSize; y++) { int xIndex = indexInField.Item1 + x; int yIndex = indexInField.Item2 + y; CField el = GetFieldWithOffset(x, y); if (el != null && el.IsDefined()) { defined++; heightSum += (float)el.GetHeight(); } } } if (defined == 0) { return(null); } return(heightSum / defined); }
/// <summary> /// Sets SmoothHeight based on average from neighbourhood /// </summary> public void CalculateSmoothHeight(double[,] pGaussKernel) { if (!IsDefined()) { return; } //int defined = 0; float heightSum = 0; float midHeight = (float)GetHeight(); int kernelSize = CGroundArray.GetKernelSize(); float gaussWeightSum = 0; for (int x = 0; x < kernelSize; x++) { for (int y = 0; y < kernelSize; y++) { int xIndex = indexInField.Item1 + x - kernelSize / 2; int yIndex = indexInField.Item2 + y - kernelSize / 2; CField el = CProjectData.Points.groundArray.GetField(xIndex, yIndex); float? elHeight = el?.GetHeight(); //if element is not defined, use height from the middle element float definedHeight = midHeight; if (elHeight != null) { definedHeight = (float)elHeight; } float gaussWeight = (float)pGaussKernel[x, y]; gaussWeightSum += gaussWeight; heightSum += definedHeight * gaussWeight; } } SmoothHeight = heightSum; }