geo 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/geo.c +2 -1
- data/ext/line_set.c +9 -12
- data/ext/triangle.c +1 -1
- data/ext/triangle.h +2 -0
- data/ext/triangle_set.c +56 -5
- data/ext/triangle_set.h +8 -2
- metadata +2 -2
data/ext/geo.c
CHANGED
@@ -33,7 +33,7 @@ extern "C" {
|
|
33
33
|
rb_define_method(rb_cFloat, "intlike?", rb_float_intlike, 0);
|
34
34
|
|
35
35
|
VALUE rb_geo = rb_define_module("Geo");
|
36
|
-
rb_define_const(rb_geo, "VERSION", rb_str_new2("0.1.
|
36
|
+
rb_define_const(rb_geo, "VERSION", rb_str_new2("0.1.6"));
|
37
37
|
|
38
38
|
rb_triangle_set = rb_define_class_under(rb_geo,
|
39
39
|
"TriangleSet",
|
@@ -78,6 +78,7 @@ extern "C" {
|
|
78
78
|
rb_define_method(rb_triangle_set, "_in_segment", rb_triangle_set_structures_in_segment, 2);
|
79
79
|
rb_define_method(rb_triangle_set, "indexed", rb_geo_set_get_indexed, 0);
|
80
80
|
rb_define_method(rb_triangle_set, "indexed=", rb_geo_set_set_indexed, 1);
|
81
|
+
rb_define_method(rb_triangle_set, "containers", rb_triangle_set_containers, 1);
|
81
82
|
|
82
83
|
rb_define_alloc_func(rb_point_set, rb_point_set_alloc);
|
83
84
|
rb_define_method(rb_point_set, "<<", rb_point_set_insert, 1);
|
data/ext/line_set.c
CHANGED
@@ -196,13 +196,13 @@ g_hash_table_each_intersection_free_endpoint(gpointer key, gpointer data, gpoint
|
|
196
196
|
gpointer handler_args = original_args[5];
|
197
197
|
GHashTable *seen_points = (GHashTable *) original_args[6];
|
198
198
|
|
199
|
-
|
200
|
-
|
199
|
+
tmpLine->p1 = (Point *) arg_wrapper[1];
|
200
|
+
tmpLine->p2 = (Point *) key;
|
201
201
|
|
202
202
|
if (*max_distance < 0 || DISTANCE(tmpLine->p1, tmpLine->p2) < *max_distance) {
|
203
203
|
if (!line_set_intersects(line_set, tmpLine)) {
|
204
204
|
if (g_hash_table_lookup(seen_points, key) == NULL) {
|
205
|
-
handler(line_set,
|
205
|
+
handler(line_set, tmpLine, handler_args);
|
206
206
|
g_hash_table_insert(seen_points, key, GINT_TO_POINTER(1));
|
207
207
|
}
|
208
208
|
}
|
@@ -210,18 +210,16 @@ g_hash_table_each_intersection_free_endpoint(gpointer key, gpointer data, gpoint
|
|
210
210
|
}
|
211
211
|
|
212
212
|
static gpointer
|
213
|
-
|
214
|
-
rb_ary_push(*( (VALUE *) rval ), ((
|
213
|
+
line_set_insert_p2_into_rb_ary(GeoSet *line_set, gpointer line, gpointer rval) {
|
214
|
+
rb_ary_push(*( (VALUE *) rval ), ((Line *) line)->p2->rbPoint);
|
215
215
|
return NULL;
|
216
216
|
}
|
217
217
|
|
218
218
|
static void
|
219
219
|
g_hash_table_each_intersection_free_endpoint_for_point(gpointer key, gpointer data, gpointer user_data) {
|
220
|
-
gpointer my_args[2];
|
221
220
|
gpointer *given_args = (gpointer *) user_data;
|
222
221
|
GeoSet *endpoints = (GeoSet *) given_args[0];
|
223
|
-
my_args[
|
224
|
-
my_args[1] = key;
|
222
|
+
gpointer my_args[2] = { user_data, key };
|
225
223
|
g_hash_table_foreach(endpoints->table, g_hash_table_each_intersection_free_endpoint, (gpointer) my_args);
|
226
224
|
}
|
227
225
|
|
@@ -232,11 +230,10 @@ line_set_each_intersection_free_endpoint(GeoSet *set,
|
|
232
230
|
gdouble max_distance,
|
233
231
|
geo_set_structure_handler handler,
|
234
232
|
gpointer user_data) {
|
235
|
-
Line
|
233
|
+
Line line;
|
236
234
|
GHashTable *seen_points = g_hash_table_new(g_direct_hash, g_direct_equal);
|
237
|
-
gpointer args[7] = { endpoints, &max_distance, line, set, handler, user_data, seen_points };
|
235
|
+
gpointer args[7] = { endpoints, &max_distance, &line, set, handler, user_data, seen_points };
|
238
236
|
g_hash_table_foreach(origins->table, g_hash_table_each_intersection_free_endpoint_for_point, args);
|
239
|
-
line_free(line);
|
240
237
|
g_hash_table_destroy(seen_points);
|
241
238
|
}
|
242
239
|
|
@@ -349,7 +346,7 @@ rb_line_set_intersection_free_endpoints(int argc, VALUE *argv, VALUE self) {
|
|
349
346
|
GEO_SET(self, me);
|
350
347
|
GEO_SET(endpoints, eps);
|
351
348
|
rval = rb_ary_new();
|
352
|
-
line_set_each_intersection_free_endpoint(me, ops, eps, max_distance,
|
349
|
+
line_set_each_intersection_free_endpoint(me, ops, eps, max_distance, line_set_insert_p2_into_rb_ary, &rval);
|
353
350
|
if (created_ops)
|
354
351
|
geo_set_free(ops);
|
355
352
|
return rval;
|
data/ext/triangle.c
CHANGED
@@ -258,7 +258,7 @@ triangle_closest_intersection(Triangle *triangle, Line *line, Point *point) {
|
|
258
258
|
return rval;
|
259
259
|
}
|
260
260
|
|
261
|
-
|
261
|
+
Line*
|
262
262
|
triangle_overlap(Triangle *triangle, Line *line) {
|
263
263
|
if (triangle_contains(triangle, line->p1)) {
|
264
264
|
if (triangle_contains(triangle, line->p2)) {
|
data/ext/triangle.h
CHANGED
data/ext/triangle_set.c
CHANGED
@@ -103,15 +103,17 @@ triangle_set_add_to_rb_ary(GeoSet *set, gpointer structure, gpointer user_data)
|
|
103
103
|
return NULL;
|
104
104
|
}
|
105
105
|
|
106
|
-
|
107
|
-
|
106
|
+
gpointer
|
107
|
+
triangle_set_each_intersector_until(GeoSet *set, Line *line, geo_set_structure_handler handler, gpointer user_data) {
|
108
108
|
gpointer args[3] = { line, handler, user_data };
|
109
|
+
gpointer rval = NULL;
|
109
110
|
if (set->indexed) {
|
110
111
|
TRIANGLE_SET_REINDEX(set);
|
111
|
-
geo_set_each_structure_having_common_segment_id_with_line_until(set, line, triangle_set_each_intersector_for_triangle, args);
|
112
|
+
rval = geo_set_each_structure_having_common_segment_id_with_line_until(set, line, triangle_set_each_intersector_for_triangle, args);
|
112
113
|
} else {
|
113
|
-
geo_set_each_structure_until(set, triangle_set_each_intersector_for_triangle, args);
|
114
|
+
rval = geo_set_each_structure_until(set, triangle_set_each_intersector_for_triangle, args);
|
114
115
|
}
|
116
|
+
return rval;
|
115
117
|
}
|
116
118
|
|
117
119
|
VALUE
|
@@ -123,7 +125,7 @@ rb_triangle_set_intersectors(VALUE self, VALUE line) {
|
|
123
125
|
GEO_SET(self, me);
|
124
126
|
LINE(line, l);
|
125
127
|
rval = rb_ary_new();
|
126
|
-
|
128
|
+
triangle_set_each_intersector_until(me, l, triangle_set_add_to_rb_ary, &rval);
|
127
129
|
return rval;
|
128
130
|
}
|
129
131
|
|
@@ -385,6 +387,55 @@ rb_triangle_set_segment_ids_for_triangle(VALUE self, VALUE t) {
|
|
385
387
|
return rval;
|
386
388
|
}
|
387
389
|
|
390
|
+
static gpointer
|
391
|
+
triangle_set_each_container(GeoSet *set, gpointer triangle, gpointer user_data) {
|
392
|
+
gpointer *args = (gpointer *) user_data;
|
393
|
+
Point *point = (Point *) args[0];
|
394
|
+
geo_set_structure_handler handler = (geo_set_structure_handler) args[1];
|
395
|
+
gpointer handler_args = args[2];
|
396
|
+
gpointer rval;
|
397
|
+
if (triangle_contains((Triangle *) triangle, (Point *) point)) {
|
398
|
+
if ((rval = handler(set, triangle, handler_args)) != NULL)
|
399
|
+
return rval;
|
400
|
+
}
|
401
|
+
return NULL;
|
402
|
+
}
|
403
|
+
|
404
|
+
gpointer
|
405
|
+
triangle_set_each_container_until(GeoSet *set, Point *p, geo_set_structure_handler handler, gpointer handler_args) {
|
406
|
+
gpointer rval = NULL;
|
407
|
+
gpointer args[3] = { p, handler, handler_args };
|
408
|
+
if (set->indexed) {
|
409
|
+
TRIANGLE_SET_REINDEX(set);
|
410
|
+
rval = geo_set_each_structure_having_common_segment_id_with_point_until(set,
|
411
|
+
p,
|
412
|
+
triangle_set_each_container,
|
413
|
+
args);
|
414
|
+
} else {
|
415
|
+
rval = geo_set_each_structure_until(set, triangle_set_each_container, args);
|
416
|
+
}
|
417
|
+
return rval;
|
418
|
+
}
|
419
|
+
|
420
|
+
static gpointer
|
421
|
+
geo_set_add_container_to_rb_ary(GeoSet *set, gpointer triangle, gpointer ary) {
|
422
|
+
rb_ary_push(*( (VALUE *) ary ), ( (Triangle *) triangle )->rbTriangle);
|
423
|
+
return NULL;
|
424
|
+
}
|
425
|
+
|
426
|
+
VALUE
|
427
|
+
rb_triangle_set_containers(VALUE self, VALUE p) {
|
428
|
+
Point *point;
|
429
|
+
GeoSet *set;
|
430
|
+
VALUE rval;
|
431
|
+
CHECK_POINT(p);
|
432
|
+
GEO_SET(self, set);
|
433
|
+
POINT(p, point);
|
434
|
+
rval = rb_ary_new();
|
435
|
+
triangle_set_each_container_until(set, point, geo_set_add_container_to_rb_ary, &rval);
|
436
|
+
return rval;
|
437
|
+
}
|
438
|
+
|
388
439
|
void
|
389
440
|
init_triangle_set_o() {
|
390
441
|
}
|
data/ext/triangle_set.h
CHANGED
@@ -52,6 +52,12 @@ rb_triangle_set_intersects(VALUE self, VALUE line);
|
|
52
52
|
VALUE
|
53
53
|
rb_triangle_set_first_container(VALUE self, VALUE p);
|
54
54
|
|
55
|
+
VALUE
|
56
|
+
rb_triangle_set_containers(VALUE self, VALUE p);
|
57
|
+
|
58
|
+
gpointer
|
59
|
+
triangle_set_each_container_until(GeoSet *set, Point *p, geo_set_structure_handler handler, gpointer handler_args);
|
60
|
+
|
55
61
|
VALUE
|
56
62
|
rb_triangle_set_contains(VALUE self, VALUE p);
|
57
63
|
|
@@ -85,7 +91,7 @@ geo_set_each_structure_having_common_segment_id_with_triangle_until(GeoSet *set,
|
|
85
91
|
void
|
86
92
|
triangle_set_mark(GeoSet *set);
|
87
93
|
|
88
|
-
|
89
|
-
|
94
|
+
gpointer
|
95
|
+
triangle_set_each_intersector_until(GeoSet *set, Line *line, geo_set_structure_handler handler, gpointer user_data);
|
90
96
|
|
91
97
|
#endif
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Kihlgren
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-01-
|
12
|
+
date: 2008-01-19 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|