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/common.c +5 -4
- data/ext/common.h +9 -9
- data/ext/extconf.rb +3 -2
- data/ext/geo.c +10 -4
- data/ext/geo_set.c +66 -35
- data/ext/geo_set.h +9 -7
- data/ext/intersection.c +6 -2
- data/ext/intersection.h +1 -1
- data/ext/line.c +164 -14
- data/ext/line.h +21 -6
- data/ext/line_set.c +83 -165
- data/ext/line_set.h +15 -6
- data/ext/point.c +28 -4
- data/ext/point.h +10 -3
- data/ext/point_set.c +9 -5
- data/ext/point_set.h +3 -3
- data/ext/triangle.c +49 -27
- data/ext/triangle.h +4 -2
- data/ext/triangle_set.c +52 -26
- data/ext/triangle_set.h +9 -3
- data/ext/types.h +2 -0
- metadata +40 -33
data/ext/triangle.h
CHANGED
@@ -19,7 +19,7 @@
|
|
19
19
|
#ifndef TRIANGLE_H
|
20
20
|
#define TRIANGLE_H
|
21
21
|
|
22
|
-
#include
|
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
|
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
|
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
|
-
|
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
|
74
|
-
g_hash_table_yield_triangle(
|
75
|
-
rb_yield(( (Triangle *)
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
95
|
+
handler(set, triangle, handler_args);
|
94
96
|
}
|
95
97
|
return NULL;
|
96
98
|
}
|
97
99
|
|
98
|
-
static
|
99
|
-
|
100
|
-
VALUE
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
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
|
-
|
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
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
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
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
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
|
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.
|
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
|
-
|
56
|
-
|
48
|
+
has_rdoc: true
|
49
|
+
homepage:
|
50
|
+
post_install_message:
|
57
51
|
rdoc_options:
|
58
52
|
- --line-numbers
|
59
53
|
- --inline-source
|
60
|
-
|
61
|
-
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
-
|
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
|
-
|
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
|
|