GRASS 8 Programmer's Manual 8.6.0dev(2026)-56a9afeb9f
Loading...
Searching...
No Matches
gpd.c
Go to the documentation of this file.
1/*!
2 \file lib/ogsf/gpd.c
3
4 \brief OGSF library - loading and manipulating point sets (lower level)
5
6 (C) 1999-2008, 2011 by the GRASS Development Team
7
8 This program is free software under the GNU General Public License
9 (>=v2). Read the file COPYING that comes with GRASS for details.
10
11 \author Bill Brown USACERL, GMSL/University of Illinois (December 1993)
12 \author Doxygenized by Martin Landa <landa.martin gmail.com> (May 2008)
13 */
14
15#include <stdlib.h>
16#include <math.h>
17
18#include <grass/ogsf.h>
19
20#include "rowcol.h"
21
22#define CHK_FREQ 50
23
24/* BOB -- border allowed outside of viewport */
25#define v_border 50
26
27/*!
28 \brief Check if point is in region
29
30 Check for cancel every CHK_FREQ points
31
32 \param gs surface (geosurf)
33 \param pt point (array(X,Y,Z))
34 \param region region settings (array (top,bottom,left,right))
35
36 \return 0 point outside of region
37 \return 1 point inside region
38 */
39int gs_point_in_region(geosurf *gs, float *pt, float *region)
40{
41 float top, bottom, left, right;
42
43 if (!region) {
44 top = gs->yrange;
45 bottom = VROW2Y(gs, VROWS(gs));
46 left = 0.0;
47 right = VCOL2X(gs, VCOLS(gs));
48 }
49 else {
50 top = region[0];
51 bottom = region[1];
52 left = region[2];
53 right = region[3];
54 }
55
56 return (pt[X] >= left && pt[X] <= right && pt[Y] >= bottom && pt[Y] <= top);
57}
58
59/*!
60 \brief Draw point representing object
61
62 Do normal transforms before calling
63
64 Note gs: NULL if 3d obj or const elev surface
65
66 \param gs surface (geosurf)
67 \param style object displaying style (highlighted or not)
68 \param pt 3d point (Point3)
69 */
71{
72 float sz, lpt[3];
73 float siz[3];
74
75 gsd_color_func(style->color);
76 sz = GS_global_exag();
77 GS_v3eq(lpt, pt); /* CHANGING Z OF POINT PASSED, so use copy */
78
79 switch (style->symbol) {
80 case ST_HISTOGRAM:
83
84 if (sz) {
85 lpt[Z] *= sz;
86 gsd_scale(1.0, 1.0, 1. / sz);
87 }
88
89 siz[0] = style->size; /*TODO: Fix historgam drawing */
90 siz[1] = style->size;
91 siz[2] = style->size;
92
93 gsd_box(lpt, style->color, siz);
94
97
98 break;
99 case ST_DIAMOND:
100 /*
101 gsd_colormode(CM_AD);
102 */
105
106 if (sz) {
107 lpt[Z] *= sz;
108 gsd_scale(1.0, 1.0, 1. / sz);
109 }
110
111 gsd_diamond(lpt, style->color, style->size);
114
115 break;
116 case ST_BOX:
119
120 if (sz) {
121 lpt[Z] *= sz;
122 gsd_scale(1.0, 1.0, 1. / sz);
123 }
124
125 gsd_draw_box(lpt, style->color, style->size);
127
128 break;
129 case ST_SPHERE:
130 /*
131 gsd_colormode(CM_AD);
132 */
135
136 if (sz) {
137 lpt[Z] *= sz;
138 gsd_scale(1.0, 1.0, 1. / sz);
139 }
140
141 gsd_sphere(lpt, style->size);
144
145 break;
146 case ST_GYRO:
149
150 if (sz) {
151 lpt[Z] *= sz;
152 gsd_scale(1.0, 1.0, 1. / sz);
153 }
154
155 gsd_draw_gyro(lpt, style->color, style->size);
157
158 break;
159 case ST_ASTER:
162
163 if (sz) {
164 lpt[Z] *= sz;
165 gsd_scale(1.0, 1.0, 1. / sz);
166 }
167
168 gsd_draw_asterisk(lpt, style->color, style->size);
170
171 break;
172 case ST_CUBE:
175
176 if (sz) {
177 lpt[Z] *= sz;
178 gsd_scale(1.0, 1.0, 1. / sz);
179 }
180
181 gsd_cube(lpt, style->color, style->size);
184
185 break;
186 default:
187 case ST_X:
189 gsd_x(gs, lpt, style->color, style->size);
190
191 break;
192 }
193
194 return;
195}
196
197/*!
198 \brief Draw 2D point set
199
200 Need to think about translations - If user translates surface,
201 sites should automatically go with it, but translating sites should
202 translate it relative to surface on which it's displayed
203
204 Handling mask checking here
205
206 \todo prevent scaling by 0
207
208 \param gp site (geosite)
209 \param gs surface (geosurf)
210 \param do_fast (unused)
211
212 \return 0 on failure
213 \return 1 on success
214 */
216{
217 float site[4], konst;
218 int src, check;
219 geopoint *gpt;
220 typbuff *buf;
222 GLint viewport[4];
223 GLint window[4];
224
225 if (GS_check_cancel()) {
226 return 0;
227 }
228
229 if (!gs)
230 return 1;
231
233
234 src = gs_get_att_src(gs, ATT_TOPO);
235
236 if (src == CONST_ATT) {
237 konst = gs->att[ATT_TOPO].constant;
238 }
239 else {
240 buf = gs_get_att_typbuff(gs, ATT_TOPO, 0);
241 }
242
243 /* Get viewport parameters for view check */
245
247 gsd_do_scale(1);
248 gsd_translate(gs->x_trans, gs->y_trans, gs->z_trans);
249 gsd_linewidth(gp->style->width);
250 check = 0;
251
252 for (gpt = gp->points; gpt; gpt = gpt->next) {
253 if (!(++check % CHK_FREQ)) {
254 if (GS_check_cancel()) {
255 gsd_linewidth(1);
257
258 return 0;
259 }
260 }
261
262 site[X] = gpt->p3[X] + gp->x_trans - gs->ox;
263 site[Y] = gpt->p3[Y] + gp->y_trans - gs->oy;
264
265 if (gs_point_is_masked(gs, site)) {
266 continue;
267 }
268
269 if (src == MAP_ATT) {
270 if (viewcell_tri_interp(gs, buf, site, 1)) {
271 /* returns 0 if outside or masked */
272 site[Z] += gp->z_trans;
273
275 projMatrix))
276 continue;
277 }
278 }
279 else if (src == CONST_ATT) {
281 site[Z] = konst + gp->z_trans;
283 projMatrix))
284 continue;
285 }
286 }
287
288 if (gpt->highlighted > 0)
289 gpd_obj(gs, gp->hstyle, site);
290 else if (gp->tstyle && gp->tstyle->active)
291 gpd_obj(gs, gpt->style, site);
292 else
293 gpd_obj(gs, gp->style, site);
294 }
295
296 gsd_linewidth(1);
298
299 return 1;
300}
301
302/*!
303 \brief Draw 3D point set
304
305 \param gp site (geosite)
306 \param xo,yo
307 \param do_fast (unused)
308
309 \return 0 on success
310 \return 1 on failure
311 */
312int gpd_3dsite(geosite *gp, float xo, float yo, int do_fast UNUSED)
313{
314 float site[4], tz;
315 int check;
316 geopoint *gpt;
318 GLint viewport[4];
319 GLint window[4];
320
321 if (GS_check_cancel()) {
322 return 0;
323 }
324
326
328
329 gsd_do_scale(1);
330
331 tz = GS_global_exag();
332 site[Z] = 0.0;
333
334 check = 0;
335
336 gsd_linewidth(gp->style->width);
337
338 for (gpt = gp->points; gpt; gpt = gpt->next) {
339 if (!(++check % CHK_FREQ)) {
340 if (GS_check_cancel()) {
341 gsd_linewidth(1);
343
344 return (0);
345 }
346 }
347
348 site[X] = gpt->p3[X] + gp->x_trans - xo;
349 site[Y] = gpt->p3[Y] + gp->y_trans - yo;
350
351 if (tz) {
352 site[Z] = gpt->p3[Z] + gp->z_trans;
353 }
354
356 continue;
357 else
358 /* clip points outside default region? */
359 {
360 if (gpt->highlighted > 0)
361 gpd_obj(NULL, gp->hstyle, site);
362 else if (gp->tstyle && gp->tstyle->active)
363 gpd_obj(NULL, gpt->style, site);
364 else
365 gpd_obj(NULL, gp->style, site);
366 }
367 }
368
369 gsd_linewidth(1);
371
372 return 1;
373}
#define NULL
Definition ccmath.h:32
void gsd_cube(float *, unsigned long, float)
Draws a cube symbol at the specified center location.
Definition gsd_objs.c:422
int gs_point_is_masked(geosurf *, float *)
Check if point is masked.
Definition gs.c:1314
void gsd_diamond(float *, unsigned long, float)
Draws a diamond symbol at the specified center location.
Definition gsd_objs.c:316
void gsd_pushmatrix(void)
Push the current matrix stack.
Definition gsd_prim.c:511
void gsd_box(float *, int, float *)
Draws a box at the specified center location.
Definition gsd_objs.c:1475
void gsd_scale(float, float, float)
Multiply the current matrix by a general scaling matrix.
Definition gsd_prim.c:525
void gsd_getwindow(int *, int *, double *, double *)
Get viewport.
Definition gsd_prim.c:554
void gsd_do_scale(int)
Set current scale.
Definition gsd_views.c:355
void gsd_x(geosurf *, float *, int, float)
Draws a X symbol at the specified center location.
Definition gsd_objs.c:263
void gsd_draw_box(float *, unsigned long, float)
Draws a box symbol at the specified center location.
Definition gsd_objs.c:502
void gsd_sphere(float *, float)
ADD.
Definition gsd_prim.c:207
int gs_get_att_src(geosurf *, int)
Get attribute source.
Definition gs.c:656
int gsd_checkpoint(float[4], int[4], int[4], double[16], double[16])
ADD.
Definition gsd_prim.c:585
void GS_v3eq(float *, float *)
Copy vector values.
Definition gs_util.c:178
void gsd_draw_gyro(float *, unsigned long, float)
Draws a gyro symbol at the specified center location.
Definition gsd_objs.c:667
int gs_update_curmask(geosurf *)
Update current maps.
Definition gs_bm.c:228
void gsd_color_func(unsigned int)
Set current color.
Definition gsd_prim.c:698
void gsd_translate(float, float, float)
Multiply the current matrix by a translation matrix.
Definition gsd_prim.c:539
void gsd_popmatrix(void)
Pop the current matrix stack.
Definition gsd_prim.c:501
void gsd_linewidth(short)
Set width of rasterized lines.
Definition gsd_prim.c:267
int viewcell_tri_interp(geosurf *, typbuff *, Point3, int)
ADD.
Definition gsdrape.c:509
void gsd_colormode(int)
Set color mode.
Definition gsd_prim.c:98
typbuff * gs_get_att_typbuff(geosurf *, int, int)
Get attribute data buffer.
Definition gs.c:681
void gsd_draw_asterisk(float *, unsigned long, float)
Draws an asterisk symbol at the specified center location.
Definition gsd_objs.c:608
int GS_check_cancel(void)
Check for cancel.
Definition gsx.c:30
float GS_global_exag(void)
Get global z-exag value.
Definition gs2.c:2000
#define UNUSED
A macro for an attribute, if attached to a variable, indicating that the variable is not used.
Definition gis.h:46
#define CHK_FREQ
Definition gpd.c:22
void gpd_obj(geosurf *gs, gvstyle *style, Point3 pt)
Draw point representing object.
Definition gpd.c:70
int gpd_3dsite(geosite *gp, float xo, float yo, int do_fast)
Draw 3D point set.
Definition gpd.c:312
int gs_point_in_region(geosurf *gs, float *pt, float *region)
Check if point is in region.
Definition gpd.c:39
int gpd_2dsite(geosite *gp, geosurf *gs, int do_fast)
Draw 2D point set.
Definition gpd.c:215
OGSF header file (structures)
#define CM_DIFFUSE
Definition ogsf.h:151
#define X
Definition ogsf.h:140
#define ST_CUBE
Definition ogsf.h:95
#define ATT_TOPO
Definition ogsf.h:75
#define ST_GYRO
Definition ogsf.h:100
float Point3[3]
Definition ogsf.h:205
#define ST_BOX
Definition ogsf.h:93
#define Z
Definition ogsf.h:142
#define ST_SPHERE
Definition ogsf.h:94
#define Y
Definition ogsf.h:141
#define MAP_ATT
Definition ogsf.h:85
#define CM_COLOR
Definition ogsf.h:148
#define ST_HISTOGRAM
Definition ogsf.h:101
#define ST_DIAMOND
Definition ogsf.h:96
#define CONST_ATT
Definition ogsf.h:86
#define ST_ASTER
Definition ogsf.h:99
#define ST_X
Definition ogsf.h:92
#define VCOL2X(gs, vcol)
Definition rowcol.h:40
#define VCOLS(gs)
Definition rowcol.h:14
#define VROWS(gs)
Definition rowcol.h:13
#define VROW2Y(gs, vrow)
Definition rowcol.h:39
Point instance.
Definition ogsf.h:400
Vector map (points)
Definition ogsf.h:415
Definition ogsf.h:266
Struct for vector feature displaying attributes.
Definition ogsf.h:307
int color
Line color.
Definition ogsf.h:309
int symbol
Point symbol/line type.
Definition ogsf.h:312
float size
Symbol size.
Definition ogsf.h:318