find_con.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include <math.h>
  2. #include "contour.h"
  3. int find_con(int r, int c, double *d1, double *d2, DCELL * con1, DCELL * con2)
  4. {
  5. int ct, low_ct, node_ct;
  6. int rr, cc, dor, doc;
  7. double dd, shortest;
  8. DCELL value;
  9. Rast_set_d_null_value(con1, 1);
  10. Rast_set_d_null_value(con2, 1);
  11. *d1 = *d2 = 1.0;
  12. shortest = nrows * ncols;
  13. for (rr = minr; rr <= maxr; rr++) {
  14. for (cc = minc; cc <= maxc; cc++)
  15. FLAG_UNSET(seen, rr, cc);
  16. }
  17. minr = nrows;
  18. minc = ncols;
  19. maxr = maxc = -1;
  20. FLAG_SET(seen, r, c);
  21. if (r < minr)
  22. minr = r;
  23. if (r > maxr)
  24. maxr = r;
  25. if (c < minc)
  26. minc = c;
  27. if (c > maxc)
  28. maxc = c;
  29. node_ct = 0;
  30. zero = addpts(zero, r, c, r, c, &node_ct);
  31. low_ct = 0;
  32. while (1) {
  33. ct = low_ct++;
  34. if (node_ct <= ct)
  35. return 1;
  36. rr = zero[ct].r;
  37. cc = zero[ct].c;
  38. dor = ABS(rr - r);
  39. doc = ABS(cc - c);
  40. if (rr >= 0 && cc >= 0 && rr < nrows && cc < ncols
  41. && zero[ct].d < shortest && !flag_get(mask, rr, cc)) {
  42. value = con[rr][cc];
  43. if (Rast_is_d_null_value(&value))
  44. zero = addpts(zero, r, c, rr, cc, &node_ct);
  45. else if (Rast_is_d_null_value(con1)) {
  46. *con1 = value;
  47. *d1 = MIN(dor, doc) * 1.414 + ABS(dor - doc);
  48. shortest = *d1 * 2.0 * i_val_l_f;
  49. }
  50. else if (*con1 == value) {
  51. dd = MIN(dor, doc) * 1.414 + ABS(dor - doc);
  52. if (dd < *d1) {
  53. *d1 = dd;
  54. shortest = dd * 2.0 * i_val_l_f;
  55. }
  56. }
  57. else if (Rast_is_d_null_value(con2)) {
  58. *con2 = value;
  59. *d2 = MIN(dor, doc) * 1.414 + ABS(dor - doc);
  60. shortest = *d2;
  61. }
  62. else {
  63. dd = MIN(dor, doc) * 1.414 + ABS(dor - doc);
  64. shortest = MIN(shortest, dd);
  65. }
  66. }
  67. }
  68. return 0;
  69. }