getg.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /* Name: getg.c
  2. *
  3. * Created: Thu May 29 00:37:44 1986
  4. * Last modified: Sat May 31 20:34:30 1986
  5. *
  6. * Purpose: Get the laplacian of a Gaussian (not normalized).
  7. *
  8. * Author: Bill Hoff,2-114C,8645,3563478 (hoff) at uicsl
  9. */
  10. #include <stdio.h>
  11. #include <math.h>
  12. #include <grass/gmath.h>
  13. int
  14. getg (double w, double *g[2], int size)
  15. {
  16. long i, j, totsize, n, g_row;
  17. float rsq, sigma, two_ssq, val, sum = 0.0;
  18. totsize = size*size;
  19. n = size/2;
  20. for (i=0; i < totsize; i++)
  21. { *(g[0]+i) = 0.0; *(g[1]+i) = 0.0;}
  22. sigma = w / (2.0*sqrt((double) 2.0));
  23. two_ssq = 2.0*sigma*sigma;
  24. for (i=0; i < n; i++) {
  25. g_row = i*size; /* start of row */
  26. for (j=0; j < n; j++) {
  27. rsq = i*i + j*j;
  28. val = (rsq/two_ssq - 1)*exp(-rsq/two_ssq);
  29. *(g[0]+g_row+j) = val;
  30. sum += val;
  31. /* reflect into other quadrants */
  32. if (j > 0) {
  33. *(g[0]+g_row+(size-j)) = val;
  34. sum += val;
  35. }
  36. if (i > 0) {
  37. *(g[0]+(size-i)*size+j) = val;
  38. sum += val;
  39. }
  40. if (i > 0 && j > 0) {
  41. *(g[0]+(size-i)*size+(size-j)) = val;
  42. sum += val;
  43. }
  44. }
  45. }
  46. *(g[0]+0) -= sum; /* make sure sum of all values is zero */
  47. return 0;
  48. }