[GRASS-SVN] r70555 - grass/trunk/lib/vector/vedit

svn_grass at osgeo.org svn_grass at osgeo.org
Mon Feb 13 23:25:17 PST 2017


Author: hcho
Date: 2017-02-13 23:25:17 -0800 (Mon, 13 Feb 2017)
New Revision: 70555

Modified:
   grass/trunk/lib/vector/vedit/break.c
Log:
vedit: Revert r70554 because of inconsistent behavior for case 1

Modified: grass/trunk/lib/vector/vedit/break.c
===================================================================
--- grass/trunk/lib/vector/vedit/break.c	2017-02-14 06:55:56 UTC (rev 70554)
+++ grass/trunk/lib/vector/vedit/break.c	2017-02-14 07:25:17 UTC (rev 70555)
@@ -16,8 +16,6 @@
 
 static int connect_lines(struct Map_info *, int, int, int,
 			 double, struct ilist *);
-static int find_extended_intersection(double, double, double, double, double,
-				      double, double *, double *);
 
 /*!
   \brief Split selected lines on given position
@@ -139,39 +137,21 @@
   \brief Connect lines in given threshold
   
   \code
-  1. Extend first line only
-          \                      \
-     id1   \             ->       \
-                                   \
-     id2 ----------            -----+----
+        \	             \
+   id1   \           ->	      \
+                               \
+   id2 ---------           -----+---
+   \endcode
 
+   If two lines are selected and <i>thresh</i> is -1, no limit is
+   applied.
 
-  2. Extend both lines
-          \                      \
-     id1   \             ->       \
-                                   \
-     id2        ---                 +----
+   \param Map pointer to Map_info
+   \param List list of selected lines
+   \param thresh threshold value
 
-
-  3. Extend first line when both are on the same line
-     id1 ---    --- id2  ->    -----+----
-
-
-  4. Don't connect two lines that don't intersect
-     id1 ------                ------
-                         ->
-     id2     ------                ------
-  \endcode
-
-  If two lines are selected and <i>thresh</i> is -1, no limit is
-  applied.
-
-  \param Map pointer to Map_info
-  \param List list of selected lines
-  \param thresh threshold value
-
-  \return number of modified lines
-  \return -1 on error
+   \return number of modified lines
+   \return -1 on error
  */
 int Vedit_connect_lines(struct Map_info *Map, struct ilist *List,
 			double thresh)
