processing 0.5.33 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog.md +25 -1
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/Rakefile +5 -5
- data/VERSION +1 -1
- data/lib/processing/all.rb +4 -1
- data/lib/processing/context.rb +128 -0
- data/lib/processing/font.rb +5 -0
- data/lib/processing/graphics.rb +9 -0
- data/lib/processing/graphics_context.rb +640 -42
- data/lib/processing/image.rb +86 -0
- data/lib/processing/shader.rb +29 -16
- data/lib/processing/shape.rb +369 -28
- data/lib/processing/svg.rb +248 -0
- data/lib/processing/vector.rb +126 -0
- data/lib/processing/window.rb +2 -0
- data/processing.gemspec +4 -4
- data/test/{p5.rb → browser.rb} +37 -3
- data/test/helper.rb +40 -7
- data/test/test_color.rb +94 -0
- data/test/test_graphics_context.rb +26 -59
- data/test/test_shape.rb +129 -6
- data/test/test_svg.rb +257 -0
- metadata +17 -12
@@ -0,0 +1,248 @@
|
|
1
|
+
module Processing
|
2
|
+
|
3
|
+
|
4
|
+
# @private
|
5
|
+
class SVGLoader
|
6
|
+
|
7
|
+
def initialize(context)
|
8
|
+
@c, @cc = context, context.class
|
9
|
+
end
|
10
|
+
|
11
|
+
def load(filename)
|
12
|
+
parse File.read(filename)
|
13
|
+
end
|
14
|
+
|
15
|
+
def parse(xml)
|
16
|
+
addGroup nil, REXML::Document.new(xml).elements.first
|
17
|
+
end
|
18
|
+
|
19
|
+
def addGroup(parent, e, **attribs)
|
20
|
+
group = @c.createShape @cc::GROUP
|
21
|
+
attribs = getAttribs e, attribs
|
22
|
+
e.elements.each do |child|
|
23
|
+
case child.name.to_sym
|
24
|
+
when :g, :a then addGroup group, child, **attribs
|
25
|
+
when :line then addLine group, child, **attribs
|
26
|
+
when :rect then addRect group, child, **attribs
|
27
|
+
when :circle then addCircle group, child, **attribs
|
28
|
+
when :ellipse then addEllipse group, child, **attribs
|
29
|
+
when :polyline then addPolyline group, child, **attribs
|
30
|
+
when :polygon then addPolyline group, child, true, **attribs
|
31
|
+
when :path then addPath group, child, **attribs
|
32
|
+
end
|
33
|
+
end
|
34
|
+
parent.addChild group if parent
|
35
|
+
group
|
36
|
+
end
|
37
|
+
|
38
|
+
def addLine(parent, e, **attribs)
|
39
|
+
x1, y1 = float(e, :x1), float(e, :y1)
|
40
|
+
x2, y2 = float(e, :x2), float(e, :y2)
|
41
|
+
s = @c.createLineShape__ x1, y1, x2, y2
|
42
|
+
applyAttribs s, e, attribs
|
43
|
+
parent.addChild s
|
44
|
+
end
|
45
|
+
|
46
|
+
def addRect(parent, e, **attribs)
|
47
|
+
x, y = float(e, :x), float(e, :y)
|
48
|
+
w, h = float(e, :width), float(e, :height)
|
49
|
+
rx, ry = float(e, :rx), float(e, :ry)
|
50
|
+
s = @c.createRectShape__ x, y, w, h, (rx || ry), mode: @cc::CORNER
|
51
|
+
applyAttribs s, e, attribs
|
52
|
+
parent.addChild s
|
53
|
+
end
|
54
|
+
|
55
|
+
def addCircle(parent, e, **attribs)
|
56
|
+
cx, cy = float(e, :cx), float(e, :cy)
|
57
|
+
r = float(e, :r)
|
58
|
+
s = @c.createEllipseShape__ cx, cy, r * 2, r * 2, mode: @cc::CENTER
|
59
|
+
applyAttribs s, e, attribs
|
60
|
+
parent.addChild s
|
61
|
+
end
|
62
|
+
|
63
|
+
def addEllipse(parent, e, **attribs)
|
64
|
+
cx, cy = float(e, :cx), float(e, :cy)
|
65
|
+
rx, ry = float(e, :rx), float(e, :ry)
|
66
|
+
s = @c.createEllipseShape__ cx, cy, rx * 2, ry * 2, mode: @cc::CENTER
|
67
|
+
applyAttribs s, e, attribs
|
68
|
+
parent.addChild s
|
69
|
+
end
|
70
|
+
|
71
|
+
def addPolyline(parent, e, close = false, **attribs)
|
72
|
+
points = e[:points] or raise Error, "missing 'points'"
|
73
|
+
scanner = StringScanner.new points
|
74
|
+
child = @c.createShape
|
75
|
+
child.beginShape
|
76
|
+
|
77
|
+
skipSpaces scanner
|
78
|
+
until scanner.eos?
|
79
|
+
child.vertex(*nextPos(scanner))
|
80
|
+
skipSpaces scanner
|
81
|
+
end
|
82
|
+
|
83
|
+
child.endShape close ? @cc::CLOSE : @cc::OPEN
|
84
|
+
applyAttribs child, e, attribs
|
85
|
+
parent.addChild child
|
86
|
+
end
|
87
|
+
|
88
|
+
def applyAttribs(shape, e, attribs)
|
89
|
+
a = getAttribs e, attribs
|
90
|
+
shape.setFill a[:fill] || :black
|
91
|
+
shape.setStroke a[:stroke] || :none
|
92
|
+
shape.setStrokeWeight a[:strokeWeight] || 1
|
93
|
+
shape.setStrokeCap a[:strokeCap] || @cc::SQUARE
|
94
|
+
shape.setStrokeJoin a[:strokeJoin] || @cc::MITER
|
95
|
+
end
|
96
|
+
|
97
|
+
def getAttribs(e, attribs)
|
98
|
+
@caps ||= {
|
99
|
+
'butt' => @cc::SQUARE,
|
100
|
+
'round' => @cc::ROUND,
|
101
|
+
'square' => @cc::PROJECT
|
102
|
+
}
|
103
|
+
@joins ||= {
|
104
|
+
'miter' => @cc::MITER,
|
105
|
+
'miter-clip' => @cc::MITER,
|
106
|
+
'round' => @cc::ROUND,
|
107
|
+
'bevel' => @cc::BEVEL,
|
108
|
+
'arcs' => @cc::MITER
|
109
|
+
}
|
110
|
+
attribs.merge({
|
111
|
+
fill: e[:fill],
|
112
|
+
stroke: e[:stroke],
|
113
|
+
strokeWeight: e[:'stroke-width'],
|
114
|
+
strokeCap: @caps[ e[:'stroke-linecap']],
|
115
|
+
strokeJoin: @joins[e[:'stroke-linejoin']]
|
116
|
+
}.compact)
|
117
|
+
end
|
118
|
+
|
119
|
+
def int(e, key, defval = 0)
|
120
|
+
e[key]&.to_i || defval
|
121
|
+
end
|
122
|
+
|
123
|
+
def float(e, key, defval = 0)
|
124
|
+
e[key]&.to_f || defval
|
125
|
+
end
|
126
|
+
|
127
|
+
def addPath(parent, e, **attribs)
|
128
|
+
data = e[:d] or raise Error, "missing 'd'"
|
129
|
+
scanner = StringScanner.new data
|
130
|
+
skipSpaces scanner
|
131
|
+
|
132
|
+
child = nil
|
133
|
+
close = false
|
134
|
+
beginChild = -> {
|
135
|
+
close = false
|
136
|
+
child = @c.createShape
|
137
|
+
child.beginShape
|
138
|
+
}
|
139
|
+
endChild = -> {
|
140
|
+
if child# && child.getVertexCount >= 2
|
141
|
+
child.endShape close ? @cc::CLOSE : @cc::OPEN
|
142
|
+
applyAttribs child, e, attribs
|
143
|
+
parent.addChild child
|
144
|
+
end
|
145
|
+
}
|
146
|
+
|
147
|
+
lastCommand = nil
|
148
|
+
lastX, lastY = 0, 0
|
149
|
+
lastCX, lastCY = 0, 0
|
150
|
+
until scanner.eos?
|
151
|
+
command = nextCommand scanner
|
152
|
+
if command =~ /^[Mm]$/
|
153
|
+
endChild.call
|
154
|
+
beginChild.call
|
155
|
+
end
|
156
|
+
raise Error, "no leading 'M' or 'm'" unless child
|
157
|
+
|
158
|
+
command ||= lastCommand
|
159
|
+
case command
|
160
|
+
when 'M', 'm'
|
161
|
+
lastX, lastY = nextPos scanner, lastX, lastY, command == 'm'
|
162
|
+
child.vertex lastX, lastY
|
163
|
+
when 'L', 'l'
|
164
|
+
lastX, lastY = nextPos scanner, lastX, lastY, command == 'l'
|
165
|
+
child.vertex lastX, lastY
|
166
|
+
when 'H', 'h'
|
167
|
+
lastX = nextNum scanner, lastX, command == 'h'
|
168
|
+
child.vertex lastX, lastY
|
169
|
+
when 'V', 'v'
|
170
|
+
lastY = nextNum scanner, lastY, command == 'v'
|
171
|
+
child.vertex lastX, lastY
|
172
|
+
when 'Q', 'q'
|
173
|
+
relative = command == 'q'
|
174
|
+
lastCX, lastCY = nextPos scanner, lastX, lastY, relative
|
175
|
+
lastX, lastY = nextPos scanner, lastX, lastY, relative
|
176
|
+
child.quadraticVertex lastCX, lastCY, lastX, lastY
|
177
|
+
when 'T', 't'
|
178
|
+
lastCX, lastCY =
|
179
|
+
if lastCommand =~ /[QqTt]/
|
180
|
+
[lastX + (lastX - lastCX), lastY + (lastY - lastCY)]
|
181
|
+
else
|
182
|
+
[lastX, lastY]
|
183
|
+
end
|
184
|
+
lastX, lastY = nextPos scanner, lastX, lastY, command == 't'
|
185
|
+
child.quadraticVertex lastCX, lastCY, lastX, lastY
|
186
|
+
when 'C', 'c'
|
187
|
+
relative = command == 'c'
|
188
|
+
cx, cy = nextPos scanner, lastX, lastY, relative
|
189
|
+
lastCX, lastCY = nextPos scanner, lastX, lastY, relative
|
190
|
+
lastX, lastY = nextPos scanner, lastX, lastY, relative
|
191
|
+
child.bezierVertex cx, cy, lastCX, lastCY, lastX, lastY
|
192
|
+
when 'S', 's'
|
193
|
+
cx, cy =
|
194
|
+
if lastCommand =~ /[CcSs]/
|
195
|
+
[lastX + (lastX - lastCX), lastY + (lastY - lastCY)]
|
196
|
+
else
|
197
|
+
[lastX, lastY]
|
198
|
+
end
|
199
|
+
relative = command == 's'
|
200
|
+
lastCX, lastCY = nextPos scanner, lastX, lastY, relative
|
201
|
+
lastX, lastY = nextPos scanner, lastX, lastY, relative
|
202
|
+
child.bezierVertex cx, cy, lastCX, lastCY, lastX, lastY
|
203
|
+
when 'A', 'a'
|
204
|
+
rx, ry = nextPos scanner
|
205
|
+
a, b, c = nextNum(scanner), nextNum(scanner), nextNum(scanner)
|
206
|
+
lastX, lastY = nextPos scanner, lastX, lastY, command == 'a'
|
207
|
+
child.vertex lastX, lastY
|
208
|
+
when 'Z', 'z'
|
209
|
+
v0 = child.getVertex 0
|
210
|
+
lastX, lastY = v0 ? [v0.x, v0.y] : [0, 0]
|
211
|
+
close = true
|
212
|
+
end
|
213
|
+
lastCommand = command
|
214
|
+
end
|
215
|
+
endChild.call
|
216
|
+
end
|
217
|
+
|
218
|
+
def nextCommand(scanner)
|
219
|
+
w = scanner.scan(/[[:alpha:]]/)
|
220
|
+
skipSpaces scanner
|
221
|
+
w
|
222
|
+
end
|
223
|
+
|
224
|
+
def nextNum(scanner, base = 0, relative = true)
|
225
|
+
n = scanner.scan(/(?:[\+\-]\s*)?\d*(?:\.\d+)?/)&.strip&.to_f
|
226
|
+
raise Error, 'invalid path' unless n
|
227
|
+
skipSpaces scanner
|
228
|
+
n + (relative ? base : 0)
|
229
|
+
end
|
230
|
+
|
231
|
+
def nextPos(scanner, baseX = 0, baseY = 0, relative = true)
|
232
|
+
[nextNum(scanner, baseX, relative), nextNum(scanner, baseY, relative)]
|
233
|
+
end
|
234
|
+
|
235
|
+
def skipSpaces(scanner)
|
236
|
+
scanner.scan(/\s*,?\s*/)
|
237
|
+
end
|
238
|
+
|
239
|
+
class Error < StandardError
|
240
|
+
def initialize(message = "error")
|
241
|
+
super "SVG: #{message}"
|
242
|
+
end
|
243
|
+
end# Error
|
244
|
+
|
245
|
+
end# SVG
|
246
|
+
|
247
|
+
|
248
|
+
end# Processing
|
data/lib/processing/vector.rb
CHANGED
@@ -3,6 +3,9 @@ module Processing
|
|
3
3
|
|
4
4
|
# Vector class.
|
5
5
|
#
|
6
|
+
# @see https://processing.org/reference/PVector.html
|
7
|
+
# @see https://p5js.org/reference/#/p5.Vector
|
8
|
+
#
|
6
9
|
class Vector
|
7
10
|
|
8
11
|
include Comparable
|
@@ -22,6 +25,9 @@ module Processing
|
|
22
25
|
# @param v [Vector] vector object to copy
|
23
26
|
# @param a [Array] array like [x, y, z]
|
24
27
|
#
|
28
|
+
# @see https://processing.org/reference/PVector.html
|
29
|
+
# @see https://p5js.org/reference/#/p5.Vector
|
30
|
+
#
|
25
31
|
def initialize(x = 0, y = 0, z = 0, context: nil)
|
26
32
|
@point = case x
|
27
33
|
when Rays::Point then x.dup
|
@@ -42,6 +48,9 @@ module Processing
|
|
42
48
|
#
|
43
49
|
# @return [Vector] duplicated vector object
|
44
50
|
#
|
51
|
+
# @see https://processing.org/reference/PVector_copy_.html
|
52
|
+
# @see https://p5js.org/reference/#/p5.Vector/copy
|
53
|
+
#
|
45
54
|
alias copy dup
|
46
55
|
|
47
56
|
# Sets x, y and z.
|
@@ -60,6 +69,9 @@ module Processing
|
|
60
69
|
#
|
61
70
|
# @return [nil] nil
|
62
71
|
#
|
72
|
+
# @see https://processing.org/reference/PVector_set_.html
|
73
|
+
# @see https://p5js.org/reference/#/p5.Vector/set
|
74
|
+
#
|
63
75
|
def set(*args)
|
64
76
|
initialize(*args)
|
65
77
|
self
|
@@ -69,6 +81,9 @@ module Processing
|
|
69
81
|
#
|
70
82
|
# @return [Numeric] x value of vector
|
71
83
|
#
|
84
|
+
# @see https://processing.org/reference/PVector_x.html
|
85
|
+
# @see https://p5js.org/reference/#/p5.Vector/x
|
86
|
+
#
|
72
87
|
def x()
|
73
88
|
@point.x
|
74
89
|
end
|
@@ -77,6 +92,9 @@ module Processing
|
|
77
92
|
#
|
78
93
|
# @return [Numeric] y value of vector
|
79
94
|
#
|
95
|
+
# @see https://processing.org/reference/PVector_y.html
|
96
|
+
# @see https://p5js.org/reference/#/p5.Vector/y
|
97
|
+
#
|
80
98
|
def y()
|
81
99
|
@point.y
|
82
100
|
end
|
@@ -85,6 +103,9 @@ module Processing
|
|
85
103
|
#
|
86
104
|
# @return [Numeric] z value of vector
|
87
105
|
#
|
106
|
+
# @see https://processing.org/reference/PVector_z.html
|
107
|
+
# @see https://p5js.org/reference/#/p5.Vector/z
|
108
|
+
#
|
88
109
|
def z()
|
89
110
|
@point.z
|
90
111
|
end
|
@@ -93,6 +114,9 @@ module Processing
|
|
93
114
|
#
|
94
115
|
# @return [Numeric] x value of vector
|
95
116
|
#
|
117
|
+
# @see https://processing.org/reference/PVector_x.html
|
118
|
+
# @see https://p5js.org/reference/#/p5.Vector/x
|
119
|
+
#
|
96
120
|
def x=(x)
|
97
121
|
@point.x = x
|
98
122
|
end
|
@@ -101,6 +125,9 @@ module Processing
|
|
101
125
|
#
|
102
126
|
# @return [Numeric] y value of vector
|
103
127
|
#
|
128
|
+
# @see https://processing.org/reference/PVector_y.html
|
129
|
+
# @see https://p5js.org/reference/#/p5.Vector/y
|
130
|
+
#
|
104
131
|
def y=(y)
|
105
132
|
@point.y = y
|
106
133
|
end
|
@@ -109,6 +136,9 @@ module Processing
|
|
109
136
|
#
|
110
137
|
# @return [Numeric] z value of vector
|
111
138
|
#
|
139
|
+
# @see https://processing.org/reference/PVector_z.html
|
140
|
+
# @see https://p5js.org/reference/#/p5.Vector/z
|
141
|
+
#
|
112
142
|
def z=(z)
|
113
143
|
@point.z = z
|
114
144
|
end
|
@@ -127,6 +157,9 @@ module Processing
|
|
127
157
|
#
|
128
158
|
# @return [Vector] interporated vector
|
129
159
|
#
|
160
|
+
# @see https://processing.org/reference/PVector_lerp_.html
|
161
|
+
# @see https://p5js.org/reference/#/p5.Vector/lerp
|
162
|
+
#
|
130
163
|
def lerp(*args, amount)
|
131
164
|
v = toVector__(*args)
|
132
165
|
self.x = x + (v.x - x) * amount
|
@@ -143,6 +176,9 @@ module Processing
|
|
143
176
|
#
|
144
177
|
# @return [Vector] interporated vector
|
145
178
|
#
|
179
|
+
# @see https://processing.org/reference/PVector_lerp_.html
|
180
|
+
# @see https://p5js.org/reference/#/p5.Vector/lerp
|
181
|
+
#
|
146
182
|
def self.lerp(v1, v2, amount)
|
147
183
|
v1.dup.lerp v2, amount
|
148
184
|
end
|
@@ -153,6 +189,9 @@ module Processing
|
|
153
189
|
#
|
154
190
|
# @return [Array] array of x, y, z
|
155
191
|
#
|
192
|
+
# @see https://processing.org/reference/PVector_array_.html
|
193
|
+
# @see https://p5js.org/reference/#/p5.Vector/array
|
194
|
+
#
|
156
195
|
def array(n = 3)
|
157
196
|
@point.to_a n
|
158
197
|
end
|
@@ -172,6 +211,9 @@ module Processing
|
|
172
211
|
#
|
173
212
|
# @return [Vector] added vector
|
174
213
|
#
|
214
|
+
# @see https://processing.org/reference/PVector_add_.html
|
215
|
+
# @see https://p5js.org/reference/#/p5.Vector/add
|
216
|
+
#
|
175
217
|
def add(*args)
|
176
218
|
@point += toVector__(*args).getInternal__
|
177
219
|
self
|
@@ -190,6 +232,9 @@ module Processing
|
|
190
232
|
#
|
191
233
|
# @return [Vector] subtracted vector
|
192
234
|
#
|
235
|
+
# @see https://processing.org/reference/PVector_sub_.html
|
236
|
+
# @see https://p5js.org/reference/#/p5.Vector/sub
|
237
|
+
#
|
193
238
|
def sub(*args)
|
194
239
|
@point -= toVector__(*args).getInternal__
|
195
240
|
self
|
@@ -201,6 +246,9 @@ module Processing
|
|
201
246
|
#
|
202
247
|
# @return [Vector] multiplied vector
|
203
248
|
#
|
249
|
+
# @see https://processing.org/reference/PVector_mult_.html
|
250
|
+
# @see https://p5js.org/reference/#/p5.Vector/mult
|
251
|
+
#
|
204
252
|
def mult(num)
|
205
253
|
@point *= num
|
206
254
|
self
|
@@ -212,6 +260,9 @@ module Processing
|
|
212
260
|
#
|
213
261
|
# @return [Vector] divided vector
|
214
262
|
#
|
263
|
+
# @see https://processing.org/reference/PVector_div_.html
|
264
|
+
# @see https://p5js.org/reference/#/p5.Vector/div
|
265
|
+
#
|
215
266
|
def div(num)
|
216
267
|
@point /= num
|
217
268
|
self
|
@@ -223,6 +274,9 @@ module Processing
|
|
223
274
|
#
|
224
275
|
# @return [Vector] added vector
|
225
276
|
#
|
277
|
+
# @see https://processing.org/reference/PVector_add_.html
|
278
|
+
# @see https://p5js.org/reference/#/p5.Vector/add
|
279
|
+
#
|
226
280
|
def +(v)
|
227
281
|
dup.add v
|
228
282
|
end
|
@@ -233,6 +287,9 @@ module Processing
|
|
233
287
|
#
|
234
288
|
# @return [Vector] subtracted vector
|
235
289
|
#
|
290
|
+
# @see https://processing.org/reference/PVector_sub_.html
|
291
|
+
# @see https://p5js.org/reference/#/p5.Vector/sub
|
292
|
+
#
|
236
293
|
def -(v)
|
237
294
|
dup.sub v
|
238
295
|
end
|
@@ -243,6 +300,9 @@ module Processing
|
|
243
300
|
#
|
244
301
|
# @return [Vector] multiplied vector
|
245
302
|
#
|
303
|
+
# @see https://processing.org/reference/PVector_mult_.html
|
304
|
+
# @see https://p5js.org/reference/#/p5.Vector/mult
|
305
|
+
#
|
246
306
|
def *(num)
|
247
307
|
dup.mult num
|
248
308
|
end
|
@@ -253,6 +313,9 @@ module Processing
|
|
253
313
|
#
|
254
314
|
# @return [Vector] divided vector
|
255
315
|
#
|
316
|
+
# @see https://processing.org/reference/PVector_div_.html
|
317
|
+
# @see https://p5js.org/reference/#/p5.Vector/div
|
318
|
+
#
|
256
319
|
def /(num)
|
257
320
|
dup.div num
|
258
321
|
end
|
@@ -268,6 +331,9 @@ module Processing
|
|
268
331
|
#
|
269
332
|
# @return [Vector] added vector
|
270
333
|
#
|
334
|
+
# @see https://processing.org/reference/PVector_add_.html
|
335
|
+
# @see https://p5js.org/reference/#/p5.Vector/add
|
336
|
+
#
|
271
337
|
def self.add(v1, v2, target = nil)
|
272
338
|
v = v1 + v2
|
273
339
|
target.set v if self === target
|
@@ -285,6 +351,9 @@ module Processing
|
|
285
351
|
#
|
286
352
|
# @return [Vector] subtracted vector
|
287
353
|
#
|
354
|
+
# @see https://processing.org/reference/PVector_sub_.html
|
355
|
+
# @see https://p5js.org/reference/#/p5.Vector/sub
|
356
|
+
#
|
288
357
|
def self.sub(v1, v2, target = nil)
|
289
358
|
v = v1 - v2
|
290
359
|
target.set v if self === target
|
@@ -302,6 +371,9 @@ module Processing
|
|
302
371
|
#
|
303
372
|
# @return [Vector] multiplied vector
|
304
373
|
#
|
374
|
+
# @see https://processing.org/reference/PVector_mult_.html
|
375
|
+
# @see https://p5js.org/reference/#/p5.Vector/mult
|
376
|
+
#
|
305
377
|
def self.mult(v1, num, target = nil)
|
306
378
|
v = v1 * num
|
307
379
|
target.set v if self === target
|
@@ -319,6 +391,9 @@ module Processing
|
|
319
391
|
#
|
320
392
|
# @return [Vector] divided vector
|
321
393
|
#
|
394
|
+
# @see https://processing.org/reference/PVector_div_.html
|
395
|
+
# @see https://p5js.org/reference/#/p5.Vector/div
|
396
|
+
#
|
322
397
|
def self.div(v1, num, target = nil)
|
323
398
|
v = v1 / num
|
324
399
|
target.set v if self === target
|
@@ -329,6 +404,9 @@ module Processing
|
|
329
404
|
#
|
330
405
|
# @return [Numeric] length
|
331
406
|
#
|
407
|
+
# @see https://processing.org/reference/PVector_mag_.html
|
408
|
+
# @see https://p5js.org/reference/#/p5.Vector/mag
|
409
|
+
#
|
332
410
|
def mag()
|
333
411
|
@point.length
|
334
412
|
end
|
@@ -337,6 +415,9 @@ module Processing
|
|
337
415
|
#
|
338
416
|
# @return [Numeric] squared length
|
339
417
|
#
|
418
|
+
# @see https://processing.org/reference/PVector_magSq_.html
|
419
|
+
# @see https://p5js.org/reference/#/p5.Vector/magSq
|
420
|
+
#
|
340
421
|
def magSq()
|
341
422
|
Rays::Point::dot(@point, @point)
|
342
423
|
end
|
@@ -351,6 +432,9 @@ module Processing
|
|
351
432
|
#
|
352
433
|
# @return [Vector] vector with new length
|
353
434
|
#
|
435
|
+
# @see https://processing.org/reference/PVector_setMag_.html
|
436
|
+
# @see https://p5js.org/reference/#/p5.Vector/setMag
|
437
|
+
#
|
354
438
|
def setMag(target = nil, len)
|
355
439
|
(target || self).set @point.normal * len
|
356
440
|
end
|
@@ -361,6 +445,9 @@ module Processing
|
|
361
445
|
#
|
362
446
|
# @return [Vector] normalized vector
|
363
447
|
#
|
448
|
+
# @see https://processing.org/reference/PVector_normalize_.html
|
449
|
+
# @see https://p5js.org/reference/#/p5.Vector/normalize
|
450
|
+
#
|
364
451
|
def normalize(target = nil)
|
365
452
|
(target || self).set @point.normal
|
366
453
|
end
|
@@ -371,6 +458,9 @@ module Processing
|
|
371
458
|
#
|
372
459
|
# @return [Vector] new vector
|
373
460
|
#
|
461
|
+
# @see https://processing.org/reference/PVector_limit_.html
|
462
|
+
# @see https://p5js.org/reference/#/p5.Vector/limit
|
463
|
+
#
|
374
464
|
def limit(max)
|
375
465
|
setMag max if magSq > max ** 2
|
376
466
|
self
|
@@ -382,6 +472,9 @@ module Processing
|
|
382
472
|
#
|
383
473
|
# @return [Numeric] the distance
|
384
474
|
#
|
475
|
+
# @see https://processing.org/reference/PVector_dist_.html
|
476
|
+
# @see https://p5js.org/reference/#/p5.Vector/dist
|
477
|
+
#
|
385
478
|
def dist(v)
|
386
479
|
(self - v).mag
|
387
480
|
end
|
@@ -393,6 +486,9 @@ module Processing
|
|
393
486
|
#
|
394
487
|
# @return [Numeric] the distance
|
395
488
|
#
|
489
|
+
# @see https://processing.org/reference/PVector_dist_.html
|
490
|
+
# @see https://p5js.org/reference/#/p5.Vector/dist
|
491
|
+
#
|
396
492
|
def self.dist(v1, v2)
|
397
493
|
v1.dist v2
|
398
494
|
end
|
@@ -410,6 +506,9 @@ module Processing
|
|
410
506
|
#
|
411
507
|
# @return [Numeric] result of dot product
|
412
508
|
#
|
509
|
+
# @see https://processing.org/reference/PVector_dot_.html
|
510
|
+
# @see https://p5js.org/reference/#/p5.Vector/dot
|
511
|
+
#
|
413
512
|
def dot(*args)
|
414
513
|
Rays::Point::dot getInternal__, toVector__(*args).getInternal__
|
415
514
|
end
|
@@ -421,6 +520,9 @@ module Processing
|
|
421
520
|
#
|
422
521
|
# @return [Numeric] result of dot product
|
423
522
|
#
|
523
|
+
# @see https://processing.org/reference/PVector_dot_.html
|
524
|
+
# @see https://p5js.org/reference/#/p5.Vector/dot
|
525
|
+
#
|
424
526
|
def self.dot(v1, v2)
|
425
527
|
v1.dot v2
|
426
528
|
end
|
@@ -438,6 +540,9 @@ module Processing
|
|
438
540
|
#
|
439
541
|
# @return [Numeric] result of cross product
|
440
542
|
#
|
543
|
+
# @see https://processing.org/reference/PVector_cross_.html
|
544
|
+
# @see https://p5js.org/reference/#/p5.Vector/cross
|
545
|
+
#
|
441
546
|
def cross(a, *rest)
|
442
547
|
target = self.class === rest.last ? rest.pop : nil
|
443
548
|
v = self.class.new Rays::Point::cross getInternal__, toVector__(a, *rest).getInternal__
|
@@ -452,6 +557,9 @@ module Processing
|
|
452
557
|
#
|
453
558
|
# @return [Numeric] result of cross product
|
454
559
|
#
|
560
|
+
# @see https://processing.org/reference/PVector_cross_.html
|
561
|
+
# @see https://p5js.org/reference/#/p5.Vector/cross
|
562
|
+
#
|
455
563
|
def self.cross(v1, v2, target = nil)
|
456
564
|
v1.cross v2, target
|
457
565
|
end
|
@@ -462,6 +570,9 @@ module Processing
|
|
462
570
|
#
|
463
571
|
# @return [Vector] rotated this object
|
464
572
|
#
|
573
|
+
# @see https://processing.org/reference/PVector_rotate_.html
|
574
|
+
# @see https://p5js.org/reference/#/p5.Vector/rotate
|
575
|
+
#
|
465
576
|
def rotate(angle)
|
466
577
|
deg = @context ?
|
467
578
|
@context.toDegrees__(angle) : angle * GraphicsContext::RAD2DEG__
|
@@ -473,6 +584,9 @@ module Processing
|
|
473
584
|
#
|
474
585
|
# @return [Numeric] the angle in radians
|
475
586
|
#
|
587
|
+
# @see https://processing.org/reference/PVector_heading_.html
|
588
|
+
# @see https://p5js.org/reference/#/p5.Vector/heading
|
589
|
+
#
|
476
590
|
def heading()
|
477
591
|
Math.atan2 y, x
|
478
592
|
end
|
@@ -484,6 +598,9 @@ module Processing
|
|
484
598
|
#
|
485
599
|
# @return [Vector] rotated vector
|
486
600
|
#
|
601
|
+
# @see https://processing.org/reference/PVector_fromAngle_.html
|
602
|
+
# @see https://p5js.org/reference/#/p5.Vector/fromAngle
|
603
|
+
#
|
487
604
|
def self.fromAngle(angle, target = nil)
|
488
605
|
v = self.new(1, 0, 0).rotate(angle)
|
489
606
|
target.set v if target
|
@@ -497,6 +614,9 @@ module Processing
|
|
497
614
|
#
|
498
615
|
# @return [Numeric] angle in radians
|
499
616
|
#
|
617
|
+
# @see https://processing.org/reference/PVector_angleBetween_.html
|
618
|
+
# @see https://p5js.org/reference/#/p5.Vector/angleBetween
|
619
|
+
#
|
500
620
|
def self.angleBetween(v1, v2)
|
501
621
|
x1, y1, z1 = v1.array
|
502
622
|
x2, y2, z2 = v2.array
|
@@ -514,6 +634,9 @@ module Processing
|
|
514
634
|
#
|
515
635
|
# @return [Vector] a random vector
|
516
636
|
#
|
637
|
+
# @see https://processing.org/reference/PVector_random2D_.html
|
638
|
+
# @see https://p5js.org/reference/#/p5.Vector/random2D
|
639
|
+
#
|
517
640
|
def self.random2D(target = nil)
|
518
641
|
v = self.new(1, 0, 0)
|
519
642
|
v.getInternal__.rotate! rand 0.0...360.0
|
@@ -527,6 +650,9 @@ module Processing
|
|
527
650
|
#
|
528
651
|
# @return [Vector] a random vector
|
529
652
|
#
|
653
|
+
# @see https://processing.org/reference/PVector_random3D_.html
|
654
|
+
# @see https://p5js.org/reference/#/p5.Vector/random3D
|
655
|
+
#
|
530
656
|
def self.random3D(target = nil)
|
531
657
|
angle = rand 0.0...(Math::PI * 2)
|
532
658
|
z = rand(-1.0..1.0)
|
data/lib/processing/window.rb
CHANGED
@@ -212,6 +212,7 @@ module Processing
|
|
212
212
|
end# Window
|
213
213
|
|
214
214
|
|
215
|
+
# @private
|
215
216
|
class Window::Canvas
|
216
217
|
|
217
218
|
def initialize(window, width, height)
|
@@ -297,6 +298,7 @@ module Processing
|
|
297
298
|
end# Window::Canvas
|
298
299
|
|
299
300
|
|
301
|
+
# @private
|
300
302
|
class Window::CanvasView < Reflex::View
|
301
303
|
|
302
304
|
def on_update(e)
|
data/processing.gemspec
CHANGED
@@ -25,10 +25,10 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.platform = Gem::Platform::RUBY
|
26
26
|
s.required_ruby_version = '>= 3.0.0'
|
27
27
|
|
28
|
-
s.add_runtime_dependency 'xot', '~> 0.
|
29
|
-
s.add_runtime_dependency 'rucy', '~> 0.
|
30
|
-
s.add_runtime_dependency 'rays', '~> 0.
|
31
|
-
s.add_runtime_dependency 'reflexion', '~> 0.
|
28
|
+
s.add_runtime_dependency 'xot', '~> 0.2'
|
29
|
+
s.add_runtime_dependency 'rucy', '~> 0.2'
|
30
|
+
s.add_runtime_dependency 'rays', '~> 0.2'
|
31
|
+
s.add_runtime_dependency 'reflexion', '~> 0.2'
|
32
32
|
|
33
33
|
s.files = `git ls-files`.split $/
|
34
34
|
s.test_files = s.files.grep %r{^(test|spec|features)/}
|