rubysketch 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog.md +5 -0
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/lib/rubysketch/processing.rb +565 -11
- data/test/processing/test_vector.rb +395 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90fb6bf8a945c62f9ac122dc4df7515aa2ebf271cb100836c76cb8cc1d4f7c50
|
4
|
+
data.tar.gz: 53e61d592dbc5090d98e3c6bb015d406f018683767997c3f2f4d53462a9f27b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: deb1f851efbcfd3feff20a7495ad55c9ef3a2d1e9ee416d6b87de89069197cc397a64303c69929f212cb0dda658f739a6ca1f1e83bea3050afa219b889509a9d
|
7
|
+
data.tar.gz: ba13f0ce8a03a0b86f1ad20078e0b473d2e6058a446a3059c21f8c9e5ccabcaa72f065bcbfee13bb7b105960f0e658b1ee3e609c44c1429f1d4a9851ce122eab
|
data/ChangeLog.md
CHANGED
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.3
|
@@ -6,13 +6,567 @@ module RubySketch
|
|
6
6
|
module Processing
|
7
7
|
|
8
8
|
|
9
|
+
# Vector class.
|
10
|
+
#
|
11
|
+
class Vector
|
12
|
+
|
13
|
+
include Comparable
|
14
|
+
|
15
|
+
# Initialize vector object.
|
16
|
+
#
|
17
|
+
# @overload new()
|
18
|
+
# @overload new(x)
|
19
|
+
# @overload new(x, y)
|
20
|
+
# @overload new(x, y, z)
|
21
|
+
# @overload new(v)
|
22
|
+
# @overload new(a)
|
23
|
+
#
|
24
|
+
# @param x [Numeric] x of vector
|
25
|
+
# @param y [Numeric] y of vector
|
26
|
+
# @param z [Numeric] z of vector
|
27
|
+
# @param v [Vector] vector object to copy
|
28
|
+
# @param a [Array] array like [x, y, z]
|
29
|
+
#
|
30
|
+
def initialize (x = 0, y = 0, z = 0, context: context)
|
31
|
+
@point = case x
|
32
|
+
when Rays::Point then x.dup
|
33
|
+
when Vector then x.getInternal__.dup
|
34
|
+
when Array then Rays::Point.new x[0] || 0, x[1] || 0, x[2] || 0
|
35
|
+
else Rays::Point.new x || 0, y || 0, z || 0
|
36
|
+
end
|
37
|
+
@context = context
|
38
|
+
end
|
39
|
+
|
40
|
+
# Initializer for dup or clone
|
41
|
+
#
|
42
|
+
def initialize_copy (o)
|
43
|
+
@point = o.getInternal__.dup
|
44
|
+
end
|
45
|
+
|
46
|
+
# Copy vector object
|
47
|
+
#
|
48
|
+
# @return [Vector] duplicated vector object
|
49
|
+
#
|
50
|
+
alias copy dup
|
51
|
+
|
52
|
+
# Sets x, y and z.
|
53
|
+
#
|
54
|
+
# @overload set(x)
|
55
|
+
# @overload set(x, y)
|
56
|
+
# @overload set(x, y, z)
|
57
|
+
# @overload set(v)
|
58
|
+
# @overload set(a)
|
59
|
+
#
|
60
|
+
# @param x [Numeric] x of vector
|
61
|
+
# @param y [Numeric] y of vector
|
62
|
+
# @param z [Numeric] z of vector
|
63
|
+
# @param v [Vector] vector object to copy
|
64
|
+
# @param a [Array] array with x, y, z
|
65
|
+
#
|
66
|
+
# @return [nil] nil
|
67
|
+
#
|
68
|
+
def set (*args)
|
69
|
+
initialize *args
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
73
|
+
# Gets x value.
|
74
|
+
#
|
75
|
+
# @return [Numeric] x value of vector
|
76
|
+
#
|
77
|
+
def x ()
|
78
|
+
@point.x
|
79
|
+
end
|
80
|
+
|
81
|
+
# Gets y value.
|
82
|
+
#
|
83
|
+
# @return [Numeric] y value of vector
|
84
|
+
#
|
85
|
+
def y ()
|
86
|
+
@point.y
|
87
|
+
end
|
88
|
+
|
89
|
+
# Gets z value.
|
90
|
+
#
|
91
|
+
# @return [Numeric] z value of vector
|
92
|
+
#
|
93
|
+
def z ()
|
94
|
+
@point.z
|
95
|
+
end
|
96
|
+
|
97
|
+
# Sets x value.
|
98
|
+
#
|
99
|
+
# @return [Numeric] x value of vector
|
100
|
+
#
|
101
|
+
def x= (x)
|
102
|
+
@point.x = x
|
103
|
+
end
|
104
|
+
|
105
|
+
# Sets y value.
|
106
|
+
#
|
107
|
+
# @return [Numeric] y value of vector
|
108
|
+
#
|
109
|
+
def y= (y)
|
110
|
+
@point.y = y
|
111
|
+
end
|
112
|
+
|
113
|
+
# Sets z value.
|
114
|
+
#
|
115
|
+
# @return [Numeric] z value of vector
|
116
|
+
#
|
117
|
+
def z= (z)
|
118
|
+
@point.z = z
|
119
|
+
end
|
120
|
+
|
121
|
+
# Returns the interpolated vector between 2 vectors.
|
122
|
+
#
|
123
|
+
# @overload lerp(v, amount)
|
124
|
+
# @overload lerp(x, y, amount)
|
125
|
+
# @overload lerp(x, y, z, amount)
|
126
|
+
#
|
127
|
+
# @param v [Vector] vector to interpolate
|
128
|
+
# @param x [Numeric] x of vector to interpolate
|
129
|
+
# @param y [Numeric] y of vector to interpolate
|
130
|
+
# @param z [Numeric] z of vector to interpolate
|
131
|
+
# @param amount [Numeric] amount to interpolate
|
132
|
+
#
|
133
|
+
# @return [Vector] interporated vector
|
134
|
+
#
|
135
|
+
def lerp (*args, amount)
|
136
|
+
v = toVector__ *args
|
137
|
+
self.x = x + (v.x - x) * amount
|
138
|
+
self.y = y + (v.y - y) * amount
|
139
|
+
self.z = z + (v.z - z) * amount
|
140
|
+
self
|
141
|
+
end
|
142
|
+
|
143
|
+
# Returns the interpolated vector between 2 vectors.
|
144
|
+
#
|
145
|
+
# @param v1 [Vector] vector to interpolate
|
146
|
+
# @param v2 [Vector] vector to interpolate
|
147
|
+
# @param amount [Numeric] amount to interpolate
|
148
|
+
#
|
149
|
+
# @return [Vector] interporated vector
|
150
|
+
#
|
151
|
+
def self.lerp (v1, v2, amount)
|
152
|
+
v1.dup.lerp v2, amount
|
153
|
+
end
|
154
|
+
|
155
|
+
# Returns x, y, z as an array
|
156
|
+
#
|
157
|
+
# @return [Array] array of x, y, z
|
158
|
+
#
|
159
|
+
def array ()
|
160
|
+
@point.to_a 3
|
161
|
+
end
|
162
|
+
|
163
|
+
# Adds a vector.
|
164
|
+
#
|
165
|
+
# @overload add(v)
|
166
|
+
# @overload add(x, y)
|
167
|
+
# @overload add(x, y, z)
|
168
|
+
#
|
169
|
+
# @param v [Vector] vector to add
|
170
|
+
# @param x [Vector] x of vector to add
|
171
|
+
# @param y [Vector] y of vector to add
|
172
|
+
# @param z [Vector] z of vector to add
|
173
|
+
#
|
174
|
+
# @return [Vector] added vector
|
175
|
+
#
|
176
|
+
def add (*args)
|
177
|
+
@point += toVector__(*args).getInternal__
|
178
|
+
self
|
179
|
+
end
|
180
|
+
|
181
|
+
# Subtracts a vector.
|
182
|
+
#
|
183
|
+
# @overload sub(v)
|
184
|
+
# @overload sub(x, y)
|
185
|
+
# @overload sub(x, y, z)
|
186
|
+
#
|
187
|
+
# @param v [Vector] vector to subtract
|
188
|
+
# @param x [Vector] x of vector to subtract
|
189
|
+
# @param y [Vector] y of vector to subtract
|
190
|
+
# @param z [Vector] z of vector to subtract
|
191
|
+
#
|
192
|
+
# @return [Vector] subtracted vector
|
193
|
+
#
|
194
|
+
def sub (*args)
|
195
|
+
@point -= toVector__(*args).getInternal__
|
196
|
+
self
|
197
|
+
end
|
198
|
+
|
199
|
+
# Multiplies a vector by scalar.
|
200
|
+
#
|
201
|
+
# @param num [Numeric] number to multiply the vector
|
202
|
+
#
|
203
|
+
# @return [Vector] multiplied vector
|
204
|
+
#
|
205
|
+
def mult (num)
|
206
|
+
@point *= num
|
207
|
+
self
|
208
|
+
end
|
209
|
+
|
210
|
+
# Divides a vector by scalar.
|
211
|
+
#
|
212
|
+
# @param num [Numeric] number to divide the vector
|
213
|
+
#
|
214
|
+
# @return [Vector] divided vector
|
215
|
+
#
|
216
|
+
def div (num)
|
217
|
+
@point /= num
|
218
|
+
self
|
219
|
+
end
|
220
|
+
|
221
|
+
# Adds a vector.
|
222
|
+
#
|
223
|
+
# @param v [Vector] vector to add
|
224
|
+
#
|
225
|
+
# @return [Vector] added vector
|
226
|
+
#
|
227
|
+
def + (v)
|
228
|
+
dup.add v
|
229
|
+
end
|
230
|
+
|
231
|
+
# Subtracts a vector.
|
232
|
+
#
|
233
|
+
# @param v [Vector] vector to subtract
|
234
|
+
#
|
235
|
+
# @return [Vector] subtracted vector
|
236
|
+
#
|
237
|
+
def - (v)
|
238
|
+
dup.sub v
|
239
|
+
end
|
240
|
+
|
241
|
+
# Multiplies a vector by scalar.
|
242
|
+
#
|
243
|
+
# @param num [Numeric] number to multiply the vector
|
244
|
+
#
|
245
|
+
# @return [Vector] multiplied vector
|
246
|
+
#
|
247
|
+
def * (num)
|
248
|
+
dup.mult num
|
249
|
+
end
|
250
|
+
|
251
|
+
# Divides a vector by scalar.
|
252
|
+
#
|
253
|
+
# @param num [Numeric] number to divide the vector
|
254
|
+
#
|
255
|
+
# @return [Vector] divided vector
|
256
|
+
#
|
257
|
+
def / (num)
|
258
|
+
dup.div num
|
259
|
+
end
|
260
|
+
|
261
|
+
# Adds 2 vectors.
|
262
|
+
#
|
263
|
+
# @overload add(v1, v2)
|
264
|
+
# @overload add(v1, v2, target)
|
265
|
+
#
|
266
|
+
# @param v1 [Vector] a vector
|
267
|
+
# @param v2 [Vector] another vector
|
268
|
+
# @param target [Vector] vector to store added vector
|
269
|
+
#
|
270
|
+
# @return [Vector] added vector
|
271
|
+
#
|
272
|
+
def self.add (v1, v2, target = nil)
|
273
|
+
v = v1 + v2
|
274
|
+
target.set v if self === target
|
275
|
+
v
|
276
|
+
end
|
277
|
+
|
278
|
+
# Subtracts 2 vectors.
|
279
|
+
#
|
280
|
+
# @overload sub(v1, v2)
|
281
|
+
# @overload sub(v1, v2, target)
|
282
|
+
#
|
283
|
+
# @param v1 [Vector] a vector
|
284
|
+
# @param v2 [Vector] another vector
|
285
|
+
# @param target [Vector] vector to store subtracted vector
|
286
|
+
#
|
287
|
+
# @return [Vector] subtracted vector
|
288
|
+
#
|
289
|
+
def self.sub (v1, v2, target = nil)
|
290
|
+
v = v1 - v2
|
291
|
+
target.set v if self === target
|
292
|
+
v
|
293
|
+
end
|
294
|
+
|
295
|
+
# Multiplies a vector by scalar.
|
296
|
+
#
|
297
|
+
# @overload mult(v, num)
|
298
|
+
# @overload mult(v, num, target)
|
299
|
+
#
|
300
|
+
# @param v [Vector] a vector
|
301
|
+
# @param num [Numeric] number to multiply the vector
|
302
|
+
# @param target [Vector] vector to store multiplied vector
|
303
|
+
#
|
304
|
+
# @return [Vector] multiplied vector
|
305
|
+
#
|
306
|
+
def self.mult (v1, num, target = nil)
|
307
|
+
v = v1 * num
|
308
|
+
target.set v if self === target
|
309
|
+
v
|
310
|
+
end
|
311
|
+
|
312
|
+
# Divides a vector by scalar.
|
313
|
+
#
|
314
|
+
# @overload div(v, num)
|
315
|
+
# @overload div(v, num, target)
|
316
|
+
#
|
317
|
+
# @param v [Vector] a vector
|
318
|
+
# @param num [Numeric] number to divide the vector
|
319
|
+
# @param target [Vector] vector to store divided vector
|
320
|
+
#
|
321
|
+
# @return [Vector] divided vector
|
322
|
+
#
|
323
|
+
def self.div (v1, num, target = nil)
|
324
|
+
v = v1 / num
|
325
|
+
target.set v if self === target
|
326
|
+
v
|
327
|
+
end
|
328
|
+
|
329
|
+
# Returns the length of the vector.
|
330
|
+
#
|
331
|
+
# @return [Numeric] length
|
332
|
+
#
|
333
|
+
def mag ()
|
334
|
+
@point.length
|
335
|
+
end
|
336
|
+
|
337
|
+
# Returns squared length of the vector.
|
338
|
+
#
|
339
|
+
# @return [Numeric] squared length
|
340
|
+
#
|
341
|
+
def magSq ()
|
342
|
+
Rays::Point::dot(@point, @point)
|
343
|
+
end
|
344
|
+
|
345
|
+
# Changes the length of the vector.
|
346
|
+
#
|
347
|
+
# @overload setMag(len)
|
348
|
+
# @overload setMag(target, len)
|
349
|
+
#
|
350
|
+
# @param len [Numeric] length of new vector
|
351
|
+
# @param target [Vector] vector to store new vector
|
352
|
+
#
|
353
|
+
# @return [Vector] vector with new length
|
354
|
+
#
|
355
|
+
def setMag (target = nil, len)
|
356
|
+
(target || self).set @point.normal * len
|
357
|
+
end
|
358
|
+
|
359
|
+
# Changes the length of the vector to 1.0.
|
360
|
+
#
|
361
|
+
# @param target [Vector] vector to store the normalized vector
|
362
|
+
#
|
363
|
+
# @return [Vector] normalized vector
|
364
|
+
#
|
365
|
+
def normalize (target = nil)
|
366
|
+
(target || self).set @point.normal
|
367
|
+
end
|
368
|
+
|
369
|
+
# Changes the length of the vector if it's length is greater than the max value.
|
370
|
+
#
|
371
|
+
# @param max [Numeric] max length
|
372
|
+
#
|
373
|
+
# @return [Vector] new vector
|
374
|
+
#
|
375
|
+
def limit (max)
|
376
|
+
setMag max if magSq > max ** 2
|
377
|
+
self
|
378
|
+
end
|
379
|
+
|
380
|
+
# Returns the distance of 2 vectors.
|
381
|
+
#
|
382
|
+
# @param v [Vector] a vector
|
383
|
+
#
|
384
|
+
# @return [Numeric] the distance
|
385
|
+
#
|
386
|
+
def dist (v)
|
387
|
+
(self - v).mag
|
388
|
+
end
|
389
|
+
|
390
|
+
# Returns the distance of 2 vectors.
|
391
|
+
#
|
392
|
+
# @param v1 [Vector] a vector
|
393
|
+
# @param v2 [Vector] another vector
|
394
|
+
#
|
395
|
+
# @return [Numeric] the distance
|
396
|
+
#
|
397
|
+
def self.dist (v1, v2)
|
398
|
+
v1.dist v2
|
399
|
+
end
|
400
|
+
|
401
|
+
# Calculates the dot product of 2 vectors.
|
402
|
+
#
|
403
|
+
# @overload dot(v)
|
404
|
+
# @overload dot(x, y)
|
405
|
+
# @overload dot(x, y, z)
|
406
|
+
#
|
407
|
+
# @param v [Vector] a vector
|
408
|
+
# @param x [Numeric] x of vector
|
409
|
+
# @param y [Numeric] y of vector
|
410
|
+
# @param z [Numeric] z of vector
|
411
|
+
#
|
412
|
+
# @return [Numeric] result of dot product
|
413
|
+
#
|
414
|
+
def dot (*args)
|
415
|
+
Rays::Point::dot getInternal__, toVector__(*args).getInternal__
|
416
|
+
end
|
417
|
+
|
418
|
+
# Calculates the dot product of 2 vectors.
|
419
|
+
#
|
420
|
+
# @param v1 [Vector] a vector
|
421
|
+
# @param v2 [Vector] another vector
|
422
|
+
#
|
423
|
+
# @return [Numeric] result of dot product
|
424
|
+
#
|
425
|
+
def self.dot (v1, v2)
|
426
|
+
v1.dot v2
|
427
|
+
end
|
428
|
+
|
429
|
+
# Calculates the cross product of 2 vectors.
|
430
|
+
#
|
431
|
+
# @overload cross(v)
|
432
|
+
# @overload cross(x, y)
|
433
|
+
# @overload cross(x, y, z)
|
434
|
+
#
|
435
|
+
# @param v [Vector] a vector
|
436
|
+
# @param x [Numeric] x of vector
|
437
|
+
# @param y [Numeric] y of vector
|
438
|
+
# @param z [Numeric] z of vector
|
439
|
+
#
|
440
|
+
# @return [Numeric] result of cross product
|
441
|
+
#
|
442
|
+
def cross (a, *rest)
|
443
|
+
target = self.class === rest.last ? rest.pop : nil
|
444
|
+
v = self.class.new Rays::Point::cross getInternal__, toVector__(a, *rest).getInternal__
|
445
|
+
target.set v if self.class === target
|
446
|
+
v
|
447
|
+
end
|
448
|
+
|
449
|
+
# Calculates the cross product of 2 vectors.
|
450
|
+
#
|
451
|
+
# @param v1 [Vector] a vector
|
452
|
+
# @param v2 [Vector] another vector
|
453
|
+
#
|
454
|
+
# @return [Numeric] result of cross product
|
455
|
+
#
|
456
|
+
def self.cross (v1, v2, target = nil)
|
457
|
+
v1.cross v2, target
|
458
|
+
end
|
459
|
+
|
460
|
+
# Rotate the vector.
|
461
|
+
#
|
462
|
+
# @param angle [Numeric] the angle of rotation
|
463
|
+
#
|
464
|
+
# @return [Vector] rotated this object
|
465
|
+
#
|
466
|
+
def rotate (angle)
|
467
|
+
angle = @context ? @context.toAngle__(angle) : angle * Utility::RAD2DEG__
|
468
|
+
@point.rotate! angle
|
469
|
+
self
|
470
|
+
end
|
471
|
+
|
472
|
+
# Returns the angle of rotation for this vector.
|
473
|
+
#
|
474
|
+
# @return [Numeric] the angle in radians
|
475
|
+
#
|
476
|
+
def heading ()
|
477
|
+
Math.atan2 y, x
|
478
|
+
end
|
479
|
+
|
480
|
+
# Returns rotated new vector.
|
481
|
+
#
|
482
|
+
# @param angle [Numeric] the angle of rotation
|
483
|
+
# @param target [Vector] vector to store new vector
|
484
|
+
#
|
485
|
+
# @return [Vector] rotated vector
|
486
|
+
#
|
487
|
+
def self.fromAngle (angle, target = nil)
|
488
|
+
v = self.new(1, 0, 0).rotate(angle)
|
489
|
+
target.set v if target
|
490
|
+
v
|
491
|
+
end
|
492
|
+
|
493
|
+
# Returns angle between 2 vectors.
|
494
|
+
#
|
495
|
+
# @param v1 [Vector] a vector
|
496
|
+
# @param v2 [Vector] another vector
|
497
|
+
#
|
498
|
+
# @return [Numeric] angle in radians
|
499
|
+
#
|
500
|
+
def self.angleBetween (v1, v2)
|
501
|
+
x1, y1, z1 = v1.array
|
502
|
+
x2, y2, z2 = v2.array
|
503
|
+
return 0 if (x1 == 0 && y1 == 0 && z1 == 0) || (x2 == 0 && y2 == 0 && z2 == 0)
|
504
|
+
|
505
|
+
x = dot(v1, v2) / (v1.mag * v2.mag)
|
506
|
+
return Math::PI if x <= -1
|
507
|
+
return 0 if x >= 1
|
508
|
+
return Math.acos x
|
509
|
+
end
|
510
|
+
|
511
|
+
# Returns a new 2D unit vector with a random direction.
|
512
|
+
#
|
513
|
+
# @param target [Vector] a vector to store the new vector
|
514
|
+
#
|
515
|
+
# @return [Vector] a random vector
|
516
|
+
#
|
517
|
+
def self.random2D (target = nil)
|
518
|
+
v = self.fromAngle rand 0.0...(Math::PI * 2)
|
519
|
+
target.set v if target
|
520
|
+
v
|
521
|
+
end
|
522
|
+
|
523
|
+
# Returns a new 3D unit vector with a random direction.
|
524
|
+
#
|
525
|
+
# @param target [Vector] a vector to store the new vector
|
526
|
+
#
|
527
|
+
# @return [Vector] a random vector
|
528
|
+
#
|
529
|
+
def self.random3D (target = nil)
|
530
|
+
angle = rand 0.0...(Math::PI * 2)
|
531
|
+
z = rand -1.0..1.0
|
532
|
+
z2 = z ** 2
|
533
|
+
x = Math.sqrt(1.0 - z2) * Math.cos(angle)
|
534
|
+
y = Math.sqrt(1.0 - z2) * Math.sin(angle)
|
535
|
+
v = self.new x, y, z
|
536
|
+
target.set v if target
|
537
|
+
v
|
538
|
+
end
|
539
|
+
|
540
|
+
# @private
|
541
|
+
def inspect ()
|
542
|
+
"<##{self.class.name} #{x}, #{y}, #{z}>"
|
543
|
+
end
|
544
|
+
|
545
|
+
# @private
|
546
|
+
def <=> (o)
|
547
|
+
@point <=> o.getInternal__
|
548
|
+
end
|
549
|
+
|
550
|
+
# @private
|
551
|
+
protected def getInternal__ ()
|
552
|
+
@point
|
553
|
+
end
|
554
|
+
|
555
|
+
# @private
|
556
|
+
private def toVector__ (*args)
|
557
|
+
self.class === args.first ? args.first : self.class.new(*args)
|
558
|
+
end
|
559
|
+
|
560
|
+
end# Vector
|
561
|
+
|
562
|
+
|
9
563
|
# Image object.
|
10
564
|
#
|
11
565
|
class Image
|
12
566
|
|
13
567
|
# @private
|
14
568
|
def initialize (image)
|
15
|
-
@
|
569
|
+
@image = image
|
16
570
|
end
|
17
571
|
|
18
572
|
# Gets width of image.
|
@@ -20,7 +574,7 @@ module RubySketch
|
|
20
574
|
# @return [Numeric] width of image
|
21
575
|
#
|
22
576
|
def width ()
|
23
|
-
@
|
577
|
+
@image.width
|
24
578
|
end
|
25
579
|
|
26
580
|
# Gets height of image.
|
@@ -28,7 +582,7 @@ module RubySketch
|
|
28
582
|
# @return [Numeric] height of image
|
29
583
|
#
|
30
584
|
def height ()
|
31
|
-
@
|
585
|
+
@image.height
|
32
586
|
end
|
33
587
|
|
34
588
|
# Resizes image.
|
@@ -39,8 +593,8 @@ module RubySketch
|
|
39
593
|
# @return [nil] nil
|
40
594
|
#
|
41
595
|
def resize (width, height)
|
42
|
-
@
|
43
|
-
painter.image @
|
596
|
+
@image = Rays::Image.new(width, height).paint do |painter|
|
597
|
+
painter.image @image, 0, 0, width, height
|
44
598
|
end
|
45
599
|
nil
|
46
600
|
end
|
@@ -64,7 +618,7 @@ module RubySketch
|
|
64
618
|
#
|
65
619
|
def copy (img = nil, sx, sy, sw, sh, dx, dy, dw, dh)
|
66
620
|
img ||= self
|
67
|
-
@
|
621
|
+
@image.paint do |painter|
|
68
622
|
painter.image img.getInternal__, sx, sy, sw, sh, dx, dy, dw, dh
|
69
623
|
end
|
70
624
|
end
|
@@ -74,12 +628,12 @@ module RubySketch
|
|
74
628
|
# @param filename [String] file name to save image
|
75
629
|
#
|
76
630
|
def save (filename)
|
77
|
-
@
|
631
|
+
@image.save filename
|
78
632
|
end
|
79
633
|
|
80
634
|
# @private
|
81
635
|
def getInternal__ ()
|
82
|
-
@
|
636
|
+
@image
|
83
637
|
end
|
84
638
|
|
85
639
|
end# Image
|
@@ -369,7 +923,7 @@ module RubySketch
|
|
369
923
|
end
|
370
924
|
|
371
925
|
# @private
|
372
|
-
|
926
|
+
protected def toAngle__ (angle)
|
373
927
|
angle * @angleScale__
|
374
928
|
end
|
375
929
|
|
@@ -1025,12 +1579,12 @@ module RubySketch
|
|
1025
1579
|
end
|
1026
1580
|
|
1027
1581
|
# @private
|
1028
|
-
def getInternal__ ()
|
1582
|
+
private def getInternal__ ()
|
1029
1583
|
@image__
|
1030
1584
|
end
|
1031
1585
|
|
1032
1586
|
# @private
|
1033
|
-
def assertDrawing__ ()
|
1587
|
+
private def assertDrawing__ ()
|
1034
1588
|
raise "call beginDraw() before drawing" unless @drawing
|
1035
1589
|
end
|
1036
1590
|
|
@@ -0,0 +1,395 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require_relative '../helper'
|
5
|
+
|
6
|
+
|
7
|
+
class TestProcessingVector < Test::Unit::TestCase
|
8
|
+
|
9
|
+
V = RubySketch::Processing::Vector
|
10
|
+
|
11
|
+
M = Math
|
12
|
+
|
13
|
+
PI = M::PI
|
14
|
+
|
15
|
+
def vec (*args)
|
16
|
+
V.new *args
|
17
|
+
end
|
18
|
+
|
19
|
+
def point (*args)
|
20
|
+
Rays::Point.new *args
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_initialize ()
|
24
|
+
assert_equal vec(0, 0, 0), vec()
|
25
|
+
assert_equal vec(1, 0, 0), vec(1)
|
26
|
+
assert_equal vec(1, 2, 0), vec(1, 2)
|
27
|
+
assert_equal vec(1, 2, 3), vec(1, 2, 3)
|
28
|
+
|
29
|
+
assert_equal vec(0, 0, 0), vec([])
|
30
|
+
assert_equal vec(1, 0, 0), vec([1])
|
31
|
+
assert_equal vec(1, 2, 0), vec([1, 2])
|
32
|
+
assert_equal vec(1, 2, 3), vec([1, 2, 3])
|
33
|
+
|
34
|
+
assert_equal vec(1, 2, 3), vec(vec 1, 2, 3)
|
35
|
+
assert_equal vec(1, 2, 3), vec(point 1, 2, 3)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_set ()
|
39
|
+
v0 = vec 9, 9, 9
|
40
|
+
|
41
|
+
v = v0.dup; v.set; assert_equal vec(0, 0, 0), v
|
42
|
+
v = v0.dup; v.set 1; assert_equal vec(1, 0, 0), v
|
43
|
+
v = v0.dup; v.set 1, 2; assert_equal vec(1, 2, 0), v
|
44
|
+
v = v0.dup; v.set 1, 2, 3; assert_equal vec(1, 2, 3), v
|
45
|
+
|
46
|
+
v = v0.dup; v.set []; assert_equal vec(0, 0, 0), v
|
47
|
+
v = v0.dup; v.set [1]; assert_equal vec(1, 0, 0), v
|
48
|
+
v = v0.dup; v.set [1, 2]; assert_equal vec(1, 2, 0), v
|
49
|
+
v = v0.dup; v.set [1, 2, 3]; assert_equal vec(1, 2, 3), v
|
50
|
+
|
51
|
+
v = v0.dup; v.set vec(1, 2, 3); assert_equal vec(1, 2, 3), v
|
52
|
+
v = v0.dup; v.set point(1, 2, 3); assert_equal vec(1, 2, 3), v
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_dup ()
|
56
|
+
v1 = vec 1, 2, 3
|
57
|
+
assert_equal vec(1, 2, 3), v1
|
58
|
+
|
59
|
+
v2 = v1.dup
|
60
|
+
assert_equal vec(1, 2, 3), v1
|
61
|
+
assert_equal vec(1, 2, 3), v2
|
62
|
+
|
63
|
+
v1.set 7, 8, 9
|
64
|
+
assert_equal vec(7, 8, 9), v1
|
65
|
+
assert_equal vec(1, 2, 3), v2
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_copy ()
|
69
|
+
v1 = vec 1, 2, 3
|
70
|
+
assert_equal vec(1, 2, 3), v1
|
71
|
+
|
72
|
+
v2 = v1.copy
|
73
|
+
assert_equal vec(1, 2, 3), v1
|
74
|
+
assert_equal vec(1, 2, 3), v2
|
75
|
+
|
76
|
+
v1.set 7, 8, 9
|
77
|
+
assert_equal vec(7, 8, 9), v1
|
78
|
+
assert_equal vec(1, 2, 3), v2
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_xyz ()
|
82
|
+
v = vec 1, 2, 3
|
83
|
+
assert_equal vec(1, 2, 3), v
|
84
|
+
assert_equal [1, 2, 3], [v.x, v.y, v.z]
|
85
|
+
|
86
|
+
v.x = 7
|
87
|
+
assert_equal vec(7, 2, 3), v
|
88
|
+
|
89
|
+
v.y = 8
|
90
|
+
assert_equal vec(7, 8, 3), v
|
91
|
+
|
92
|
+
v.z = 9
|
93
|
+
assert_equal vec(7, 8, 9), v
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_array ()
|
97
|
+
assert_equal [1, 2, 3], vec(1, 2, 3).array
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_add ()
|
101
|
+
v = vec 1, 2, 3
|
102
|
+
v.add 4, 5, 6
|
103
|
+
assert_equal vec(5, 7, 9), v
|
104
|
+
|
105
|
+
assert_equal vec(1, 2, 3), vec(1, 2, 3).add()
|
106
|
+
assert_equal vec(5, 2, 3), vec(1, 2, 3).add(4)
|
107
|
+
assert_equal vec(5, 7, 3), vec(1, 2, 3).add(4, 5)
|
108
|
+
assert_equal vec(5, 7, 9), vec(1, 2, 3).add(4, 5, 6)
|
109
|
+
|
110
|
+
assert_equal vec(1, 2, 3), vec(1, 2, 3).add([])
|
111
|
+
assert_equal vec(5, 2, 3), vec(1, 2, 3).add([4])
|
112
|
+
assert_equal vec(5, 7, 3), vec(1, 2, 3).add([4, 5])
|
113
|
+
assert_equal vec(5, 7, 9), vec(1, 2, 3).add([4, 5, 6])
|
114
|
+
|
115
|
+
assert_equal vec(5, 7, 9), vec(1, 2, 3).add( vec(4, 5, 6))
|
116
|
+
assert_equal vec(5, 7, 9), vec(1, 2, 3).add(point(4, 5, 6))
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_sub ()
|
120
|
+
v = vec 9, 8, 7
|
121
|
+
v.sub 1, 2, 3
|
122
|
+
assert_equal vec(8, 6, 4), v
|
123
|
+
|
124
|
+
assert_equal vec(9, 8, 7), vec(9, 8, 7).sub()
|
125
|
+
assert_equal vec(8, 8, 7), vec(9, 8, 7).sub(1)
|
126
|
+
assert_equal vec(8, 6, 7), vec(9, 8, 7).sub(1, 2)
|
127
|
+
assert_equal vec(8, 6, 4), vec(9, 8, 7).sub(1, 2, 3)
|
128
|
+
|
129
|
+
assert_equal vec(9, 8, 7), vec(9, 8, 7).sub([])
|
130
|
+
assert_equal vec(8, 8, 7), vec(9, 8, 7).sub([1])
|
131
|
+
assert_equal vec(8, 6, 7), vec(9, 8, 7).sub([1, 2])
|
132
|
+
assert_equal vec(8, 6, 4), vec(9, 8, 7).sub([1, 2, 3])
|
133
|
+
|
134
|
+
assert_equal vec(8, 6, 4), vec(9, 8, 7).sub( vec(1, 2, 3))
|
135
|
+
assert_equal vec(8, 6, 4), vec(9, 8, 7).sub(point(1, 2, 3))
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_mult ()
|
139
|
+
v = vec 1, 2, 3
|
140
|
+
v.mult 2
|
141
|
+
assert_equal vec(2, 4, 6), v
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_div ()
|
145
|
+
v = vec 2, 4, 6
|
146
|
+
v.div 2
|
147
|
+
assert_equal vec(1, 2, 3), v
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_op_add ()
|
151
|
+
v1 = vec 1, 2, 3
|
152
|
+
v2 = vec 4, 5, 6
|
153
|
+
assert_equal vec(5, 7, 9), v1 + v2
|
154
|
+
assert_equal vec(1, 2, 3), v1
|
155
|
+
assert_equal vec(4, 5, 6), v2
|
156
|
+
|
157
|
+
assert_equal vec(5, 2, 3), vec(1, 2, 3) + 4
|
158
|
+
|
159
|
+
assert_equal vec(1, 2, 3), vec(1, 2, 3) + []
|
160
|
+
assert_equal vec(5, 2, 3), vec(1, 2, 3) + [4]
|
161
|
+
assert_equal vec(5, 7, 3), vec(1, 2, 3) + [4, 5]
|
162
|
+
assert_equal vec(5, 7, 9), vec(1, 2, 3) + [4, 5, 6]
|
163
|
+
|
164
|
+
assert_equal vec(5, 7, 9), vec(1, 2, 3) + vec(4, 5, 6)
|
165
|
+
assert_equal vec(5, 7, 9), vec(1, 2, 3) + point(4, 5, 6)
|
166
|
+
end
|
167
|
+
|
168
|
+
def test_op_sub ()
|
169
|
+
v1 = vec 9, 8, 7
|
170
|
+
v2 = vec 1, 2, 3
|
171
|
+
assert_equal vec(8, 6, 4), v1 - v2
|
172
|
+
assert_equal vec(9, 8, 7), v1
|
173
|
+
assert_equal vec(1, 2, 3), v2
|
174
|
+
|
175
|
+
assert_equal vec(8, 8, 7), vec(9, 8, 7) - 1
|
176
|
+
|
177
|
+
assert_equal vec(9, 8, 7), vec(9, 8, 7) - []
|
178
|
+
assert_equal vec(8, 8, 7), vec(9, 8, 7) - [1]
|
179
|
+
assert_equal vec(8, 6, 7), vec(9, 8, 7) - [1, 2]
|
180
|
+
assert_equal vec(8, 6, 4), vec(9, 8, 7) - [1, 2, 3]
|
181
|
+
|
182
|
+
assert_equal vec(8, 6, 4), vec(9, 8, 7) - vec(1, 2, 3)
|
183
|
+
assert_equal vec(8, 6, 4), vec(9, 8, 7) - point(1, 2, 3)
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_op_mult ()
|
187
|
+
v = vec 1, 2, 3
|
188
|
+
assert_equal vec(2, 4, 6), v * 2
|
189
|
+
assert_equal vec(1, 2, 3), v
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_op_div ()
|
193
|
+
v = vec 2, 4, 6
|
194
|
+
assert_equal vec(1, 2, 3), v / 2
|
195
|
+
assert_equal vec(2, 4, 6), v
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_fun_add ()
|
199
|
+
v1 = vec 1, 2, 3
|
200
|
+
v2 = vec 4, 5, 6
|
201
|
+
result = vec
|
202
|
+
assert_equal vec(5, 7, 9), V.add(v1, v2, result)
|
203
|
+
assert_equal vec(1, 2, 3), v1
|
204
|
+
assert_equal vec(4, 5, 6), v2
|
205
|
+
assert_equal vec(5, 7, 9), result
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_fun_sub ()
|
209
|
+
v1 = vec 9, 8, 7
|
210
|
+
v2 = vec 1, 2, 3
|
211
|
+
result = vec
|
212
|
+
assert_equal vec(8, 6, 4), V.sub(v1, v2, result)
|
213
|
+
assert_equal vec(9, 8, 7), v1
|
214
|
+
assert_equal vec(1, 2, 3), v2
|
215
|
+
assert_equal vec(8, 6, 4), result
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_fun_mult ()
|
219
|
+
v1 = vec 1, 2, 3
|
220
|
+
result = vec
|
221
|
+
assert_equal vec(2, 4, 6), V.mult(v1, 2, result)
|
222
|
+
assert_equal vec(1, 2, 3), v1
|
223
|
+
assert_equal vec(2, 4, 6), result
|
224
|
+
end
|
225
|
+
|
226
|
+
def test_fun_div ()
|
227
|
+
v1 = vec 2, 4, 6
|
228
|
+
result = vec
|
229
|
+
assert_equal vec(1, 2, 3), V.div(v1, 2, result)
|
230
|
+
assert_equal vec(2, 4, 6), v1
|
231
|
+
assert_equal vec(1, 2, 3), result
|
232
|
+
end
|
233
|
+
|
234
|
+
def test_mag ()
|
235
|
+
assert_in_delta M.sqrt(5), vec(1, 2) .mag, 0.000001
|
236
|
+
assert_in_delta M.sqrt(14), vec(1, 2, 3).mag, 0.000001
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_magSq ()
|
240
|
+
assert_equal 5, vec(1, 2) .magSq
|
241
|
+
assert_equal 14, vec(1, 2, 3).magSq
|
242
|
+
end
|
243
|
+
|
244
|
+
def test_setMag ()
|
245
|
+
v = vec 3, 4, 0
|
246
|
+
assert_equal vec(6, 8, 0), v.setMag(10)
|
247
|
+
assert_equal vec(6, 8, 0), v
|
248
|
+
|
249
|
+
v = vec 3, 4, 0
|
250
|
+
result = vec
|
251
|
+
assert_equal vec(6, 8, 0), v.setMag(result, 10)
|
252
|
+
assert_equal vec(3, 4, 0), v
|
253
|
+
assert_equal vec(6, 8, 0), result
|
254
|
+
end
|
255
|
+
|
256
|
+
def test_normalize ()
|
257
|
+
v = vec 1, 2, 3
|
258
|
+
normal = v / v.mag
|
259
|
+
assert_equal normal, v.normalize
|
260
|
+
assert_equal normal, v
|
261
|
+
|
262
|
+
v = vec 1, 2, 3
|
263
|
+
result = vec
|
264
|
+
assert_equal normal, v.normalize(result)
|
265
|
+
assert_equal vec(1, 2, 3), v
|
266
|
+
assert_equal normal, result
|
267
|
+
end
|
268
|
+
|
269
|
+
def test_limit ()
|
270
|
+
v = vec 1, 2, 3
|
271
|
+
assert_in_delta 1, v.limit(1).mag, 0.000001
|
272
|
+
assert_in_delta 1, v .mag, 0.000001
|
273
|
+
|
274
|
+
assert_in_delta 1, vec(1, 2, 3).limit(1).mag, 0.000001
|
275
|
+
assert_in_delta 2, vec(1, 2, 3).limit(2).mag, 0.000001
|
276
|
+
assert_in_delta 3, vec(1, 2, 3).limit(3).mag, 0.000001
|
277
|
+
assert_in_delta vec(1, 2, 3).mag, vec(1, 2, 3).limit(4).mag, 0.000001
|
278
|
+
end
|
279
|
+
|
280
|
+
def test_dist ()
|
281
|
+
v1 = vec 1, 2, 3
|
282
|
+
v2 = vec 4, 5, 6
|
283
|
+
|
284
|
+
assert_in_delta M.sqrt((4-1)**2 + (5-2)**2 + (6-3)**2), v1.dist(v2), 0.000001
|
285
|
+
assert_equal vec(1, 2, 3), v1
|
286
|
+
assert_equal vec(4, 5, 6), v2
|
287
|
+
|
288
|
+
assert_in_delta M.sqrt((4-1)**2 + (5-2)**2 + (6-3)**2), V.dist(v1, v2), 0.000001
|
289
|
+
assert_equal vec(1, 2, 3), v1
|
290
|
+
assert_equal vec(4, 5, 6), v2
|
291
|
+
end
|
292
|
+
|
293
|
+
def test_dot ()
|
294
|
+
v1 = vec 1, 2, 3
|
295
|
+
v2 = vec 4, 5, 6
|
296
|
+
|
297
|
+
assert_equal 1*4 + 2*5 + 3*6, v1.dot(4, 5, 6)
|
298
|
+
assert_equal vec(1, 2, 3), v1
|
299
|
+
|
300
|
+
assert_equal 1*4 + 2*5 + 3*6, v1.dot(v2)
|
301
|
+
assert_equal vec(1, 2, 3), v1
|
302
|
+
assert_equal vec(4, 5, 6), v2
|
303
|
+
|
304
|
+
assert_equal 1*4 + 2*5 + 3*6, V.dot(v1, v2)
|
305
|
+
assert_equal vec(1, 2, 3), v1
|
306
|
+
assert_equal vec(4, 5, 6), v2
|
307
|
+
end
|
308
|
+
|
309
|
+
def test_cross ()
|
310
|
+
v1 = vec 1, 0, 0
|
311
|
+
v2 = vec 0, 1, 0
|
312
|
+
|
313
|
+
assert_equal vec(0, 0, 1), v1.cross(0, 1, 0)
|
314
|
+
assert_equal vec(1, 0, 0), v1
|
315
|
+
|
316
|
+
result = vec 1, 2, 3
|
317
|
+
assert_equal vec(0, 0, 1), v1.cross(v2, result)
|
318
|
+
assert_equal vec(1, 0, 0), v1
|
319
|
+
assert_equal vec(0, 1, 0), v2
|
320
|
+
assert_equal vec(0, 0, 1), result
|
321
|
+
|
322
|
+
result = vec 1, 2, 3
|
323
|
+
assert_equal vec(0, 0, 1), V.cross(v1, v2, result)
|
324
|
+
assert_equal vec(1, 0, 0), v1
|
325
|
+
assert_equal vec(0, 1, 0), v2
|
326
|
+
assert_equal vec(0, 0, 1), result
|
327
|
+
end
|
328
|
+
|
329
|
+
def test_rotate ()
|
330
|
+
angle = PI * 2 * 0.1
|
331
|
+
context = Object.new.tap {|o| def o.toAngle__ (angle); angle; end}
|
332
|
+
|
333
|
+
v = vec 1, 0, 0
|
334
|
+
assert_equal vec(M.cos(angle), M.sin(angle), 0), v.rotate(angle)
|
335
|
+
assert_equal vec(M.cos(angle), M.sin(angle), 0), v
|
336
|
+
|
337
|
+
v = vec 1, 0, 0, context: context
|
338
|
+
assert_equal vec(M.cos(angle), M.sin(angle), 0), v.rotate(36)
|
339
|
+
end
|
340
|
+
|
341
|
+
def test_fromAngle ()
|
342
|
+
angle = PI * 2 * 0.1
|
343
|
+
result = vec
|
344
|
+
assert_equal vec(M.cos(angle), M.sin(angle), 0), V.fromAngle(angle)
|
345
|
+
assert_equal vec(M.cos(angle), M.sin(angle), 0), V.fromAngle(angle, result)
|
346
|
+
assert_equal vec(M.cos(angle), M.sin(angle), 0), result
|
347
|
+
end
|
348
|
+
|
349
|
+
def test_heading ()
|
350
|
+
angle = PI * 1 * 0.1
|
351
|
+
assert_in_delta angle, V.fromAngle( angle).heading, 0.000001
|
352
|
+
assert_in_delta -angle, V.fromAngle(-angle).heading, 0.000001
|
353
|
+
end
|
354
|
+
|
355
|
+
def test_angleBetween ()
|
356
|
+
v1 = V.fromAngle PI * 0.25
|
357
|
+
v2 = V.fromAngle PI * 0.75
|
358
|
+
assert_in_delta PI / 2, V.angleBetween(v1, v2), 0.000001
|
359
|
+
end
|
360
|
+
|
361
|
+
def test_lerp ()
|
362
|
+
assert_equal vec(0.5, 0.5, 0.5), vec(0, 0, 0).lerp(vec(1, 1, 1), 0.5)
|
363
|
+
assert_equal vec(0.5, 0.5, 0.5), vec(0, 0, 0).lerp( 1, 1, 1, 0.5)
|
364
|
+
assert_equal vec(0.5, 0.5, 0.5), V.lerp(vec(0, 0, 0), vec(1, 1, 1), 0.5)
|
365
|
+
end
|
366
|
+
|
367
|
+
def test_random2D ()
|
368
|
+
v1 = V.random2D
|
369
|
+
v2 = V.random2D
|
370
|
+
assert v1.x != 0
|
371
|
+
assert v1.y != 0
|
372
|
+
assert_equal 0, v1.z
|
373
|
+
assert v2.x != 0
|
374
|
+
assert v2.y != 0
|
375
|
+
assert_equal 0, v2.z
|
376
|
+
assert_not_equal v1, v2
|
377
|
+
assert_in_delta 1, v1.mag, 0.000001
|
378
|
+
assert_in_delta 1, v2.mag, 0.000001
|
379
|
+
end
|
380
|
+
|
381
|
+
def test_random3D ()
|
382
|
+
v1 = V.random3D
|
383
|
+
v2 = V.random3D
|
384
|
+
assert v1.x != 0
|
385
|
+
assert v1.y != 0
|
386
|
+
assert v1.z != 0
|
387
|
+
assert v2.x != 0
|
388
|
+
assert v2.y != 0
|
389
|
+
assert v2.z != 0
|
390
|
+
assert_not_equal v1, v2
|
391
|
+
assert_in_delta 1, v1.mag, 0.000001
|
392
|
+
assert_in_delta 1, v2.mag, 0.000001
|
393
|
+
end
|
394
|
+
|
395
|
+
end# TestProcessingVector
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubysketch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- xordog
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yard
|
@@ -120,6 +120,7 @@ files:
|
|
120
120
|
- lib/rubysketch/processing.rb
|
121
121
|
- lib/rubysketch/window.rb
|
122
122
|
- rubysketch.gemspec
|
123
|
+
- test/processing/test_vector.rb
|
123
124
|
homepage: https://github.com/xord/rubysketch
|
124
125
|
licenses: []
|
125
126
|
metadata: {}
|
@@ -142,4 +143,5 @@ rubygems_version: 3.0.3
|
|
142
143
|
signing_key:
|
143
144
|
specification_version: 4
|
144
145
|
summary: Processing like Creative Coding Framework.
|
145
|
-
test_files:
|
146
|
+
test_files:
|
147
|
+
- test/processing/test_vector.rb
|