@@ -214,9 +194,6 @@
 
 	    do {
 		/* find first nearest line */
-		/* thresh=-1 for Vect_find_line_list doesn't mean no limit
-		 * search => inconsistent behavior! Either this is a bug or the
-		 * function description is incorrect. */
 		found = Vect_find_line_list(Map, x, y, z,
 					    GV_LINES, thresh, WITHOUT_Z,
 					    List_exclude, List_found);
@@ -250,8 +227,8 @@
     int type_from, type_to;
     int n_points, seg, is;
     double x, y, px, py, x1, y1;
-    double dist, spdist, lpdist, length;
-    double angle_t, angle_f;
+    double dist, spdist, lpdist, length, dist_p;
+    double angle_t, angle_f, angle;
 
     struct line_pnts *Points_from, *Points_to, *Points_final;
     struct line_cats *Cats_from, *Cats_to;
@@ -270,13 +247,12 @@
 	line_new = -1;
 
     if (line_new > -1) {
-	n_points = Points_from->n_points - 1;
-
 	if (first) {
 	    x = Points_from->x[0];
 	    y = Points_from->y[0];
 	}
 	else {
+	    n_points = Points_from->n_points - 1;
 	    x = Points_from->x[n_points];
 	    y = Points_from->y[n_points];
 	}
@@ -295,9 +271,22 @@
 		if (Vect_point_on_line(Points_to, lpdist,
 				       NULL, NULL, NULL, &angle_t,
 				       NULL) > 0) {
-		    /* extend both line_from & line_to and find intersection */
-		    if (find_extended_intersection(x, y, angle_f,
-						   px, py, angle_t, &x1, &y1)) {
+		    angle = angle_t - angle_f;
+		    dist_p = fabs(dist / sin(angle));
+		    
+		    if (first) {
+			if (angle_f < 0)
+			    angle_f -= M_PI;
+			else
+			    angle_f += M_PI;
+		    }
+
+		    x1 = x + dist_p * cos(angle_f);
+		    y1 = y + dist_p * sin(angle_f);
+
+		    length = Vect_line_length(Points_to);
+		    Vect_line_insert_point(Points_to, seg, x1, y1, 0.);
+		    if (fabs(Vect_line_length(Points_to) - length) < length * 1e-3) {
 			/* lines connected -> split line_to */
 			/* update line_from */
 			if (first) {
@@ -313,37 +302,31 @@
 						     Points_from, Cats_from);
 			/* Vect_list_append(List, line_new); */
 			
-			length = Vect_line_length(Points_to);
-			/* avoid adding duplicate nodes */
-			if (lpdist > 0 && lpdist < length) {
-			    /* update line_to  -- first part */
-			    Vect_reset_line(Points_final);
-			    for (is = 0; is < seg; is++) {
-				Vect_append_point(Points_final,
-						  Points_to->x[is],
-						  Points_to->y[is],
-						  Points_to->z[is]);
-			    }
-			    Vect_append_point(Points_final, x1, y1, 0.0);
-			    line_new = Vect_rewrite_line(Map, line_to, type_to,
-							 Points_final, Cats_to);
-			    /* Vect_list_append(List, line_new); */
+			/* update line_to  -- first part */
+			Vect_reset_line(Points_final);
+			for (is = 0; is < seg; is++) {
+			    Vect_append_point(Points_final, Points_to->x[is],
+					  Points_to->y[is],
+					      Points_to->z[is]);
+			}
+			Vect_append_point(Points_final, x1, y1, 0.0);
+			line_new = Vect_rewrite_line(Map, line_to, type_to,
+						     Points_final, Cats_to);
+			/* Vect_list_append(List, line_new); */
 			
-			    /* write second part */
-			    Vect_reset_line(Points_final);
-			    Vect_append_point(Points_final, x1, y1, 0.0);
-			    for (is = seg; is < Points_to->n_points; is++) {
-				Vect_append_point(Points_final,
-						  Points_to->x[is],
-						  Points_to->y[is],
-						  Points_to->z[is]);
-			    }
-			
-			    /* rewrite first part */
-			    line_new = Vect_write_line(Map, type_to,
-						       Points_final, Cats_to);
-			    /* Vect_list_append(List, line_new); */
+			/* write second part */
+			Vect_reset_line(Points_final);
+			Vect_append_point(Points_final, x1, y1, 0.0);
+			for (is = seg; is < Points_to->n_points; is++) {
+			    Vect_append_point(Points_final, Points_to->x[is],
+					      Points_to->y[is],
+					      Points_to->z[is]);
 			}
+			
+			/* rewrite first part */
+			line_new = Vect_write_line(Map, type_to,
+						   Points_final, Cats_to);
+			/* Vect_list_append(List, line_new); */
 		    }
 		}
 	    }
@@ -358,42 +341,3 @@
 
     return line_new > 0 ? 1 : 0;
 }
-
-static int find_extended_intersection(double x1, double y1, double angle1,
-				      double x2, double y2, double angle2,
-				      double *x, double *y)
-{
-    double c1, s1, c2, s2, d, a;
-
-    if (fabs(sin(angle1 - angle2)) <= 1e-10) {
-	/* two lines are parallel */
-	double angle;
-
-	angle = atan2(y2 - y1, x2 - x1);
-	if (angle == angle1) {
-	    /* they are on the same line */
-	    *x = x2;
-	    *y = y2;
-
-	    return 1;
-	}
-
-	/* two lines don't intersect */
-	return 0;
-    }
-
-    c1 = cos(angle1);
-    s1 = sin(angle1);
-    c2 = cos(angle2);
-    s2 = sin(angle2);
-    d = -c1 * s2 + c2 * s1;
-    if (d == 0.0)
-	/* shouldn't happen again */
-	return 0;
-
-    a = (-s2 * (x2 - x1) + c2 * (y2 - y1)) / d;
-    *x = x1 + a * c1;
-    *y = y1 + a * s1;
-
-    return 1;
-}



More information about the grass-commit mailing list