int find_pourpts(void) { int row, col; double easting, northing, stream_length; CELL old_elev, basin_num, no_basin, curr_basin; WAT_ALT wa; ASP_FLAG af; char is_swale; ocs_alloced = 2 * bas_thres; ocs = (OC_STACK *)G_malloc(ocs_alloced * sizeof(OC_STACK)); basin_num = 0; Rast_set_c_null_value(&no_basin, 1); stream_length = old_elev = 0; for (row = 0; row < nrows; row++) { G_percent(row, nrows, 1); northing = window.north - (row + .5) * window.ns_res; for (col = 0; col < ncols; col++) { seg_get(&aspflag, (char *)&af, row, col); cseg_get(&bas, &curr_basin, row, col); if (curr_basin == 0) cseg_put(&bas, &no_basin, row, col); cseg_get(&haf, &curr_basin, row, col); if (curr_basin == 0) cseg_put(&haf, &no_basin, row, col); is_swale = FLAG_GET(af.flag, SWALEFLAG); if (af.asp <= 0 && is_swale > 0) { basin_num += 2; if (arm_flag) { easting = window.west + (col + .5) * window.ew_res; fprintf(fp, "%5d drains into %5d at %3d %3d %.3f %.3f", (int)basin_num, 0, row, col, easting, northing); if (col == 0 || col == ncols - 1) { stream_length = .5 * window.ew_res; } else if (row == 0 || row == nrows - 1) { stream_length = .5 * window.ns_res; } else { stream_length = 0.0; } seg_get(&watalt, (char *) &wa, row, col); old_elev = wa.ele; } basin_num = def_basin(row, col, basin_num, stream_length, old_elev); } } } G_percent(nrows, nrows, 1); /* finish it */ n_basins = basin_num; G_free(ocs); return 0; }
int slope_length(int r, int c, int dr, int dc) { CELL top_alt, bot_alt, ridge; char asp_value; double res, top_ls, bot_ls; WAT_ALT wa; if (sides == 8) { if (r == dr) res = window.ns_res; else if (c == dc) res = window.ew_res; else res = diag; } else { /* sides == 4 */ bseg_get(&asp, &asp_value, dr, dc); if (r == dr) { if (asp_value == 2 || asp_value == 6) res = window.ns_res; else /* asp_value == 4, 8, -2, -4, -6, or -8 */ res = diag; /* how can res be diag with sides == 4??? */ } else { /* c == dc */ if (asp_value == 4 || asp_value == 8) res = window.ew_res; else /* asp_value == 2, 6, -2, -4, -6, or -8 */ res = diag; } } dseg_get(&s_l, &top_ls, r, c); if (top_ls == half_res) top_ls = res; else top_ls += res; dseg_put(&s_l, &top_ls, r, c); seg_get(&watalt, (char *) &wa, r, c); top_alt = wa.ele; seg_get(&watalt, (char *) &wa, dr, dc); bot_alt = wa.ele; if (top_alt > bot_alt) { dseg_get(&s_l, &bot_ls, dr, dc); if (top_ls > bot_ls) { bot_ls = top_ls + res; dseg_put(&s_l, &bot_ls, dr, dc); cseg_get(&r_h, &ridge, r, c); cseg_put(&r_h, &ridge, dr, dc); } } return 0; }
int overland_cells(int row, int col, CELL basin_num, CELL haf_num, CELL * hih_ele) { int r, rr, c, cc; CELL new_ele, new_max_ele, value; cseg_put(&bas, &basin_num, row, col); cseg_put(&haf, &haf_num, row, col); new_max_ele = BIGNEG; for (r = row - 1, rr = 0; r <= row + 1; r++, rr++) { for (c = col - 1, cc = 0; c <= col + 1; c++, cc++) { if (r >= 0 && c >= 0 && r < nrows && c < ncols) { cseg_get(&asp, &value, r, c); if (value == drain[rr][cc]) { if (r != row && c != col) { overland_cells(r, c, basin_num, haf_num, &new_ele); } else if (r != row) { overland_cells(r, c, basin_num, haf_num, &new_ele); } else { overland_cells(r, c, basin_num, haf_num, &new_ele); } } } } } if (new_max_ele == BIGNEG) { cseg_get(&alt, hih_ele, row, col); } else { *hih_ele = new_max_ele; } return 0; }
int thin_seg(int stream_id) { int thinned = 0; int r, c, r_nbr, c_nbr, last_r, last_c; CELL curr_stream, no_stream = 0; int asp_r[9] = { 0, -1, -1, -1, 0, 1, 1, 1, 0 }; int asp_c[9] = { 0, 1, 0, -1, -1, -1, 0, 1, 1 }; ASP_FLAG af; r = stream_node[stream_id].r; c = stream_node[stream_id].c; cseg_get(&stream, &curr_stream, r, c); seg_get(&aspflag, (char *)&af, r, c); if (af.asp > 0) { /* get downstream point */ last_r = r + asp_r[(int)af.asp]; last_c = c + asp_c[(int)af.asp]; cseg_get(&stream, &curr_stream, last_r, last_c); if (curr_stream != stream_id) return thinned; /* get next downstream point */ seg_get(&aspflag, (char *)&af, last_r, last_c); while (af.asp > 0) { r_nbr = last_r + asp_r[(int)af.asp]; c_nbr = last_c + asp_c[(int)af.asp]; if (r_nbr == last_r && c_nbr == last_c) return thinned; if (r_nbr < 0 || r_nbr >= nrows || c_nbr < 0 || c_nbr >= ncols) return thinned; cseg_get(&stream, &curr_stream, r_nbr, c_nbr); if (curr_stream != stream_id) return thinned; if (abs(r_nbr - r) < 2 && abs(c_nbr - c) < 2) { /* eliminate last point */ cseg_put(&stream, &no_stream, last_r, last_c); FLAG_UNSET(af.flag, STREAMFLAG); seg_put(&aspflag, (char *)&af, last_r, last_c); /* update start point */ seg_get(&aspflag, (char *)&af, r, c); af.asp = drain[r - r_nbr + 1][c - c_nbr + 1]; seg_put(&aspflag, (char *)&af, r, c); thinned = 1; } else { /* nothing to eliminate, continue from last point */ r = last_r; c = last_c; } last_r = r_nbr; last_c = c_nbr; seg_get(&aspflag, (char *)&af, last_r, last_c); } } return thinned; }