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 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