GRASS GIS 8 Programmer's Manual  8.5.0dev(2025)-bab037a530
exag.c
Go to the documentation of this file.
1 /*!
2  \file lib/nviz/exag.c
3 
4  \brief Nviz library -- Exaggeration functions
5 
6  Based on visualization/nviz/src/exag.c
7 
8  (C) 2008, 2010 by the GRASS Development Team
9  This program is free software under the GNU General Public License
10  (>=v2). Read the file COPYING that comes with GRASS for details.
11 
12  \author Updated/modified by Martin Landa <landa.martin gmail.com> (Google SoC
13  2008/2010)
14  */
15 
16 #include <grass/nviz.h>
17 
18 /*!
19  \brief Get view height
20 
21  Call after initial data has been loaded
22 
23  \param[out] val height value
24  \param[out] min min value (or NULL)
25  \param[out] max max value (or NULL)
26 
27  \return 1
28  */
29 int Nviz_get_exag_height(double *val, double *min, double *max)
30 {
31  float longdim, exag, texag, hmin, hmax, fmin, fmax;
32  int nsurfs, i;
33  int *surf_list = NULL;
34 
35  surf_list = GS_get_surf_list(&nsurfs);
36  if (nsurfs) {
37  GS_get_longdim(&longdim);
38  GS_get_zrange_nz(&hmin, &hmax);
39 
40  exag = 0.0;
41  for (i = 0; i < nsurfs; i++) {
42  if (GS_get_exag_guess(surf_list[i], &texag) > -1)
43  if (texag)
44  exag = texag > exag ? texag : exag;
45  }
46  if (exag == 0.0)
47  exag = 1.0;
48 
49  fmin = hmin - (2. * longdim / exag);
50  fmax = hmin + (3 * longdim / exag);
51  }
52  else {
53  fmax = 10000.0;
54  fmin = 0.0;
55  }
56 
57  *val = fmin + (fmax - fmin) / 2.0;
58 
59  if (min)
60  *min = fmin;
61 
62  if (max)
63  *max = fmax;
64 
65  G_debug(1, "Nviz_get_exag_height(): value = %f min = %f max = %f", *val,
66  min ? *min : 0.0, max ? *max : 0.0);
67  G_free(surf_list);
68 
69  return 1;
70 }
71 
72 /*!
73  \brief Get view z-exag value
74 
75  Call after initial data has been loaded
76 
77  \return value
78  */
79 double Nviz_get_exag(void)
80 {
81  float exag, texag;
82  int nsurfs, i;
83  int *surf_list = NULL;
84 
85  surf_list = GS_get_surf_list(&nsurfs);
86 
87  exag = 0.0;
88  for (i = 0; i < nsurfs; i++) {
89  if (GS_get_exag_guess(surf_list[i], &texag) > -1) {
90  if (texag)
91  exag = (texag > exag) ? texag : exag;
92  }
93  }
94 
95  if (exag == 0.0)
96  exag = 1.0;
97  G_free(surf_list);
98 
99  G_debug(1, "Nviz_get_exag(): value = %f", exag);
100  return exag;
101 }
#define NULL
Definition: ccmath.h:32
void G_free(void *)
Free allocated memory.
Definition: gis/alloc.c:150
int G_debug(int, const char *,...) __attribute__((format(printf
int * GS_get_surf_list(int *)
Get surface list.
Definition: gs2.c:1530
int GS_get_longdim(float *)
Get largest dimension.
Definition: gs2.c:140
void GS_get_zrange_nz(float *, float *)
Get Z extents for all loaded surfaces.
Definition: gs2.c:2355
int GS_get_exag_guess(int, float *)
Get exag-value guess.
Definition: gs2.c:2304
#define min(x, y)
Definition: draw2.c:29
#define max(x, y)
Definition: draw2.c:30
int Nviz_get_exag_height(double *val, double *min, double *max)
Get view height.
Definition: exag.c:29
double Nviz_get_exag(void)
Get view z-exag value.
Definition: exag.c:79