def_basin.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "Gwater.h"
  2. CELL def_basin(int row, int col, CELL basin_num,
  3. double stream_length, CELL old_elev)
  4. {
  5. int r, rr, c, cc, ct, new_r[9], new_c[9];
  6. CELL downdir, direction, asp_value, value, new_elev;
  7. int oldupdir, riteflag, leftflag, thisdir;
  8. for (;;) {
  9. bas[SEG_INDEX(bas_seg, row, col)] = basin_num;
  10. FLAG_SET(swale, row, col);
  11. ct = 0;
  12. for (r = row - 1, rr = 0; rr < 3; r++, rr++) {
  13. for (c = col - 1, cc = 0; cc < 3; c++, cc++) {
  14. if (r >= 0 && c >= 0 && r < nrows && c < ncols) {
  15. if (r == row && c == col)
  16. continue;
  17. value = asp[SEG_INDEX(asp_seg, r, c)];
  18. if (value < 0)
  19. value = -value;
  20. if (value == drain[rr][cc]) {
  21. value = FLAG_GET(swale, r, c);
  22. if (value) {
  23. new_r[++ct] = r;
  24. new_c[ct] = c;
  25. }
  26. }
  27. }
  28. }
  29. }
  30. if (ct == 0) {
  31. no_stream(row, col, basin_num, stream_length, old_elev);
  32. return (basin_num);
  33. }
  34. if (ct >= 2) {
  35. basin_num = split_stream(row, col, new_r, new_c, ct,
  36. basin_num, stream_length, old_elev);
  37. return (basin_num);
  38. }
  39. oldupdir = drain[row - new_r[1] + 1][col - new_c[1] + 1];
  40. downdir = asp[SEG_INDEX(asp_seg, row, col)];
  41. if (downdir < 0)
  42. downdir = -downdir;
  43. riteflag = leftflag = 0;
  44. for (r = row - 1, rr = 0; rr < 3; r++, rr++) {
  45. for (c = col - 1, cc = 0; cc < 3; c++, cc++) {
  46. if (r >= 0 && c >= 0 && r < nrows && c < ncols) {
  47. if (r == row && c == col)
  48. continue;
  49. direction = asp[SEG_INDEX(asp_seg, r, c)];
  50. if (direction == drain[rr][cc]) {
  51. thisdir = updrain[rr][cc];
  52. switch (haf_basin_side
  53. (oldupdir, downdir, thisdir)) {
  54. case LEFT:
  55. overland_cells(r, c, basin_num, basin_num - 1,
  56. &new_elev);
  57. leftflag++;
  58. break;
  59. case RITE:
  60. overland_cells(r, c, basin_num, basin_num,
  61. &new_elev);
  62. riteflag++;
  63. break;
  64. }
  65. }
  66. }
  67. }
  68. }
  69. if (leftflag > riteflag)
  70. haf[SEG_INDEX(haf_seg, row, col)] = basin_num - 1;
  71. else
  72. haf[SEG_INDEX(haf_seg, row, col)] = basin_num;
  73. if (sides == 8) {
  74. if (new_r[1] != row && new_c[1] != col)
  75. stream_length += diag;
  76. else if (new_r[1] != row)
  77. stream_length += window.ns_res;
  78. else
  79. stream_length += window.ew_res;
  80. }
  81. else { /* sides == 4 */
  82. asp_value = asp[SEG_INDEX(asp_seg, row, col)];
  83. if (asp_value < 0)
  84. asp_value = -asp_value;
  85. if (asp_value == 2 || asp_value == 6) {
  86. if (new_r[1] != row)
  87. stream_length += window.ns_res;
  88. else
  89. stream_length += diag;
  90. }
  91. else { /* asp_value == 4, 8 */
  92. if (new_c[1] != col)
  93. stream_length += window.ew_res;
  94. else
  95. stream_length += diag;
  96. }
  97. }
  98. row = new_r[1];
  99. col = new_c[1];
  100. }
  101. }