GRASS Programmer's Manual 6.4.1(2011)
|
00001 00017 #include <stdlib.h> 00018 #include <grass/Vect.h> 00019 00020 static int add_line(struct Plus_head *plus, int lineid, int type, struct line_pnts *Points, 00021 long offset) 00022 { 00023 int node, lp; 00024 P_LINE *line; 00025 BOUND_BOX box; 00026 00027 plus->Line[lineid] = dig_alloc_line(); 00028 line = plus->Line[lineid]; 00029 00030 /* Add nodes */ 00031 G_debug(3, "Register node: type = %d, %f,%f", type, Points->x[0], 00032 Points->y[0]); 00033 00034 node = dig_find_node(plus, Points->x[0], Points->y[0], Points->z[0]); 00035 G_debug(3, "node = %d", node); 00036 if (node == 0) { 00037 node = dig_add_node(plus, Points->x[0], Points->y[0], Points->z[0]); 00038 G_debug(3, "Add new node: %d", node); 00039 } 00040 else { 00041 G_debug(3, "Old node found: %d", node); 00042 } 00043 line->N1 = node; 00044 dig_node_add_line(plus, node, lineid, Points, type); 00045 if (plus->do_uplist) 00046 dig_node_add_updated(plus, node); 00047 00048 if (type & GV_LINES) { 00049 lp = Points->n_points - 1; 00050 G_debug(3, "Register node %f,%f", Points->x[lp], Points->y[lp]); 00051 node = 00052 dig_find_node(plus, Points->x[lp], Points->y[lp], Points->z[lp]); 00053 G_debug(3, "node = %d", node); 00054 if (node == 0) { 00055 node = 00056 dig_add_node(plus, Points->x[lp], Points->y[lp], 00057 Points->z[lp]); 00058 G_debug(3, "Add new node: %d", node); 00059 } 00060 else { 00061 G_debug(3, "Old node found: %d", node); 00062 } 00063 line->N2 = node; 00064 dig_node_add_line(plus, node, -lineid, Points, type); 00065 if (plus->do_uplist) 00066 dig_node_add_updated(plus, node); 00067 } 00068 else { 00069 line->N2 = 0; 00070 } 00071 00072 line->type = type; 00073 line->offset = offset; 00074 line->left = 0; 00075 line->right = 0; 00076 line->N = 0; 00077 line->S = 0; 00078 line->E = 0; 00079 line->W = 0; 00080 00081 dig_line_box(Points, &box); 00082 dig_line_set_box(plus, lineid, &box); 00083 dig_spidx_add_line(plus, lineid, &box); 00084 if (plus->do_uplist) 00085 dig_line_add_updated(plus, lineid); 00086 00087 return (lineid); 00088 } 00089 00101 int 00102 dig_add_line(struct Plus_head *plus, int type, struct line_pnts *Points, 00103 long offset) 00104 { 00105 int ret; 00106 00107 /* First look if we have space in array of pointers to lines 00108 * and reallocate if necessary */ 00109 if (plus->n_lines >= plus->alloc_lines) { /* array is full */ 00110 if (dig_alloc_lines(plus, 1000) == -1) 00111 return -1; 00112 } 00113 00114 ret = add_line(plus, plus->n_lines + 1, type, Points, offset); 00115 00116 if (ret == -1) 00117 return ret; 00118 00119 plus->n_lines++; 00120 00121 switch (type) { 00122 case GV_POINT: 00123 plus->n_plines++; 00124 break; 00125 case GV_LINE: 00126 plus->n_llines++; 00127 break; 00128 case GV_BOUNDARY: 00129 plus->n_blines++; 00130 break; 00131 case GV_CENTROID: 00132 plus->n_clines++; 00133 break; 00134 case GV_FACE: 00135 plus->n_flines++; 00136 break; 00137 case GV_KERNEL: 00138 plus->n_klines++; 00139 break; 00140 } 00141 00142 return ret; 00143 } 00144 00156 int 00157 dig_restore_line(struct Plus_head *plus, int lineid, 00158 int type, struct line_pnts *Points, 00159 long offset) 00160 { 00161 if (lineid < 1 || lineid > plus->n_lines) { 00162 return -1; 00163 } 00164 00165 return add_line(plus, lineid, type, Points, offset); 00166 } 00167 00183 int dig_del_line(struct Plus_head *plus, int line) 00184 { 00185 int i, mv; 00186 P_LINE *Line; 00187 P_NODE *Node; 00188 00189 /* TODO: free structures */ 00190 G_debug(3, "dig_del_line() line = %d", line); 00191 00192 Line = plus->Line[line]; 00193 dig_spidx_del_line(plus, line); 00194 00195 /* Delete from nodes (and nodes) */ 00196 Node = plus->Node[Line->N1]; 00197 mv = 0; 00198 for (i = 0; i < Node->n_lines; i++) { 00199 if (mv) { 00200 Node->lines[i - 1] = Node->lines[i]; 00201 Node->angles[i - 1] = Node->angles[i]; 00202 } 00203 else { 00204 if (abs(Node->lines[i]) == line) 00205 mv = 1; 00206 } 00207 } 00208 Node->n_lines--; 00209 if (Node->n_lines == 0) { 00210 G_debug(3, " node %d has 0 lines -> delete", Line->N1); 00211 dig_spidx_del_node(plus, Line->N1); 00212 plus->Node[Line->N1] = NULL; 00213 } 00214 else { 00215 if (plus->do_uplist) 00216 dig_node_add_updated(plus, Line->N1); 00217 } 00218 00219 if (Line->type & GV_LINES) { 00220 Node = plus->Node[Line->N2]; 00221 mv = 0; 00222 for (i = 0; i < Node->n_lines; i++) { 00223 if (mv) { 00224 Node->lines[i - 1] = Node->lines[i]; 00225 Node->angles[i - 1] = Node->angles[i]; 00226 } 00227 else { 00228 if (abs(Node->lines[i]) == line) 00229 mv = 1; 00230 } 00231 } 00232 Node->n_lines--; 00233 if (Node->n_lines == 0) { 00234 G_debug(3, " node %d has 0 lines -> delete", Line->N2); 00235 dig_spidx_del_node(plus, Line->N2); 00236 plus->Node[Line->N2] = NULL; 00237 } 00238 else { 00239 if (plus->do_uplist) 00240 dig_node_add_updated(plus, Line->N2); 00241 } 00242 } 00243 00244 /* Delete line */ 00245 plus->Line[line] = NULL; 00246 00247 return 0; 00248 } 00249 00261 plus_t dig_line_get_area(struct Plus_head * plus, plus_t line, int side) 00262 { 00263 P_LINE *Line; 00264 00265 Line = plus->Line[line]; 00266 if (side == GV_LEFT) { 00267 G_debug(3, 00268 "dig_line_get_area(): line = %d, side = %d (left), area = %d", 00269 line, side, Line->left); 00270 return (Line->left); 00271 } 00272 if (side == GV_RIGHT) { 00273 G_debug(3, 00274 "dig_line_get_area(): line = %d, side = %d (right), area = %d", 00275 line, side, Line->right); 00276 00277 return (Line->right); 00278 } 00279 00280 return (-1); 00281 } 00282 00293 int 00294 dig_line_set_area(struct Plus_head *plus, plus_t line, int side, plus_t area) 00295 { 00296 P_LINE *Line; 00297 00298 Line = plus->Line[line]; 00299 if (side == GV_LEFT) { 00300 Line->left = area; 00301 } 00302 else if (side == GV_RIGHT) { 00303 Line->right = area; 00304 } 00305 00306 return (1); 00307 } 00308 00318 int dig_line_set_box(struct Plus_head *plus, plus_t line, BOUND_BOX * Box) 00319 { 00320 P_LINE *Line; 00321 00322 Line = plus->Line[line]; 00323 00324 Line->N = Box->N; 00325 Line->S = Box->S; 00326 Line->E = Box->E; 00327 Line->W = Box->W; 00328 Line->T = Box->T; 00329 Line->B = Box->B; 00330 00331 return (1); 00332 } 00333 00343 int dig_line_get_box(struct Plus_head *plus, plus_t line, BOUND_BOX * Box) 00344 { 00345 P_LINE *Line; 00346 00347 Line = plus->Line[line]; 00348 00349 Box->N = Line->N; 00350 Box->S = Line->S; 00351 Box->E = Line->E; 00352 Box->W = Line->W; 00353 Box->T = Line->T; 00354 Box->B = Line->B; 00355 00356 return (1); 00357 }