null+****@clear*****
null+****@clear*****
2010年 8月 5日 (木) 09:55:16 JST
Kouhei Sutou 2010-08-05 00:55:16 +0000 (Thu, 05 Aug 2010) New Revision: 4b8ae43432edd1fd6f3b55714d399f12658ebd75 Log: add GRN_ prefix to macros. Modified files: lib/geo.c lib/geo.h Modified: lib/geo.c (+35 -46) =================================================================== --- lib/geo.c 2010-08-05 00:55:07 +0000 (7c56c10) +++ lib/geo.c 2010-08-05 00:55:16 +0000 (2c05970) @@ -15,23 +15,12 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include <math.h> #include <string.h> #include <stdlib.h> #include "geo.h" #include "ii.h" #include "db.h" -#define GEO_RESOLUTION 3600000 -#define GEO_RADIOUS 6357303 -#define GEO_BES_C1 6334834 -#define GEO_BES_C2 6377397 -#define GEO_BES_C3 0.006674 -#define GEO_GRS_C1 6335439 -#define GEO_GRS_C2 6378137 -#define GEO_GRS_C3 0.006694 -#define GEO_INT2RAD(x) ((M_PI / (GEO_RESOLUTION * 180)) * x) - unsigned grn_geo_in_circle(grn_ctx *ctx, grn_obj *point, grn_obj *center, grn_obj *radius_or_point) @@ -46,28 +35,28 @@ grn_geo_in_circle(grn_ctx *ctx, grn_obj *point, grn_obj *center, if (grn_obj_cast(ctx, center, ¢er_, 0)) { goto exit; } center = ¢er_; } - lng0 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point))->longitude); - lat0 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point))->latitude); - lng1 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(center))->longitude); - lat1 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(center))->latitude); + lng0 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point))->longitude); + lat0 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point))->latitude); + lng1 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(center))->longitude); + lat1 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(center))->latitude); x = (lng1 - lng0) * cos((lat0 + lat1) * 0.5); y = (lat1 - lat0); d = (x * x) + (y * y); switch (radius_or_point->header.domain) { case GRN_DB_INT32 : - r = (sqrt(d) * GEO_RADIOUS) <= GRN_INT32_VALUE(radius_or_point); + r = (sqrt(d) * GRN_GEO_RADIOUS) <= GRN_INT32_VALUE(radius_or_point); break; case GRN_DB_UINT32 : - r = (sqrt(d) * GEO_RADIOUS) <= GRN_UINT32_VALUE(radius_or_point); + r = (sqrt(d) * GRN_GEO_RADIOUS) <= GRN_UINT32_VALUE(radius_or_point); break; case GRN_DB_INT64 : - r = (sqrt(d) * GEO_RADIOUS) <= GRN_INT64_VALUE(radius_or_point); + r = (sqrt(d) * GRN_GEO_RADIOUS) <= GRN_INT64_VALUE(radius_or_point); break; case GRN_DB_UINT64 : - r = (sqrt(d) * GEO_RADIOUS) <= GRN_UINT64_VALUE(radius_or_point); + r = (sqrt(d) * GRN_GEO_RADIOUS) <= GRN_UINT64_VALUE(radius_or_point); break; case GRN_DB_FLOAT : - r = (sqrt(d) * GEO_RADIOUS) <= GRN_FLOAT_VALUE(radius_or_point); + r = (sqrt(d) * GRN_GEO_RADIOUS) <= GRN_FLOAT_VALUE(radius_or_point); break; case GRN_DB_SHORT_TEXT : case GRN_DB_TEXT : @@ -79,8 +68,8 @@ grn_geo_in_circle(grn_ctx *ctx, grn_obj *point, grn_obj *center, case GRN_DB_TOKYO_GEO_POINT : case GRN_DB_WGS84_GEO_POINT : if (domain != radius_or_point->header.domain) { /* todo */ goto exit; } - lng2 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(radius_or_point))->longitude); - lat2 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(radius_or_point))->latitude); + lng2 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(radius_or_point))->longitude); + lat2 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(radius_or_point))->latitude); x = (lng2 - lng1) * cos((lat1 + lat2) * 0.5); y = (lat2 - lat1); r = d <= (x * x) + (y * y); @@ -139,13 +128,13 @@ grn_geo_distance(grn_ctx *ctx, grn_obj *point1, grn_obj *point2) if (grn_obj_cast(ctx, point2, &point2_, 0)) { goto exit; } point2 = &point2_; } - lng1 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->longitude); - lat1 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->latitude); - lng2 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->longitude); - lat2 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->latitude); + lng1 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->longitude); + lat1 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->latitude); + lng2 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->longitude); + lat2 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->latitude); x = (lng2 - lng1) * cos((lat1 + lat2) * 0.5); y = (lat2 - lat1); - d = sqrt((x * x) + (y * y)) * GEO_RADIOUS; + d = sqrt((x * x) + (y * y)) * GRN_GEO_RADIOUS; } else { /* todo */ } @@ -166,13 +155,13 @@ grn_geo_distance2(grn_ctx *ctx, grn_obj *point1, grn_obj *point2) if (grn_obj_cast(ctx, point2, &point2_, 0)) { goto exit; } point2 = &point2_; } - lng1 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->longitude); - lat1 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->latitude); - lng2 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->longitude); - lat2 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->latitude); + lng1 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->longitude); + lat1 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->latitude); + lng2 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->longitude); + lat2 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->latitude); x = sin(fabs(lng2 - lng1) * 0.5); y = sin(fabs(lat2 - lat1) * 0.5); - d = asin(sqrt((y * y) + cos(lat1) * cos(lat2) * x * x)) * 2 * GEO_RADIOUS; + d = asin(sqrt((y * y) + cos(lat1) * cos(lat2) * x * x)) * 2 * GRN_GEO_RADIOUS; } else { /* todo */ } @@ -195,15 +184,15 @@ grn_geo_distance3(grn_ctx *ctx, grn_obj *point1, grn_obj *point2) if (grn_obj_cast(ctx, point2, &point2_, 0)) { goto exit; } point2 = &point2_; } - lng1 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->longitude); - lat1 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->latitude); - lng2 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->longitude); - lat2 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->latitude); + lng1 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->longitude); + lat1 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->latitude); + lng2 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->longitude); + lat2 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->latitude); p = (lat1 + lat2) * 0.5; - q = (1 - GEO_BES_C3 * sin(p) * sin(p)); + q = (1 - GRN_GEO_BES_C3 * sin(p) * sin(p)); r = sqrt(q); - m = GEO_BES_C1 / (q * r); - n = GEO_BES_C2 / r; + m = GRN_GEO_BES_C1 / (q * r); + n = GRN_GEO_BES_C2 / r; x = n * cos(p) * fabs(lng1 - lng2); y = m * fabs(lat1 - lat2); d = sqrt((x * x) + (y * y)); @@ -217,15 +206,15 @@ grn_geo_distance3(grn_ctx *ctx, grn_obj *point1, grn_obj *point2) if (grn_obj_cast(ctx, point2, &point2_, 0)) { goto exit; } point2 = &point2_; } - lng1 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->longitude); - lat1 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->latitude); - lng2 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->longitude); - lat2 = GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->latitude); + lng1 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->longitude); + lat1 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point1))->latitude); + lng2 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->longitude); + lat2 = GRN_GEO_INT2RAD(((grn_geo_point *)GRN_BULK_HEAD(point2))->latitude); p = (lat1 + lat2) * 0.5; - q = (1 - GEO_GRS_C3 * sin(p) * sin(p)); + q = (1 - GRN_GEO_GRS_C3 * sin(p) * sin(p)); r = sqrt(q); - m = GEO_GRS_C1 / (q * r); - n = GEO_GRS_C2 / r; + m = GRN_GEO_GRS_C1 / (q * r); + n = GRN_GEO_GRS_C2 / r; x = n * cos(p) * fabs(lng1 - lng2); y = m * fabs(lat1 - lat2); d = sqrt((x * x) + (y * y)); Modified: lib/geo.h (+12 -0) =================================================================== --- lib/geo.h 2010-08-05 00:55:07 +0000 (e930791) +++ lib/geo.h 2010-08-05 00:55:16 +0000 (4c82796) @@ -21,10 +21,22 @@ #include "groonga_in.h" #endif /* GROONGA_IN_H */ +#include <math.h> + #ifdef __cplusplus extern "C" { #endif +#define GRN_GEO_RESOLUTION 3600000 +#define GRN_GEO_RADIOUS 6357303 +#define GRN_GEO_BES_C1 6334834 +#define GRN_GEO_BES_C2 6377397 +#define GRN_GEO_BES_C3 0.006674 +#define GRN_GEO_GRS_C1 6335439 +#define GRN_GEO_GRS_C2 6378137 +#define GRN_GEO_GRS_C3 0.006694 +#define GRN_GEO_INT2RAD(x) ((M_PI / (GRN_GEO_RESOLUTION * 180)) * x) + unsigned grn_geo_in_circle(grn_ctx *ctx, grn_obj *point, grn_obj *center, grn_obj *radius_or_point); unsigned grn_geo_in_rectangle(grn_ctx *ctx, grn_obj *point,