plus_line.c

Go to the documentation of this file.
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 }