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 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.5"));
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);
@@ -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
- *(tmpLine->p1) = *( (Point *) arg_wrapper[1] );
200
- *(tmpLine->p2) = *( (Point *) key);
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, key, handler_args);
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
- line_set_insert_point_into_rb_ary(GeoSet *line_set, gpointer point, gpointer rval) {
214
- rb_ary_push(*( (VALUE *) rval ), ((Point *) point)->rbPoint);
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[0] = user_data;
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 *line = new_line_with_coordinates(0,0,0,0);
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, line_set_insert_point_into_rb_ary, &rval);
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;
@@ -258,7 +258,7 @@ triangle_closest_intersection(Triangle *triangle, Line *line, Point *point) {
258
258
  return rval;
259
259
  }
260
260
 
261
- static Line*
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)) {
@@ -94,6 +94,8 @@ rb_triangle_from_gpointer(gpointer l);
94
94
  gchar*
95
95
  triangle_inspect(Triangle *t);
96
96
 
97
+ Line*
98
+ triangle_overlap(Triangle *triangle, Line *line);
97
99
 
98
100
 
99
101
 
@@ -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
- void
107
- triangle_set_each_intersector(GeoSet *set, Line *line, geo_set_structure_handler handler, gpointer user_data) {
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
- triangle_set_each_intersector(me, l, triangle_set_add_to_rb_ary, &rval);
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
  }
@@ -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
- void
89
- triangle_set_each_intersector(GeoSet *set, Line *line, geo_set_structure_handler handler, gpointer user_data);
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.5
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-11 00:00:00 +01:00
12
+ date: 2008-01-19 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies: []
15
15