secpar2d.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*-
  2. * Written by H. Mitasova, L. Mitas, I. Kosinovsky, D. Gerdes Fall 1994
  3. * University of Illinois
  4. * US Army Construction Engineering Research Lab
  5. * Copyright 1994, H. Mitasova (University of Illinois),
  6. * L. Mitas (University of Illinois),
  7. * I. Kosinovsky, (USA-CERL), and D.Gerdes (USA-CERL)
  8. *
  9. * modified by McCauley in August 1995
  10. * modified by Mitasova in August 1995
  11. *
  12. */
  13. #include <stdio.h>
  14. #include <math.h>
  15. #include <unistd.h>
  16. #include <grass/gis.h>
  17. #include <grass/bitmap.h>
  18. #include <grass/interpf.h>
  19. int IL_secpar_loop_2d(struct interp_params *params, int ngstc, /* starting column */
  20. int nszc, /* ending column */
  21. int k, /* current row */
  22. struct BM *bitmask, double *gmin, double *gmax, double *c1min, double *c1max, double *c2min, double *c2max, /* min,max interp.
  23. * values */
  24. int cond1, int cond2 /* determine if particular values need to
  25. * be computed */
  26. )
  27. /*
  28. * Computes slope, aspect and curvatures (depending on cond1, cond2) for
  29. * derivative arrays adx,...,adxy between columns ngstc and nszc.
  30. */
  31. {
  32. double dnorm1, ro, /* rad to deg conv */
  33. dx2 = 0, dy2 = 0, grad2 = 0, /* gradient squared */
  34. slp = 0, grad, /* gradient */
  35. oor = 0, /* aspect (orientation) */
  36. curn = 0, /* profile curvature */
  37. curh = 0, /* tangential curvature */
  38. curm = 0, /* mean curvature */
  39. temp, /* temp variable */
  40. dxy2; /* temp variable square of part diriv. */
  41. double gradmin;
  42. int i, got, bmask = 1;
  43. static int first_time_g = 1;
  44. ro = 57.295779;
  45. gradmin = 0.001;
  46. for (i = ngstc; i <= nszc; i++) {
  47. if (bitmask != NULL) {
  48. bmask = BM_get(bitmask, i, k);
  49. }
  50. got = 0;
  51. if (bmask == 1) {
  52. while ((got == 0) && (cond1)) {
  53. dx2 = (double)(params->adx[i] * params->adx[i]);
  54. dy2 = (double)(params->ady[i] * params->ady[i]);
  55. grad2 = dx2 + dy2;
  56. grad = sqrt(grad2);
  57. /* slope in % slp = 100. * grad; */
  58. /* slope in degrees */
  59. slp = ro * atan(grad);
  60. if (grad <= gradmin) {
  61. oor = 0.;
  62. got = 3;
  63. if (cond2) {
  64. curn = 0.;
  65. curh = 0.;
  66. got = 3;
  67. break;
  68. }
  69. }
  70. if (got == 3)
  71. break;
  72. /***********aspect from r.slope.aspect, with adx, ady computed
  73. from interpol. function RST **************************/
  74. if (params->adx[i] == 0.) {
  75. if (params->ady[i] > 0.)
  76. oor = 90;
  77. else
  78. oor = 270;
  79. }
  80. else {
  81. oor = ro * atan2(params->ady[i], params->adx[i]);
  82. if (oor <= 0.)
  83. oor = 360. + oor;
  84. }
  85. got = 1;
  86. } /* while */
  87. if ((got != 3) && (cond2)) {
  88. dnorm1 = sqrt(grad2 + 1.);
  89. dxy2 =
  90. 2. * (double)(params->adxy[i] * params->adx[i] *
  91. params->ady[i]);
  92. curn =
  93. (double)(params->adxx[i] * dx2 + dxy2 +
  94. params->adyy[i] * dy2) / (grad2 * dnorm1 *
  95. dnorm1 * dnorm1);
  96. curh =
  97. (double)(params->adxx[i] * dy2 - dxy2 +
  98. params->adyy[i] * dx2) / (grad2 * dnorm1);
  99. temp = grad2 + 1.;
  100. curm =
  101. .5 * ((1. + dy2) * params->adxx[i] - dxy2 +
  102. (1. + dx2) * params->adyy[i]) / (temp * dnorm1);
  103. }
  104. if (first_time_g) {
  105. first_time_g = 0;
  106. *gmin = *gmax = slp;
  107. *c1min = *c1max = curn;
  108. *c2min = *c2max = curh;
  109. }
  110. *gmin = amin1(*gmin, slp);
  111. *gmax = amax1(*gmax, slp);
  112. *c1min = amin1(*c1min, curn);
  113. *c1max = amax1(*c1max, curn);
  114. *c2min = amin1(*c2min, curh);
  115. *c2max = amax1(*c2max, curh);
  116. if (cond1) {
  117. params->adx[i] = (FCELL) slp;
  118. params->ady[i] = (FCELL) oor;
  119. if (cond2) {
  120. params->adxx[i] = (FCELL) curn;
  121. params->adyy[i] = (FCELL) curh;
  122. params->adxy[i] = (FCELL) curm;
  123. }
  124. }
  125. } /* bmask == 1 */
  126. }
  127. return 1;
  128. }