[Groonga-commit] groonga/groonga [master] expand sub mesh area.

Back to archive index

null+****@clear***** null+****@clear*****
2010年 8月 19日 (木) 16:29:29 JST


Kouhei Sutou	2010-08-19 07:29:29 +0000 (Thu, 19 Aug 2010)

  New Revision: b4b5920bc747075848d110eaa3fd21355a10a99f

  Log:
    expand sub mesh area.

  Modified files:
    lib/geo.c

  Modified: lib/geo.c (+40 -29)
===================================================================
--- lib/geo.c    2010-08-19 06:37:26 +0000 (9b49f25)
+++ lib/geo.c    2010-08-19 07:29:29 +0000 (6debd66)
@@ -214,8 +214,8 @@ typedef enum {
 
 /*
   meshes should have
-    51 >= spaces when include_base_point_hash == GRN_FALSE,
-    52 >= spaces when include_base_point_hash == GRN_TRUE.
+    86 >= spaces when include_base_point_hash == GRN_FALSE,
+    87 >= spaces when include_base_point_hash == GRN_TRUE.
 */
 static int
 grn_geo_get_meshes_for_circle(grn_ctx *ctx, grn_geo_point *base_point,
@@ -317,34 +317,39 @@ grn_geo_get_meshes_for_circle(grn_ctx *ctx, grn_geo_point *base_point,
   /*
     b: base_point
     x: geo_base
-    0-47: sub meshes. 0-47 are added order.
-
-  j: -4  -3  -2  -1  0   1   2   3
-    +---+---+---+---+---+---+---+---+
-    |40 |41 |42 |43 |44 |45 |46 |47 | 3
-    +---+---+---+---+---+---+---+---+
-    |32 |33 |34 |35 |36 |37 |38 |39 | 2
-    +---+---+---+---+---+---+---+---+
-    |28 |29 |  b    |       |30 |31 | 1
-    +---+---+       |       +---+---+
-    |24 |25 |       |x      |26 |27 | 0
-    +---+---+-------+-------+---+---+
-    |20 |21 |       |       |22 |23 | -1
-    +---+---+  base meshes  +---+---+
-    |16 |17 |       |       |18 |19 | -2
-    +---+---+---+---+---+---+---+---+
-    | 8 | 9 |10 |11 |12 |13 |14 |15 | -3
-    +---+---+---+---+---+---+---+---+
-    | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | -4
-    +---+---+---+---+---+---+---+---+
-                                       i
+    0-83: sub meshes. 0-83 are added order.
+
+  j: -5  -4  -3  -2  -1   0   1   2   3   4
+    +---+---+---+---+---+---+---+---+---+---+
+    |74 |75 |76 |77 |78 |79 |80 |81 |82 |83 | 4
+    +---+---+---+---+---+---+---+---+---+---+
+    |64 |65 |66 |67 |68 |69 |70 |71 |72 |73 | 3
+    +---+---+---+---+---+---+---+---+---+---+
+    |54 |55 |56 |57 |58 |59 |60 |61 |62 |63 | 2
+    +---+---+---+---+---+---+---+---+---+---+
+    |48 |49 |50 |  b    |       |51 |52 |53 | 1
+    +---+---+---+       |       +---+---+---+
+    |42 |43 |44 |       |x      |45 |46 |47 | 0
+    +---+---+---+-------+-------+---+---+---+
+    |36 |37 |38 |       |       |39 |40 |41 | -1
+    +---+---+---+  base meshes  +---+---+---+
+    |30 |31 |32 |       |       |33 |34 |35 | -2
+    +---+---+---+---+---+---+---+---+---+---+
+    |20 |21 |22 |23 |24 |25 |26 |27 |28 |29 | -3
+    +---+---+---+---+---+---+---+---+---+---+
+    |10 |11 |12 |13 |14 |15 |16 |17 |18 |19 | -4
+    +---+---+---+---+---+---+---+---+---+---+
+    | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -5
+    +---+---+---+---+---+---+---+---+---+---+
+                                              i
   */
   {
-    int i, j, lat, lat_min, lat_max, lng, lng_min, lng_max;
-    for (i = -4; i < 4; i++) {
+    int i, j, n_sub_meshes, lat, lat_min, lat_max, lng, lng_min, lng_max;
+    n_sub_meshes = 0;
+    for (i = -5; i < 5; i++) {
       lat_min = ((lat_diff + 1) / 2) * i;
       lat_max = ((lat_diff + 1) / 2) * (i + 1) - 1;
-      for (j = -4; j < 4; j++) {
+      for (j = -5; j < 5; j++) {
         if (-3 < i && i < 2 && -3 < j && j < 2) {
           continue;
         }
@@ -369,12 +374,18 @@ grn_geo_get_meshes_for_circle(grn_ctx *ctx, grn_geo_point *base_point,
         d = grn_geo_distance_raw(ctx, base_point, &(meshes[n_meshes].key));
         if (d < d_far) {
 #ifdef GEO_DEBUG
-          printf("sub-mesh: %d: ", (i + 4) * 8 + (j + 4));
+          printf("sub-mesh: %d: (%d,%d): (%d,%d;%d,%d)\n",
+                 n_sub_meshes, base_point->latitude, base_point->longitude,
+                 geo_base.latitude + lat_min,
+                 geo_base.latitude + lat_max,
+                 geo_base.longitude + lng_min,
+                 geo_base.longitude + lng_max);
           grn_p_geo_point(ctx, &(meshes[n_meshes].key));
 #endif
           meshes[n_meshes].key_size = diff_bit + 2;
           n_meshes++;
         }
+        n_sub_meshes++;
       }
     }
   }
@@ -393,7 +404,7 @@ grn_geo_table_sort_collect_points(grn_ctx *ctx, grn_obj *table, grn_obj *index,
                                   double d_far, int diff_bit)
 {
   int n_meshes;
-  mesh_entry meshes[51];
+  mesh_entry meshes[86];
   geo_entry *ep, *p;
 
   n_meshes = grn_geo_get_meshes_for_circle(ctx, base_point, d_far, diff_bit,
@@ -587,7 +598,7 @@ grn_geo_search_in_circle(grn_ctx *ctx, grn_obj *obj, grn_obj **args, int nargs,
   {
     int n_meshes, diff_bit;
     double d_far;
-    mesh_entry meshes[52];
+    mesh_entry meshes[87];
     uint8_t geo_key1[sizeof(grn_geo_point)];
     uint8_t geo_key2[sizeof(grn_geo_point)];
 




Groonga-commit メーリングリストの案内
Back to archive index