geo 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|