geo 0.1.4 → 0.1.5

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/triangle.h CHANGED
@@ -19,7 +19,7 @@
19
19
  #ifndef TRIANGLE_H
20
20
  #define TRIANGLE_H
21
21
 
22
- #include "common.h"
22
+ #include <common.h>
23
23
 
24
24
 
25
25
  extern VALUE rb_triangle;
@@ -28,7 +28,7 @@ extern VALUE rb_triangle;
28
28
  #define TRIANGLE(rb_triangle,triangle_pointer) Data_Get_Struct((rb_triangle), Triangle, (triangle_pointer))
29
29
  #define TRIANGLE_EQUALS(t1,t2) (POINT_EQUALS((t1)->p1, (t2)->p1) && POINT_EQUALS((t1)->p2, (t2)->p2) && POINT_EQUALS((t1)->p3, (t2)->p3))
30
30
  #define TRIANGLE_P(t) (!NIL_P((t)) && rb_is_a((t), rb_triangle))
31
- #define CHECK_TRIANGLE(t) if (!TRIANGLE_P((t))) rb_raise(rb_eTypeError, "Expected Grueserve::Map::Triangle!")
31
+ #define CHECK_TRIANGLE(t) if (!TRIANGLE_P((t))) rb_raise(rb_eTypeError, "Expected Geo::Triangle!")
32
32
  #define TRIANGLE_BOUNDS(t,bottom_left,top_right) (bottom_left)->x = MIN(t->p1->x, MIN(t->p2->x, t->p3->x)); \
33
33
  (bottom_left)->y = MIN(t->p1->y, MIN(t->p2->y, t->p3->y)); \
34
34
  (top_right)->x = MAX(t->p1->x, MAX(t->p2->x, t->p3->x)); \
@@ -91,6 +91,8 @@ rb_triangle_intersects(VALUE self, VALUE line);
91
91
  VALUE
92
92
  rb_triangle_from_gpointer(gpointer l);
93
93
 
94
+ gchar*
95
+ triangle_inspect(Triangle *t);
94
96
 
95
97
 
96
98
 
data/ext/triangle_set.c CHANGED
@@ -16,7 +16,7 @@
16
16
  // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
 
18
18
 
19
- #include "common.h"
19
+ #include <common.h>
20
20
 
21
21
  VALUE rb_triangle_set;
22
22
 
@@ -28,7 +28,7 @@ g_hash_table_mark_triangle(gpointer key, gpointer value, gpointer user_data) {
28
28
  rb_gc_mark( ( (Triangle *) key )->rbTriangle);
29
29
  }
30
30
 
31
- static void
31
+ void
32
32
  triangle_set_mark(GeoSet *set) {
33
33
  g_hash_table_foreach(set->table, g_hash_table_mark_triangle, NULL);
34
34
  }
@@ -70,48 +70,61 @@ rb_triangle_set_delete(VALUE self, VALUE triangle) {
70
70
  return geo_set_delete(me, (gpointer) t, triangle);
71
71
  }
72
72
 
