00001
00018 #include <grass/vedit.h>
00019
00036 int Vedit_move_vertex(struct Map_info *Map, struct Map_info **BgMap,
00037 int nbgmaps, struct ilist *List,
00038 struct line_pnts *coord, double thresh_coords,
00039 double thresh_snap, double move_x, double move_y,
00040 double move_z, int move_first, int snap)
00041 {
00042 int nvertices_moved, nlines_modified, nvertices_snapped;
00043
00044 int i, j, k;
00045 int line, type, rewrite;
00046 int npoints;
00047 double east, north, dist;
00048 double *x, *y, *z;
00049 char *moved;
00050
00051 struct line_pnts *Points, *Points_snap;
00052 struct line_cats *Cats;
00053
00054 nlines_modified = 0;
00055 nvertices_moved = nvertices_snapped = 0;
00056 moved = NULL;
00057
00058 Points = Vect_new_line_struct();
00059 Points_snap = Vect_new_line_struct();
00060 Cats = Vect_new_cats_struct();
00061
00062 for (i = 0; i < List->n_values; i++) {
00063 line = List->value[i];
00064
00065 if (!Vect_line_alive(Map, line))
00066 continue;
00067
00068 type = Vect_read_line(Map, Points, Cats, line);
00069
00070 if (!(type & GV_LINES))
00071 continue;
00072
00073 npoints = Points->n_points;
00074 x = Points->x;
00075 y = Points->y;
00076 z = Points->z;
00077
00078
00079
00080
00081
00082
00083 moved =
00084 (char *)G_realloc((void *)moved, Points->n_points * sizeof(char));
00085 G_zero((void *)moved, Points->n_points * sizeof(char));
00086
00087 rewrite = 0;
00088 for (j = 0; j < coord->n_points; j++) {
00089 east = coord->x[j];
00090 north = coord->y[j];
00091
00092
00093 for (k = 0; k < Points->n_points; k++) {
00094 if (moved[k] == 0) {
00095 dist = Vect_points_distance(east, north, 0.0,
00096 x[k], y[k], z[k], WITHOUT_Z);
00097 if (dist <= thresh_coords) {
00098 G_debug(3,
00099 "Vedit_move_vertex(): line=%d; x=%f, y=%f -> x=%f, y=%f",
00100 line, x[k], y[k], x[k] + move_x,
00101 y[k] + move_y);
00102 x[k] += move_x;
00103 y[k] += move_y;
00104 if (Vect_is_3d(Map))
00105 z[k] += move_z;
00106
00107 moved[k] = 1;
00108
00109 G_debug(3, "Vedit_move_vertex(): line=%d, point=%d",
00110 line, k);
00111
00112 if (snap != NO_SNAP) {
00113 if (Vedit_snap_point
00114 (Map, line, &x[k], &y[k], &z[k], thresh_snap,
00115 (snap == SNAPVERTEX) ? 1 : 0) == 0) {
00116
00117 int bgi;
00118
00119 for (bgi = 0; bgi < nbgmaps; bgi++) {
00120 if (Vedit_snap_point
00121 (BgMap[bgi], line, &x[k], &y[k],
00122 &z[k], thresh_snap,
00123 (snap == SNAPVERTEX) ? 1 : 0))
00124 moved[k] = 2;
00125 break;
00126 }
00127 }
00128 else {
00129 moved[k] = 2;
00130 }
00131 }
00132
00133 rewrite = 1;
00134 nvertices_moved++;
00135
00136 if (move_first)
00137 break;
00138 }
00139 }
00140 }
00141
00142
00143 if ((type & GV_LINES) &&
00144 Vect_points_distance(x[0], y[0], z[0],
00145 x[npoints - 1], y[npoints - 1],
00146 z[npoints - 1],
00147 WITHOUT_Z) <= thresh_snap) {
00148
00149 if (moved[0] == 1) {
00150 x[0] = x[npoints - 1];
00151 y[0] = y[npoints - 1];
00152 if (Vect_is_3d(Map))
00153 z[0] = z[npoints - 1];
00154 }
00155 else if (moved[npoints - 1] == 1) {
00156 x[npoints - 1] = x[0];
00157 y[npoints - 1] = y[0];
00158 if (Vect_is_3d(Map))
00159 z[npoints - 1] = z[0];
00160 }
00161 }
00162 }
00163
00164 if (rewrite) {
00165 if (Vect_rewrite_line(Map, line, type, Points, Cats) < 0) {
00166 return -1;
00167 }
00168
00169 nlines_modified++;
00170 }
00171 }
00172
00173
00174 Vect_destroy_line_struct(Points);
00175 Vect_destroy_line_struct(Points_snap);
00176 Vect_destroy_cats_struct(Cats);
00177
00178
00179 return nvertices_moved;
00180 }
00181
00197 int Vedit_add_vertex(struct Map_info *Map, struct ilist *List,
00198 struct line_pnts *coord, double thresh)
00199 {
00200 int i, j;
00201 int type, line, seg;
00202 int nlines_modified, nvertices_added, rewrite;
00203 double east, north, dist;
00204 double *x, *y, *z;
00205 double px, py;
00206
00207 struct line_pnts *Points;
00208 struct line_cats *Cats;
00209
00210 nlines_modified = 0;
00211 nvertices_added = 0;
00212 Points = Vect_new_line_struct();
00213 Cats = Vect_new_cats_struct();
00214
00215 for (i = 0; i < List->n_values; i++) {
00216 line = List->value[i];
00217
00218 if (!Vect_line_alive(Map, line))
00219 continue;
00220
00221 type = Vect_read_line(Map, Points, Cats, line);
00222
00223 if (!(type & GV_LINES))
00224 continue;
00225
00226 x = Points->x;
00227 y = Points->y;
00228 z = Points->z;
00229 rewrite = 0;
00230 for (j = 0; j < coord->n_points; j++) {
00231 east = coord->x[j];
00232 north = coord->y[j];
00233
00234 seg = Vect_line_distance(Points, east, north, 0.0,
00235 WITHOUT_Z, &px, &py, NULL,
00236 &dist,
00237 NULL, NULL);
00238
00239 if (dist <= thresh &&
00240 Vect_points_distance(px, py, 0.0, x[seg], y[seg], z[seg],
00241 WITHOUT_Z) > 0 &&
00242 Vect_points_distance(px, py, 0.0, x[seg - 1], y[seg - 1],
00243 z[seg - 1], WITHOUT_Z) > 0) {
00244
00245 Vect_line_insert_point(Points, seg, px, py, 0.0);
00246 G_debug(3,
00247 "Vedit_add_vertex(): line=%d; x=%f, y=%f, index=%d",
00248 line, px, py, seg);
00249 rewrite = 1;
00250 nvertices_added++;
00251 }
00252 }
00253
00254
00255 if (rewrite) {
00256 Vect_line_prune(Points);
00257 if (Vect_rewrite_line(Map, line, type, Points, Cats) < 0) {
00258 return -1;
00259 }
00260
00261 nlines_modified++;
00262 }
00263 }
00264
00265
00266 Vect_destroy_line_struct(Points);
00267 Vect_destroy_cats_struct(Cats);
00268
00269 return nvertices_added;
00270 }
00271
00285 int Vedit_remove_vertex(struct Map_info *Map, struct ilist *List,
00286 struct line_pnts *coord, double thresh)
00287 {
00288 int i, j, k;
00289 int type, line;
00290 int nvertices_removed, rewrite, nlines_modified;
00291 double east, north;
00292 double dist;
00293 double *x, *y, *z;
00294
00295 struct line_pnts *Points;
00296 struct line_cats *Cats;
00297
00298 nvertices_removed = nlines_modified = 0;
00299
00300 Points = Vect_new_line_struct();
00301 Cats = Vect_new_cats_struct();
00302
00303 for (i = 0; i < List->n_values; i++) {
00304 line = List->value[i];
00305
00306 if (!Vect_line_alive(Map, line))
00307 continue;
00308
00309 type = Vect_read_line(Map, Points, Cats, line);
00310
00311 if (!(type & GV_LINES))
00312 continue;
00313
00314 x = Points->x;
00315 y = Points->y;
00316 z = Points->z;
00317 rewrite = 0;
00318 for (j = 0; j < coord->n_points; j++) {
00319 east = coord->x[j];
00320 north = coord->y[j];
00321
00322 for (k = 0; k < Points->n_points; k++) {
00323 dist = Vect_points_distance(east, north, 0.0,
00324 x[k], y[k], z[k], WITHOUT_Z);
00325 if (dist <= thresh) {
00326
00327 Vect_line_delete_point(Points, k);
00328 G_debug(3,
00329 "Vedit_remove_vertex(): line=%d; x=%f, y=%f, index=%d",
00330 line, x[k], y[k], k);
00331 k--;
00332 nvertices_removed++;
00333 rewrite = 1;
00334 }
00335 }
00336 }
00337
00338 if (rewrite) {
00339
00340 if (Vect_rewrite_line(Map, line, type, Points, Cats) < 0) {
00341 return -1;
00342 }
00343
00344 nlines_modified++;
00345 }
00346 }
00347
00348
00349 Vect_destroy_line_struct(Points);
00350 Vect_destroy_cats_struct(Cats);
00351
00352 return nvertices_removed;
00353 }