SF2 DrainageMonoDirr() { SF2 res = new SF2(this, 1); List <SP2> fieldcopy = getFieldCopy(); fieldcopy.Sort((x, y) => y.CompareTo(x)); for (int i = 0; i < fieldcopy.Count(); i++) { ResultCheckSlope result = CheckSlope(fieldcopy[i]); if (result.nb > 0) { float sp = res.at(fieldcopy[i].pos.x, fieldcopy[i].pos.y); for (int ind = 0; ind < result.nb; ind++) { float curr = res.at(result.q[ind].pos.x, result.q[ind].pos.y); float set = curr + (sp * result.avSlope[ind]); set = Mathf.Clamp(set, 0, 1000); res.setAt(result.q[ind].pos.x, result.q[ind].pos.y, set); if (res.min > set) { res.min = set; } if (res.max < set) { res.max = set; } } } } return(res); }
private ResultCheckSlope CheckSlope(SP2 p)//, List<SP2> listSP2 { ResultCheckSlope res = new ResultCheckSlope(); float slopesum = 0f; float zp = p.val; for (int i = -1; i < 1; i++) { for (int j = -1; j < 1; j++) { if (i == 0 && j == 0) { continue; } if (p.pos.x + i <= 0 || p.pos.x + i >= nx - 1 || p.pos.y + j <= 0 || p.pos.y + j >= ny - 1) { continue; } float step = this.at(p.pos.x + i, p.pos.y + j) - zp; if (step < 0f) { if ((i + j) % 2 != 0) { res.slope[res.nb] = -step; } else { res.slope[res.nb] = -step / Mathf.Sqrt(2); } slopesum += res.slope[res.nb]; res.q[res.nb] = new SP2(this.at(p.pos.x + i, p.pos.y + j), new Vector2Int(p.pos.x + i, p.pos.y + j)); res.nb++; } } } for (int i = 0; i < res.nb; i++) { res.avSlope[i] = res.slope[i] / slopesum; } return(res); }