73
- static void
74
- g_hash_table_yield_triangle(gpointer key, gpointer value, gpointer user_data) {
75
- rb_yield(( (Triangle *) key )->rbTriangle);
73
+ static gpointer
74
+ g_hash_table_yield_triangle(GeoSet *set, gpointer structure, gpointer user_data) {
75
+ rb_yield(( (Triangle *) structure )->rbTriangle);
76
+ return NULL;
76
77
  }
77
78
 
78
79
  VALUE
79
80
  rb_triangle_set_each(VALUE self) {
80
81
  GeoSet *set;
81
82
  GEO_SET(self, set);
82
- geo_set_foreach(set, g_hash_table_yield_triangle);
83
+ geo_set_each_structure_until(set, g_hash_table_yield_triangle, NULL);
83
84
  return self;
84
85
  }
85
86
 
86
87
  static gpointer
87
- triangle_set_collect_triangle_intersectors_in_rb_ary(GeoSet *set, gpointer structure, gpointer user_data) {
88
+ triangle_set_each_intersector_for_triangle(GeoSet *set, gpointer structure, gpointer user_data) {
88
89
  gpointer *args = (gpointer *) user_data;
89
90
  Triangle *triangle = (Triangle *) structure;
90
91
  Line *line = (Line *) args[0];
91
- VALUE *rval = (VALUE *) args[1];
92
+ geo_set_structure_handler handler = (geo_set_structure_handler) args[1];
93
+ gpointer handler_args = args[2];
92
94
  if (triangle_intersects(triangle, line)) {
93
- rb_ary_push(*rval, triangle->rbTriangle);
95
+ handler(set, triangle, handler_args);
94
96
  }
95
97
  return NULL;
96
98
  }
97
99
 
98
- static VALUE
99
- triangle_set_intersectors(GeoSet *set, Line *line) {
100
- VALUE rval = rb_ary_new();
101
- gpointer args[2] = { line, &rval };
102
- TRIANGLE_SET_REINDEX(set);
103
- geo_set_each_structure_having_common_segment_id_with_line_until(set, line, triangle_set_collect_triangle_intersectors_in_rb_ary, args);
104
- return rval;
100
+ static gpointer
101
+ triangle_set_add_to_rb_ary(GeoSet *set, gpointer structure, gpointer user_data) {
102
+ rb_ary_push(*( (VALUE *) user_data), ( (Triangle *) structure)->rbTriangle);
103
+ return NULL;
104
+ }
105
+
106
+ void
107
+ triangle_set_each_intersector(GeoSet *set, Line *line, geo_set_structure_handler handler, gpointer user_data) {
108
+ gpointer args[3] = { line, handler, user_data };
109
+ if (set->indexed) {
110
+ 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
+ } else {
113
+ geo_set_each_structure_until(set, triangle_set_each_intersector_for_triangle, args);
114
+ }
105
115
  }
106
116
 
107
117
  VALUE
108
118
  rb_triangle_set_intersectors(VALUE self, VALUE line) {
109
119
  GeoSet *me;
110
120
  Line *l;
121
+ VALUE rval;
111
122
  CHECK_LINE(line);
112
123
  GEO_SET(self, me);
113
124
  LINE(line, l);
114
- return triangle_set_intersectors(me, l);
125
+ rval = rb_ary_new();
126
+ triangle_set_each_intersector(me, l, triangle_set_add_to_rb_ary, &rval);
127
+ return rval;
115
128
  }
116
129
 
117
130
  static gpointer
@@ -126,10 +139,16 @@ triangle_set_intersecting(GeoSet *set, gpointer triangle_gp, gpointer line_gp) {
126
139
  static gboolean
127
140
  triangle_set_intersects(GeoSet *set, Line *line) {
128
141
  TRIANGLE_SET_REINDEX(set);
129
- return GBOOL2RB(geo_set_each_structure_having_common_segment_id_with_line_until(set,
130
- line,
131
- triangle_set_intersecting,
132
- line) != NULL);
142
+ if (set->indexed) {
143
+ return GBOOL2RB(geo_set_each_structure_having_common_segment_id_with_line_until(set,
144
+ line,
145
+ triangle_set_intersecting,
146
+ line) != NULL);
147
+ } else {
148
+ return GBOOL2RB(geo_set_each_structure_until(set,
149
+ triangle_set_intersecting,
150
+ line) != NULL);
151
+ }
133
152
  }
134
153
 
135
154
  VALUE
@@ -153,11 +172,15 @@ triangle_set_find_container(GeoSet *Set, gpointer triangle_gp, gpointer point_gp
153
172
 
154
173
  static Triangle*
155
174
  triangle_set_first_container(GeoSet *set, Point *point) {
156
- TRIANGLE_SET_REINDEX(set);
157
- return ( (Triangle *) geo_set_each_structure_having_common_segment_id_with_point_until(set,
158
- point,
159
- triangle_set_find_container,
160
- point));
175
+ if (set->indexed) {
176
+ TRIANGLE_SET_REINDEX(set);
177
+ return ( (Triangle *) geo_set_each_structure_having_common_segment_id_with_point_until(set,
178
+ point,
179
+ triangle_set_find_container,
180
+ point));
181
+ } else {
182
+ return ( (Triangle *) geo_set_each_structure_until(set, triangle_set_find_container, point));
183
+ }
161
184
  }
162
185
 
163
186
  VALUE
@@ -362,3 +385,6 @@ rb_triangle_set_segment_ids_for_triangle(VALUE self, VALUE t) {
362
385
  return rval;
363
386
  }
364
387
 
388
+ void
389
+ init_triangle_set_o() {
390
+ }
data/ext/triangle_set.h CHANGED
@@ -19,13 +19,14 @@
19
19
  #ifndef TRIANGLE_SET_H
20
20
  #define TRIANGLE_SET_H
21
21
 
22
- #include "common.h"
22
+ #include <common.h>
23
23
 
24
24
  extern VALUE rb_triangle_set;
25
25
 
26
26
 
27
- #define RB_TRIANGLE_SET(triangle_set_pointer,klass) Data_Wrap_Struct(klass, triangle_set_mark, geo_set_free, (triangle_set_pointer))
28
- #define TRIANGLE_SET_REINDEX(set) if (set->index_dirty) triangle_set_reindex(set)
27
+ #define RB_TRIANGLE_SET(triangle_set_pointer,klass) ((triangle_set_pointer)->rbGeoSet = Data_Wrap_Struct(klass, triangle_set_mark, geo_set_free, (triangle_set_pointer)))
28
+ #define TRIANGLE_SET_REINDEX(set) if (set->index_dirty && set->indexed) triangle_set_reindex(set)
29
+ #define TRIANGLE_SET_P(l) (!NIL_P((l)) && rb_is_a((l), rb_triangle_set))
29
30
 
30
31
  VALUE
31
32
  rb_triangle_set_alloc(VALUE class);
@@ -81,5 +82,10 @@ geo_set_each_structure_having_common_segment_id_with_triangle_until(GeoSet *set,
81
82
  geo_set_structure_handler handler,
82
83
  gpointer user_data);
83
84
 
85
+ void
86
+ triangle_set_mark(GeoSet *set);
87
+
88
+ void
89
+ triangle_set_each_intersector(GeoSet *set, Line *line, geo_set_structure_handler handler, gpointer user_data);
84
90
 
85
91
  #endif
data/ext/types.h CHANGED
@@ -59,6 +59,8 @@ typedef struct {
59
59
  GHashTable *segments; // x-index_from_left(0) << 16 + y-index_from_top(ymax)
60
60
  GHashTable *segment_lines; // x-index_from_left(0) << 16 + y-index_from_top(ymax)
61
61
  gboolean index_dirty;
62
+ gboolean indexed;
63
+ VALUE rbGeoSet;
62
64
  } GeoSet;
63
65
 
64
66
 
metadata CHANGED
@@ -1,33 +1,26 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.2
3
- specification_version: 1
4
2
  name: geo
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.1.4
7
- date: 2007-12-17 00:00:00 +01:00
8
- summary: A 2D geometry engine.
9
- require_paths:
10
- - lib
11
- email: geo at troja dot ath dot cx
12
- homepage:
13
- rubyforge_project:
14
- description:
15
- autorequire: geo
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 0.1.5
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - Martin Kihlgren
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-01-11 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: geo at troja dot ath dot cx
18
+ executables: []
19
+
20
+ extensions:
21
+ - ext/extconf.rb
22
+ extra_rdoc_files:
23
+ - README
31
24
  files:
32
25
  - ext/common.c
33
26
  - ext/common.h
@@ -52,18 +45,32 @@ files:
52
45
  - ext/types.h
53
46
  - examples/intersects.rb
54
47
  - README
55
- test_files: []
56
-
48
+ has_rdoc: true
49
+ homepage:
50
+ post_install_message:
57
51
  rdoc_options:
58
52
  - --line-numbers
59
53
  - --inline-source
60
- extra_rdoc_files:
61
- - README
62
- executables: []
63
-
64
- extensions:
65
- - ext/extconf.rb
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ version:
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ version:
66
68
  requirements: []
67
69
 
68
- dependencies: []
70
+ rubyforge_project:
71
+ rubygems_version: 1.0.1
72
+ signing_key:
73
+ specification_version: 2
74
+ summary: A 2D geometry engine.
75
+ test_files: []
69
76