exag.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*!
  2. \file lib/nviz/exag.c
  3. \brief Nviz library -- Exaggeration functions
  4. Based on visualization/nviz/src/exag.c
  5. (C) 2008, 2010 by the GRASS Development Team
  6. This program is free software under the GNU General Public License
  7. (>=v2). Read the file COPYING that comes with GRASS for details.
  8. \author Updated/modified by Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
  9. */
  10. #include <grass/nviz.h>
  11. /*!
  12. \brief Get view height
  13. Call after initial data has been loaded
  14. \param[out] val height value
  15. \param[out] min min value (or NULL)
  16. \param[out] max max value (or NULL)
  17. \return 1
  18. */
  19. int Nviz_get_exag_height(double *val, double *min, double *max)
  20. {
  21. float longdim, exag, texag, hmin, hmax, fmin, fmax;
  22. int nsurfs, i, *surf_list;
  23. surf_list = GS_get_surf_list(&nsurfs);
  24. if (nsurfs) {
  25. GS_get_longdim(&longdim);
  26. GS_get_zrange_nz(&hmin, &hmax);
  27. exag = 0.0;
  28. for (i = 0; i < nsurfs; i++) {
  29. if (GS_get_exag_guess(surf_list[i], &texag) > -1)
  30. if (texag)
  31. exag = texag > exag ? texag : exag;
  32. }
  33. if (exag == 0.0)
  34. exag = 1.0;
  35. fmin = hmin - (2. * longdim / exag);
  36. fmax = hmin + (3 * longdim / exag);
  37. }
  38. else {
  39. fmax = 10000.0;
  40. fmin = 0.0;
  41. }
  42. *val = fmin + (fmax - fmin) / 2.0;
  43. if (min)
  44. *min = fmin;
  45. if (max)
  46. *max = fmax;
  47. G_debug(1, "Nviz_get_exag_height(): value = %f min = %f max = %f",
  48. *val, min ? *min : 0.0 , max ? *max : 0.0);
  49. return 1;
  50. }
  51. /*!
  52. \brief Get view z-exag value
  53. Call after initial data has been loaded
  54. \return value
  55. */
  56. double Nviz_get_exag()
  57. {
  58. float exag, texag;
  59. int nsurfs, i, *surf_list;
  60. surf_list = GS_get_surf_list(&nsurfs);
  61. exag = 0.0;
  62. for (i = 0; i < nsurfs; i++) {
  63. if (GS_get_exag_guess(surf_list[i], &texag) > -1) {
  64. if (texag)
  65. exag = (texag > exag) ? texag : exag;
  66. }
  67. }
  68. if (exag == 0.0)
  69. exag = 1.0;
  70. if (nsurfs > 0)
  71. G_free(surf_list);
  72. G_debug(1, "Nviz_get_exag(): value = %f", exag);
  73. return exag;
  74. }