triangular 0.0.1
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/.gitignore +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +25 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +31 -0
- data/Rakefile +11 -0
- data/examples/example_files/test_cube.stl +58 -0
- data/examples/example_files/y-axis-spacer.stl +310 -0
- data/examples/slice_example.rb +9 -0
- data/lib/triangular.rb +19 -0
- data/lib/triangular/facet.rb +81 -0
- data/lib/triangular/line.rb +38 -0
- data/lib/triangular/point.rb +33 -0
- data/lib/triangular/polyline.rb +24 -0
- data/lib/triangular/solid.rb +45 -0
- data/lib/triangular/vector.rb +4 -0
- data/lib/triangular/version.rb +3 -0
- data/lib/triangular/vertex.rb +44 -0
- data/spec/facet_spec.rb +257 -0
- data/spec/fixtures/test_cube.stl +58 -0
- data/spec/fixtures/y-axis-spacer.stl +310 -0
- data/spec/line_spec.rb +190 -0
- data/spec/point_spec.rb +67 -0
- data/spec/polyline_spec.rb +20 -0
- data/spec/solid_spec.rb +85 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/triangular_spec.rb +22 -0
- data/spec/vertex_spec.rb +44 -0
- data/triangular.gemspec +23 -0
- metadata +104 -0
@@ -0,0 +1,58 @@
|
|
1
|
+
solid model
|
2
|
+
facet normal -0.0 1.0 -0.0
|
3
|
+
outer loop
|
4
|
+
vertex -1.0 1.0 1.0
|
5
|
+
vertex 0.999999999999999 1.0 -1.0
|
6
|
+
vertex -1.0 1.0 -1.0
|
7
|
+
endloop
|
8
|
+
endfacet
|
9
|
+
facet normal -0.0 1.0 -0.0
|
10
|
+
outer loop
|
11
|
+
vertex 0.999999999999999 1.0 -1.0
|
12
|
+
vertex -1.0 1.0 1.0
|
13
|
+
vertex 0.999999999999999 1.0 1.0
|
14
|
+
endloop
|
15
|
+
endfacet
|
16
|
+
facet normal 1.0 -0.0 -0.0
|
17
|
+
outer loop
|
18
|
+
vertex 0.999999999999999 1.0 -1.0
|
19
|
+
vertex 0.999999999999999 -1.0 1.0
|
20
|
+
vertex 0.999999999999999 -1.0 -1.0
|
21
|
+
endloop
|
22
|
+
endfacet
|
23
|
+
facet normal 1.0 -0.0 -0.0
|
24
|
+
outer loop
|
25
|
+
vertex 0.999999999999999 -1.0 1.0
|
26
|
+
vertex 0.999999999999999 1.0 -1.0
|
27
|
+
vertex 0.999999999999999 1.0 1.0
|
28
|
+
endloop
|
29
|
+
endfacet
|
30
|
+
facet normal 0.0 -1.0 0.0
|
31
|
+
outer loop
|
32
|
+
vertex 0.999999999999999 -1.0 1.0
|
33
|
+
vertex -1.0 -1.0 -1.0
|
34
|
+
vertex 0.999999999999999 -1.0 -1.0
|
35
|
+
endloop
|
36
|
+
endfacet
|
37
|
+
facet normal 0.0 -1.0 0.0
|
38
|
+
outer loop
|
39
|
+
vertex -1.0 -1.0 -1.0
|
40
|
+
vertex 0.999999999999999 -1.0 1.0
|
41
|
+
vertex -1.0 -1.0 1.0
|
42
|
+
endloop
|
43
|
+
endfacet
|
44
|
+
facet normal -1.0 0.0 0.0
|
45
|
+
outer loop
|
46
|
+
vertex -1.0 1.0 1.0
|
47
|
+
vertex -1.0 -1.0 -1.0
|
48
|
+
vertex -1.0 -1.0 1.0
|
49
|
+
endloop
|
50
|
+
endfacet
|
51
|
+
facet normal -1.0 0.0 0.0
|
52
|
+
outer loop
|
53
|
+
vertex -1.0 -1.0 -1.0
|
54
|
+
vertex -1.0 1.0 1.0
|
55
|
+
vertex -1.0 1.0 -1.0
|
56
|
+
endloop
|
57
|
+
endfacet
|
58
|
+
endsolid model
|
@@ -0,0 +1,310 @@
|
|
1
|
+
solid y-axis-spacer
|
2
|
+
facet normal 0.0 0.0 -1.0
|
3
|
+
outer loop
|
4
|
+
vertex 16.5 0.0 -0.75
|
5
|
+
vertex 0.0 -9.5 -0.75
|
6
|
+
vertex 0.0 0.0 -0.75
|
7
|
+
endloop
|
8
|
+
endfacet
|
9
|
+
facet normal 0.0 0.0 -1.0
|
10
|
+
outer loop
|
11
|
+
vertex 0.0 -9.5 -0.75
|
12
|
+
vertex 16.5 0.0 -0.75
|
13
|
+
vertex 16.5 -9.5 -0.75
|
14
|
+
endloop
|
15
|
+
endfacet
|
16
|
+
facet normal -0.0 -1.0 -0.0
|
17
|
+
outer loop
|
18
|
+
vertex 16.5 -9.5 0.0
|
19
|
+
vertex 0.0 -9.5 -0.75
|
20
|
+
vertex 16.5 -9.5 -0.75
|
21
|
+
endloop
|
22
|
+
endfacet
|
23
|
+
facet normal -0.0 -1.0 -0.0
|
24
|
+
outer loop
|
25
|
+
vertex 0.0 -9.5 -0.75
|
26
|
+
vertex 16.5 -9.5 0.0
|
27
|
+
vertex 0.0 -9.5 0.0
|
28
|
+
endloop
|
29
|
+
endfacet
|
30
|
+
facet normal -0.0 1.0 0.0
|
31
|
+
outer loop
|
32
|
+
vertex 0.0 0.0 0.0
|
33
|
+
vertex 16.5 0.0 -0.75
|
34
|
+
vertex 0.0 0.0 -0.75
|
35
|
+
endloop
|
36
|
+
endfacet
|
37
|
+
facet normal -0.0 1.0 0.0
|
38
|
+
outer loop
|
39
|
+
vertex 16.5 0.0 -0.75
|
40
|
+
vertex 0.0 0.0 0.0
|
41
|
+
vertex 16.5 0.0 0.0
|
42
|
+
endloop
|
43
|
+
endfacet
|
44
|
+
facet normal -1.0 0.0 0.0
|
45
|
+
outer loop
|
46
|
+
vertex 0.0 -2.13 0.0
|
47
|
+
vertex 0.0 -7.37 -0.13
|
48
|
+
vertex 0.0 -7.37 0.0
|
49
|
+
endloop
|
50
|
+
endfacet
|
51
|
+
facet normal -1.0 0.0 0.0
|
52
|
+
outer loop
|
53
|
+
vertex 0.0 0.0 0.0
|
54
|
+
vertex 0.0 -1.87 -0.13
|
55
|
+
vertex 0.0 -1.87 0.0
|
56
|
+
endloop
|
57
|
+
endfacet
|
58
|
+
facet normal -1.0 0.0 0.0
|
59
|
+
outer loop
|
60
|
+
vertex 0.0 -7.63 0.0
|
61
|
+
vertex 0.0 -9.5 -0.75
|
62
|
+
vertex 0.0 -9.5 0.0
|
63
|
+
endloop
|
64
|
+
endfacet
|
65
|
+
facet normal -1.0 0.0 0.0
|
66
|
+
outer loop
|
67
|
+
vertex 0.0 -9.5 -0.75
|
68
|
+
vertex 0.0 -7.63 0.0
|
69
|
+
vertex 0.0 -7.63 -0.13
|
70
|
+
endloop
|
71
|
+
endfacet
|
72
|
+
facet normal -1.0 0.0 0.0
|
73
|
+
outer loop
|
74
|
+
vertex 0.0 -9.5 -0.75
|
75
|
+
vertex 0.0 -7.63 -0.13
|
76
|
+
vertex 0.0 0.0 -0.75
|
77
|
+
endloop
|
78
|
+
endfacet
|
79
|
+
facet normal -1.0 0.0 0.0
|
80
|
+
outer loop
|
81
|
+
vertex 0.0 0.0 -0.75
|
82
|
+
vertex 0.0 -7.63 -0.13
|
83
|
+
vertex 0.0 -7.37 -0.13
|
84
|
+
endloop
|
85
|
+
endfacet
|
86
|
+
facet normal -1.0 0.0 0.0
|
87
|
+
outer loop
|
88
|
+
vertex 0.0 0.0 -0.75
|
89
|
+
vertex 0.0 -7.37 -0.13
|
90
|
+
vertex 0.0 -2.13 -0.13
|
91
|
+
endloop
|
92
|
+
endfacet
|
93
|
+
facet normal -1.0 0.0 0.0
|
94
|
+
outer loop
|
95
|
+
vertex 0.0 -2.13 -0.13
|
96
|
+
vertex 0.0 -7.37 -0.13
|
97
|
+
vertex 0.0 -2.13 0.0
|
98
|
+
endloop
|
99
|
+
endfacet
|
100
|
+
facet normal -1.0 0.0 0.0
|
101
|
+
outer loop
|
102
|
+
vertex 0.0 0.0 -0.75
|
103
|
+
vertex 0.0 -2.13 -0.13
|
104
|
+
vertex 0.0 -1.87 -0.13
|
105
|
+
endloop
|
106
|
+
endfacet
|
107
|
+
facet normal -1.0 0.0 0.0
|
108
|
+
outer loop
|
109
|
+
vertex 0.0 0.0 -0.75
|
110
|
+
vertex 0.0 -1.87 -0.13
|
111
|
+
vertex 0.0 0.0 0.0
|
112
|
+
endloop
|
113
|
+
endfacet
|
114
|
+
facet normal 1.0 -5.23431439438796e-32 -6.31593542897867e-15
|
115
|
+
outer loop
|
116
|
+
vertex 16.5 0.0 -0.75
|
117
|
+
vertex 16.5 -9.5 0.0
|
118
|
+
vertex 16.5 -9.5 -0.75
|
119
|
+
endloop
|
120
|
+
endfacet
|
121
|
+
facet normal 1.0 -5.23431439438796e-32 -6.31593542897867e-15
|
122
|
+
outer loop
|
123
|
+
vertex 16.5 -9.5 0.0
|
124
|
+
vertex 16.5 0.0 -0.75
|
125
|
+
vertex 16.5 -7.63 -0.13
|
126
|
+
endloop
|
127
|
+
endfacet
|
128
|
+
facet normal 1.0 -5.23431439438796e-32 -6.31593542897867e-15
|
129
|
+
outer loop
|
130
|
+
vertex 16.5 -7.63 -0.13
|
131
|
+
vertex 16.5 0.0 -0.75
|
132
|
+
vertex 16.5 -7.37 -0.13
|
133
|
+
endloop
|
134
|
+
endfacet
|
135
|
+
facet normal 1.0 -5.23431439438796e-32 -6.31593542897867e-15
|
136
|
+
outer loop
|
137
|
+
vertex 16.5 -7.37 -0.13
|
138
|
+
vertex 16.5 0.0 -0.75
|
139
|
+
vertex 16.5 -7.37 0.0
|
140
|
+
endloop
|
141
|
+
endfacet
|
142
|
+
facet normal 1.0 -5.23431439438796e-32 -6.31593542897867e-15
|
143
|
+
outer loop
|
144
|
+
vertex 16.5 -7.37 0.0
|
145
|
+
vertex 16.5 0.0 -0.75
|
146
|
+
vertex 16.5 -2.13 -0.13
|
147
|
+
endloop
|
148
|
+
endfacet
|
149
|
+
facet normal 1.0 -5.23431439438796e-32 -6.31593542897867e-15
|
150
|
+
outer loop
|
151
|
+
vertex 16.5 -2.13 -0.13
|
152
|
+
vertex 16.5 0.0 -0.75
|
153
|
+
vertex 16.5 -1.87 -0.13
|
154
|
+
endloop
|
155
|
+
endfacet
|
156
|
+
facet normal 1.0 -5.23431439438796e-32 -6.31593542897867e-15
|
157
|
+
outer loop
|
158
|
+
vertex 16.5 -1.87 -0.13
|
159
|
+
vertex 16.5 0.0 -0.75
|
160
|
+
vertex 16.5 -1.87 0.0
|
161
|
+
endloop
|
162
|
+
endfacet
|
163
|
+
facet normal 1.0 -5.23431439438796e-32 -6.31593542897867e-15
|
164
|
+
outer loop
|
165
|
+
vertex 16.5 -1.87 0.0
|
166
|
+
vertex 16.5 0.0 -0.75
|
167
|
+
vertex 16.5 0.0 0.0
|
168
|
+
endloop
|
169
|
+
endfacet
|
170
|
+
facet normal 1.0 -5.23431439438796e-32 -6.31593542897867e-15
|
171
|
+
outer loop
|
172
|
+
vertex 16.5 -2.13 0.0
|
173
|
+
vertex 16.5 -7.37 0.0
|
174
|
+
vertex 16.5 -2.13 -0.13
|
175
|
+
endloop
|
176
|
+
endfacet
|
177
|
+
facet normal 1.0 -5.23431439438796e-32 -6.31593542897867e-15
|
178
|
+
outer loop
|
179
|
+
vertex 16.5 -7.63 0.0
|
180
|
+
vertex 16.5 -9.5 0.0
|
181
|
+
vertex 16.5 -7.63 -0.13
|
182
|
+
endloop
|
183
|
+
endfacet
|
184
|
+
facet normal -0.0 -0.0 1.0
|
185
|
+
outer loop
|
186
|
+
vertex 16.5 -1.87 0.0
|
187
|
+
vertex 0.0 0.0 0.0
|
188
|
+
vertex 0.0 -1.87 0.0
|
189
|
+
endloop
|
190
|
+
endfacet
|
191
|
+
facet normal -0.0 -0.0 1.0
|
192
|
+
outer loop
|
193
|
+
vertex 0.0 0.0 0.0
|
194
|
+
vertex 16.5 -1.87 0.0
|
195
|
+
vertex 16.5 0.0 0.0
|
196
|
+
endloop
|
197
|
+
endfacet
|
198
|
+
facet normal -0.0 -0.0 1.0
|
199
|
+
outer loop
|
200
|
+
vertex 16.5 -9.5 0.0
|
201
|
+
vertex 0.0 -7.63 0.0
|
202
|
+
vertex 0.0 -9.5 0.0
|
203
|
+
endloop
|
204
|
+
endfacet
|
205
|
+
facet normal -0.0 -0.0 1.0
|
206
|
+
outer loop
|
207
|
+
vertex 0.0 -7.63 0.0
|
208
|
+
vertex 16.5 -9.5 0.0
|
209
|
+
vertex 16.5 -7.63 0.0
|
210
|
+
endloop
|
211
|
+
endfacet
|
212
|
+
facet normal -0.0 -0.0 1.0
|
213
|
+
outer loop
|
214
|
+
vertex 16.5 -7.37 0.0
|
215
|
+
vertex 0.0 -2.13 0.0
|
216
|
+
vertex 0.0 -7.37 0.0
|
217
|
+
endloop
|
218
|
+
endfacet
|
219
|
+
facet normal -0.0 -0.0 1.0
|
220
|
+
outer loop
|
221
|
+
vertex 0.0 -2.13 0.0
|
222
|
+
vertex 16.5 -7.37 0.0
|
223
|
+
vertex 16.5 -2.13 0.0
|
224
|
+
endloop
|
225
|
+
endfacet
|
226
|
+
facet normal 0.0 0.0 -1.0
|
227
|
+
outer loop
|
228
|
+
vertex 16.5 -7.37 -0.13
|
229
|
+
vertex 0.0 -7.63 -0.13
|
230
|
+
vertex 0.0 -7.37 -0.13
|
231
|
+
endloop
|
232
|
+
endfacet
|
233
|
+
facet normal 0.0 0.0 -1.0
|
234
|
+
outer loop
|
235
|
+
vertex 0.0 -7.63 -0.13
|
236
|
+
vertex 16.5 -7.37 -0.13
|
237
|
+
vertex 16.5 -7.63 -0.13
|
238
|
+
endloop
|
239
|
+
endfacet
|
240
|
+
facet normal -0.0 1.0 0.0
|
241
|
+
outer loop
|
242
|
+
vertex 0.0 -7.37 0.0
|
243
|
+
vertex 16.5 -7.37 -0.13
|
244
|
+
vertex 0.0 -7.37 -0.13
|
245
|
+
endloop
|
246
|
+
endfacet
|
247
|
+
facet normal -0.0 1.0 0.0
|
248
|
+
outer loop
|
249
|
+
vertex 16.5 -7.37 -0.13
|
250
|
+
vertex 0.0 -7.37 0.0
|
251
|
+
vertex 16.5 -7.37 0.0
|
252
|
+
endloop
|
253
|
+
endfacet
|
254
|
+
facet normal -0.0 -1.0 -0.0
|
255
|
+
outer loop
|
256
|
+
vertex 16.5 -7.63 0.0
|
257
|
+
vertex 0.0 -7.63 -0.13
|
258
|
+
vertex 16.5 -7.63 -0.13
|
259
|
+
endloop
|
260
|
+
endfacet
|
261
|
+
facet normal -0.0 -1.0 -0.0
|
262
|
+
outer loop
|
263
|
+
vertex 0.0 -7.63 -0.13
|
264
|
+
vertex 16.5 -7.63 0.0
|
265
|
+
vertex 0.0 -7.63 0.0
|
266
|
+
endloop
|
267
|
+
endfacet
|
268
|
+
facet normal 0.0 0.0 -1.0
|
269
|
+
outer loop
|
270
|
+
vertex 16.5 -1.87 -0.13
|
271
|
+
vertex 0.0 -2.13 -0.13
|
272
|
+
vertex 0.0 -1.87 -0.13
|
273
|
+
endloop
|
274
|
+
endfacet
|
275
|
+
facet normal 0.0 0.0 -1.0
|
276
|
+
outer loop
|
277
|
+
vertex 0.0 -2.13 -0.13
|
278
|
+
vertex 16.5 -1.87 -0.13
|
279
|
+
vertex 16.5 -2.13 -0.13
|
280
|
+
endloop
|
281
|
+
endfacet
|
282
|
+
facet normal -0.0 1.0 0.0
|
283
|
+
outer loop
|
284
|
+
vertex 0.0 -1.87 0.0
|
285
|
+
vertex 16.5 -1.87 -0.13
|
286
|
+
vertex 0.0 -1.87 -0.13
|
287
|
+
endloop
|
288
|
+
endfacet
|
289
|
+
facet normal -0.0 1.0 0.0
|
290
|
+
outer loop
|
291
|
+
vertex 16.5 -1.87 -0.13
|
292
|
+
vertex 0.0 -1.87 0.0
|
293
|
+
vertex 16.5 -1.87 0.0
|
294
|
+
endloop
|
295
|
+
endfacet
|
296
|
+
facet normal -0.0 -1.0 -0.0
|
297
|
+
outer loop
|
298
|
+
vertex 16.5 -2.13 0.0
|
299
|
+
vertex 0.0 -2.13 -0.13
|
300
|
+
vertex 16.5 -2.13 -0.13
|
301
|
+
endloop
|
302
|
+
endfacet
|
303
|
+
facet normal -0.0 -1.0 -0.0
|
304
|
+
outer loop
|
305
|
+
vertex 0.0 -2.13 -0.13
|
306
|
+
vertex 16.5 -2.13 0.0
|
307
|
+
vertex 0.0 -2.13 0.0
|
308
|
+
endloop
|
309
|
+
endfacet
|
310
|
+
endsolid y-axis-spacer
|
data/spec/line_spec.rb
ADDED
@@ -0,0 +1,190 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Line do
|
4
|
+
describe "#intersects_z?" do
|
5
|
+
context "for a line that intersects the target Z plane" do
|
6
|
+
context "with a positive Z vector" do
|
7
|
+
before do
|
8
|
+
@line = Line.new(Vertex.new(0.0, 0.0, 0.0), Vertex.new(0.0, 0.0, 6.0))
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should return true" do
|
12
|
+
@line.intersects_z?(3.0).should be_true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "with a negative Z vector" do
|
17
|
+
before do
|
18
|
+
@line = Line.new(Vertex.new(0.0, 0.0, 6.0), Vertex.new(0.0, 0.0, 0.0))
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should return true" do
|
22
|
+
@line.intersects_z?(3.0).should be_true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "for a line that does not intersect the target Z plane" do
|
28
|
+
before do
|
29
|
+
@line = Line.new(Vertex.new(0.0, 0.0, 4.0), Vertex.new(0.0, 0.0, 6.0))
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should return false" do
|
33
|
+
@line.intersects_z?(3.0).should be_false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#intersection_at_z" do
|
39
|
+
context "for a line that intersects the target Z plane" do
|
40
|
+
context "and is located at the origin" do
|
41
|
+
context "with a positive Z vector" do
|
42
|
+
before do
|
43
|
+
@line = Line.new(Vertex.new(0.0, 0.0, 0.0), Vertex.new(0.0, 0.0, 6.0))
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return a a Point" do
|
47
|
+
@line.intersection_at_z(3.0).should be_a Point
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should return a Point representing the intersection" do
|
51
|
+
@line.intersection_at_z(3.0).x.should == 0.0
|
52
|
+
@line.intersection_at_z(3.0).y.should == 0.0
|
53
|
+
@line.intersection_at_z(3.0).z.should == 3.0
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "with a negative Z vector" do
|
58
|
+
before do
|
59
|
+
@line = Line.new(Vertex.new(0.0, 0.0, 6.0), Vertex.new(0.0, 0.0, 0.0))
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should return a Point representing the intersection" do
|
63
|
+
@line.intersection_at_z(3.0).x.should == 0.0
|
64
|
+
@line.intersection_at_z(3.0).y.should == 0.0
|
65
|
+
@line.intersection_at_z(3.0).z.should == 3.0
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "and is located away from the origin" do
|
71
|
+
context "with a positive Z vector" do
|
72
|
+
before do
|
73
|
+
@line = Line.new(Vertex.new(7.0, 7.0, 1.0), Vertex.new(7.0, 7.0, 7.0))
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should return a Point representing the intersection" do
|
77
|
+
@line.intersection_at_z(4.0).x.should == 7.0
|
78
|
+
@line.intersection_at_z(4.0).y.should == 7.0
|
79
|
+
@line.intersection_at_z(4.0).z.should == 4.0
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "with a negative Z vector" do
|
84
|
+
before do
|
85
|
+
@line = Line.new(Vertex.new(7.0, 7.0, 7.0), Vertex.new(1.0, 1.0, 1.0))
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should return a Point representing the intersection" do
|
89
|
+
@line.intersection_at_z(4.0).x.should == 4.0
|
90
|
+
@line.intersection_at_z(4.0).y.should == 4.0
|
91
|
+
@line.intersection_at_z(4.0).z.should == 4.0
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "and is located in negative space" do
|
98
|
+
context "with a negative Z vector" do
|
99
|
+
before do
|
100
|
+
@line = Line.new(Vertex.new(-1.0, -1.0, -1.0), Vertex.new(-7.0, -7.0, -7.0))
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should return a Point representing the intersection" do
|
104
|
+
@line.intersection_at_z(-4.0).x.should == -4.0
|
105
|
+
@line.intersection_at_z(-4.0).y.should == -4.0
|
106
|
+
@line.intersection_at_z(-4.0).z.should == -4.0
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "with a positive Z vector" do
|
111
|
+
before do
|
112
|
+
@line = Line.new(Vertex.new(-7.0, -7.0, -7.0), Vertex.new(-1.0, -1.0, -1.0))
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should return a Point representing the intersection" do
|
116
|
+
@line.intersection_at_z(-4.0).x.should == -4.0
|
117
|
+
@line.intersection_at_z(-4.0).y.should == -4.0
|
118
|
+
@line.intersection_at_z(-4.0).z.should == -4.0
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "and spans both positive and negative space" do
|
124
|
+
context "with a positive Z vector" do
|
125
|
+
before do
|
126
|
+
@line = Line.new(Vertex.new(-1.0, 1.0, 1.0), Vertex.new(1.0, 1.0, -1.0))
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should return a Point representing the intersection" do
|
130
|
+
@line.intersection_at_z(0).x.should == 0.0
|
131
|
+
@line.intersection_at_z(0).y.should == 1.0
|
132
|
+
@line.intersection_at_z(0).z.should == 0.0
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
context "with a negative Z vector" do
|
137
|
+
before do
|
138
|
+
@line = Line.new(Vertex.new(1.0, 1.0, 1.0), Vertex.new(-1.0, -1.0, -1.0))
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should return a Point representing the intersection" do
|
142
|
+
@line.intersection_at_z(0).x.should == 0
|
143
|
+
@line.intersection_at_z(0).y.should == 0
|
144
|
+
@line.intersection_at_z(0).z.should == 0
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
context "for a line that lies on the target Z plane" do
|
150
|
+
before do
|
151
|
+
@line = Line.new(Vertex.new(0.0, 0.0, 3.0), Vertex.new(0.0, 6.0, 3.0))
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should raise an error" do
|
155
|
+
lambda{
|
156
|
+
@line.intersection_at_z(3.0)
|
157
|
+
}.should raise_error
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context "for a line that does not intersect the target Z plane" do
|
162
|
+
before do
|
163
|
+
@line = Line.new(Vertex.new(0.0, 0.0, 4.0), Vertex.new(0.0, 0.0, 6.0))
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should return nil" do
|
167
|
+
@line.intersection_at_z(3.0).should be_nil
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
describe "==" do
|
173
|
+
it "should return true when the two lines are identical" do
|
174
|
+
(Line.new(Vertex.new(-1.0, -1.0, -1.0), Vertex.new(1.0, 1.0, 1.0)) == Line.new(Vertex.new(-1.0, -1.0, -1.0), Vertex.new(1.0, 1.0, 1.0))).should be_true
|
175
|
+
end
|
176
|
+
|
177
|
+
it "should not return true when the lines are not identical" do
|
178
|
+
(Line.new(Vertex.new(-1.0, -1.0, -1.1), Vertex.new(1.0, 1.0, 1.0)) == Line.new(Vertex.new(-1.0, -1.0, -1.0), Vertex.new(1.0, 1.0, 1.0))).should be_false
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe "#to_svg_path" do
|
183
|
+
it "should return a string containing an SVG path" do
|
184
|
+
line = Line.new(Vertex.new(0.0, 0.0, 0.0), Vertex.new(1.0, 1.0, 1.0))
|
185
|
+
expected_output = '<path d="M 0.0 0.0 L 1.0 1.0" fill="none" stroke="black" stroke-width="1" />'
|
186
|
+
|
187
|
+
line.to_svg_path.should == expected_output
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|