[GRASS-SVN] r64203 - grass/trunk/lib/vector/Vlib

svn_grass at osgeo.org svn_grass at osgeo.org
Thu Jan 15 13:03:10 PST 2015


Author: mmetz
Date: 2015-01-15 13:03:10 -0800 (Thu, 15 Jan 2015)
New Revision: 64203

Modified:
   grass/trunk/lib/vector/Vlib/find.c
Log:
Vlib: optimize Vect_find_area(), add comments

Modified: grass/trunk/lib/vector/Vlib/find.c
===================================================================
--- grass/trunk/lib/vector/Vlib/find.c	2015-01-15 20:54:42 UTC (rev 64202)
+++ grass/trunk/lib/vector/Vlib/find.c	2015-01-15 21:03:10 UTC (rev 64203)
@@ -287,7 +287,13 @@
     Vect_select_areas_by_box(Map, &box, List);
     G_debug(3, "  %d areas selected by box", List->n_values);
 
-    /* sort areas by size, the smallest is likely to be the nearest */
+    /* sort areas by bbox size
+     * get the smallest area that contains the point
+     * using the bbox size is working because if 2 areas both contain
+     * the point, one of these areas must be inside the other area
+     * which means that the bbox of the outer area must be larger than
+     * the bbox of the inner area, and equal bbox sizes are not possible */
+
     if (alloc_size_list < List->n_values) {
 	alloc_size_list = List->n_values;
 	size_list = G_realloc(size_list, alloc_size_list * sizeof(BOX_SIZE));
@@ -314,7 +320,9 @@
 
     for (i = 0; i < List->n_values; i++) {
 	area = size_list[i].i;
-	ret = Vect_point_in_area(x, y, Map, area, &size_list[i].box);
+	/* testing only the outer ring is sufficient because 
+	 * inner rings have been tested earlier (sorted list) */
+	ret = Vect_point_in_area_outer_ring(x, y, Map, area, &size_list[i].box);
 
 	G_debug(3, "    area = %d Vect_point_in_area() = %d", area, ret);
 
@@ -342,6 +350,8 @@
     static struct boxlist *List;
     static struct line_pnts *Points;
 
+    /* TODO: sync to Vect_find_area() */
+
     G_debug(3, "Vect_find_island() x = %f y = %f", x, y);
 
     if (first) {



More information about the grass-commit mailing list