numerix 1.0.0
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.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.travis.yml +5 -0
- data/.yardopts +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +66 -0
- data/Rakefile +18 -0
- data/TODO.txt +25 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/ext/numerix/common.h +107 -0
- data/ext/numerix/extconf.rb +3 -0
- data/ext/numerix/matrix3x2.c +638 -0
- data/ext/numerix/matrix3x2.h +52 -0
- data/ext/numerix/matrix4x4.c +1807 -0
- data/ext/numerix/matrix4x4.h +90 -0
- data/ext/numerix/matrix_base.c +307 -0
- data/ext/numerix/matrix_base.h +70 -0
- data/ext/numerix/numerix.c +33 -0
- data/ext/numerix/numerix.h +19 -0
- data/ext/numerix/plane.c +311 -0
- data/ext/numerix/plane.h +34 -0
- data/ext/numerix/quaternion.c +712 -0
- data/ext/numerix/quaternion.h +53 -0
- data/ext/numerix/structure.c +154 -0
- data/ext/numerix/structure.h +24 -0
- data/ext/numerix/vector.c +326 -0
- data/ext/numerix/vector.h +57 -0
- data/ext/numerix/vector2.c +641 -0
- data/ext/numerix/vector2.h +64 -0
- data/ext/numerix/vector3.c +805 -0
- data/ext/numerix/vector3.h +68 -0
- data/ext/numerix/vector4.c +727 -0
- data/ext/numerix/vector4.h +63 -0
- data/ext/numerix/vector_base.c +94 -0
- data/ext/numerix/vector_base.h +30 -0
- data/extra/numerix128.png +0 -0
- data/extra/numerix24.png +0 -0
- data/extra/numerix32.png +0 -0
- data/extra/numerix320.png +0 -0
- data/extra/numerix48.png +0 -0
- data/extra/numerix96.png +0 -0
- data/lib/numerix/error.rb +36 -0
- data/lib/numerix/matrix3x2.rb +420 -0
- data/lib/numerix/matrix4x4.rb +676 -0
- data/lib/numerix/matrix_base.rb +14 -0
- data/lib/numerix/plane.rb +154 -0
- data/lib/numerix/quaternion.rb +355 -0
- data/lib/numerix/structure.rb +124 -0
- data/lib/numerix/vector.rb +13 -0
- data/lib/numerix/vector2.rb +534 -0
- data/lib/numerix/vector3.rb +572 -0
- data/lib/numerix/vector4.rb +551 -0
- data/lib/numerix/vector_base.rb +14 -0
- data/lib/numerix/version.rb +6 -0
- data/lib/numerix.rb +10 -0
- data/numerix.gemspec +30 -0
- metadata +167 -0
@@ -0,0 +1,154 @@
|
|
1
|
+
module Numerix
|
2
|
+
|
3
|
+
##
|
4
|
+
# A structure encapsulating a 3D Plane.
|
5
|
+
class Plane < Structure
|
6
|
+
|
7
|
+
##
|
8
|
+
# @return [Vector3] the normal vector of the plane.
|
9
|
+
attr_accessor :normal
|
10
|
+
|
11
|
+
##
|
12
|
+
# @return [Float] the distance of the plane along its normal from the
|
13
|
+
# origin.
|
14
|
+
attr_accessor :distance
|
15
|
+
|
16
|
+
##
|
17
|
+
# @overload initialize
|
18
|
+
# Creates a new plane will all values default to `0.0`.
|
19
|
+
#
|
20
|
+
# @overload initialize(vector)
|
21
|
+
# Constructs a Plane from the given Vector4.
|
22
|
+
#
|
23
|
+
# @param vector [Vector4] A vector whose first 3 elements describe the
|
24
|
+
# normal vector, and whose W component defines the distance along that
|
25
|
+
# normal from the origin.
|
26
|
+
#
|
27
|
+
# @overload initialize(normal, distance)
|
28
|
+
# Constructs a Plane from the given normal and distance along the normal
|
29
|
+
# from the origin.
|
30
|
+
#
|
31
|
+
# @param normal [Vector3] The normal vector of the plane.
|
32
|
+
# @param distance [Float] The distance of the plane along its normal from
|
33
|
+
# the origin.
|
34
|
+
#
|
35
|
+
# @overload initialize(x, y, z, distance)
|
36
|
+
# Constructs a plane from the X, Y, and Z components of its normal, and
|
37
|
+
# its distance from the origin on that normal.
|
38
|
+
#
|
39
|
+
# @param x [Float] The normal X component.
|
40
|
+
# @param y [Float] The normal Y component.
|
41
|
+
# @param z [Float] The normal Z component.
|
42
|
+
# @param distance [Float] The distance of the Plane along its normal from
|
43
|
+
# the origin.
|
44
|
+
def initialize(*args)
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# @note This plane must already be normalized, so that its normal vector is
|
49
|
+
# of unit length, before this method is called.
|
50
|
+
#
|
51
|
+
# Applies a transformation to the plane.
|
52
|
+
#
|
53
|
+
# @overload transform(matrix)
|
54
|
+
#
|
55
|
+
# Transforms a normalized plane by a matrix.
|
56
|
+
#
|
57
|
+
# @param matrix [Matrix4x4] The transformation matrix.
|
58
|
+
#
|
59
|
+
# @return [Plane] the transformed plane.
|
60
|
+
#
|
61
|
+
# @overload transform(rotation)
|
62
|
+
# Transforms a normalized plane by a quaternion rotation.
|
63
|
+
#
|
64
|
+
# @param rotation [Quaternion] The rotation to apply.
|
65
|
+
#
|
66
|
+
# @return [Plane] A new plane that results from applying the rotation.
|
67
|
+
def transform(other)
|
68
|
+
end
|
69
|
+
|
70
|
+
##
|
71
|
+
# @note This plane must already be normalized, so that its normal vector is
|
72
|
+
# of unit length, before this method is called.
|
73
|
+
#
|
74
|
+
# Applies a transformation to the plane.
|
75
|
+
#
|
76
|
+
# @overload transform!(matrix)
|
77
|
+
#
|
78
|
+
# Transforms a normalized plane by a matrix.
|
79
|
+
#
|
80
|
+
# @param matrix [Matrix4x4] The transformation matrix.
|
81
|
+
#
|
82
|
+
# @overload transform!(rotation)
|
83
|
+
# Transforms a normalized plane by a quaternion rotation.
|
84
|
+
#
|
85
|
+
# @param rotation [Quaternion] The rotation to apply.
|
86
|
+
#
|
87
|
+
# @return [self]
|
88
|
+
def transform!(other)
|
89
|
+
end
|
90
|
+
|
91
|
+
##
|
92
|
+
# Calculates the dot product of a plane and {Vector4}.
|
93
|
+
#
|
94
|
+
# @param other [Vector4] The vector to compute.
|
95
|
+
#
|
96
|
+
# @return [Float] the dot product.
|
97
|
+
def dot(other)
|
98
|
+
end
|
99
|
+
|
100
|
+
##
|
101
|
+
# Returns the dot product of a specified {Vector3} and the normal vector of
|
102
|
+
# this Plane plus the distance value of the plane.
|
103
|
+
#
|
104
|
+
# @param other [Vector3] The vector to compute.
|
105
|
+
#
|
106
|
+
# @return [Float] the dot product.
|
107
|
+
def dot_coord(other)
|
108
|
+
end
|
109
|
+
|
110
|
+
##
|
111
|
+
# Returns the dot product of a specified Vector3 and the normal vector of
|
112
|
+
# this plane.
|
113
|
+
#
|
114
|
+
# @param other [Vector3] The vector to compute.
|
115
|
+
#
|
116
|
+
# @return [Float]
|
117
|
+
def dot_norm(other)
|
118
|
+
end
|
119
|
+
|
120
|
+
##
|
121
|
+
# Creates a new plane whose normal vector is the source plane's normal
|
122
|
+
# vector normalized.
|
123
|
+
#
|
124
|
+
# @return [Plane] newly created normalized plane.
|
125
|
+
def normalize
|
126
|
+
end
|
127
|
+
|
128
|
+
##
|
129
|
+
# Normalizes this plane's normal vector.
|
130
|
+
#
|
131
|
+
# @return [self]
|
132
|
+
def normalize!
|
133
|
+
end
|
134
|
+
|
135
|
+
##
|
136
|
+
# @return [String] a String representation of this instance.
|
137
|
+
def to_s
|
138
|
+
end
|
139
|
+
|
140
|
+
class << self
|
141
|
+
|
142
|
+
##
|
143
|
+
# Creates a Plane that contains the three given points.
|
144
|
+
#
|
145
|
+
# @param pnt1 [Vector3] The first point defining the plane.
|
146
|
+
# @param pnt2 [Vector3] The second point defining the plane.
|
147
|
+
# @param pnt3 [Vector3] The third point defining the plane.
|
148
|
+
#
|
149
|
+
# @return [Plane] the plane containing the three points.
|
150
|
+
def from_vertices(pnt1, pnt2, pnt3)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
@@ -0,0 +1,355 @@
|
|
1
|
+
module Numerix
|
2
|
+
|
3
|
+
##
|
4
|
+
# A structure encapsulating a four-dimensional vector (x,y,z,w), which is used
|
5
|
+
# to efficiently rotate an object about the (x,y,z) vector by the angle theta,
|
6
|
+
# where `w = cos(theta / 2)`.
|
7
|
+
class Quaternion < Structure
|
8
|
+
|
9
|
+
##
|
10
|
+
# @return [Float] the X-value of the quaternion component of the quaternion.
|
11
|
+
attr_accessor :x
|
12
|
+
|
13
|
+
##
|
14
|
+
# @return [Float] the Y-value of the quaternion component of the quaternion.
|
15
|
+
attr_accessor :y
|
16
|
+
|
17
|
+
##
|
18
|
+
# @return [Float] the Z-value of the quaternion component of the quaternion.
|
19
|
+
attr_accessor :z
|
20
|
+
|
21
|
+
##
|
22
|
+
# @return [Float] the rotation component of the quaternion.
|
23
|
+
attr_accessor :w
|
24
|
+
|
25
|
+
##
|
26
|
+
# @overload initialize
|
27
|
+
# Constructs a default quaternion with all components set to `0.0`.
|
28
|
+
#
|
29
|
+
# @overload initialize(x, y, z, w)
|
30
|
+
# Constructs a Quaternion from the given components.
|
31
|
+
#
|
32
|
+
# @param x [Float] The X component of the quaternion.
|
33
|
+
# @param y [Float] The Y component of the quaternion.
|
34
|
+
# @param z [Float] The Z component of the quaternion.
|
35
|
+
# @param w [Float] The W component of the quaternion.
|
36
|
+
#
|
37
|
+
# @overload initialize(vector, scalar)
|
38
|
+
# Constructs a Quaternion from the given vector and rotation parts.
|
39
|
+
#
|
40
|
+
# @param vector [Vector3] The vector part of the quaternion.
|
41
|
+
# @param scalar [Float] The rotation part of the quaternion.
|
42
|
+
#
|
43
|
+
def initialize(*args) # TODO
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# @return [Boolean] `true` if the quaternion is the identity quaternion,
|
48
|
+
# otherwise `false`.
|
49
|
+
def identity?
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# @return [Float] the length of the quaternion.
|
54
|
+
def length
|
55
|
+
end
|
56
|
+
|
57
|
+
alias_method :magnitude, :length
|
58
|
+
|
59
|
+
##
|
60
|
+
# @return [Float] the length of the quaternion squared.
|
61
|
+
def length_squared
|
62
|
+
end
|
63
|
+
|
64
|
+
##
|
65
|
+
# Returns a new quaternion with the same direction as the given quaternion,
|
66
|
+
# but with a length of `1.0`.
|
67
|
+
#
|
68
|
+
# @return [Quaternion] a normalized quaternion.
|
69
|
+
def normalize
|
70
|
+
end
|
71
|
+
|
72
|
+
##
|
73
|
+
# Alters this quaternion instance to maintain same direction, but adjust
|
74
|
+
# values so that quaternion has a length of `1.0`.
|
75
|
+
#
|
76
|
+
# @return [self]
|
77
|
+
def normalize!
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# Creates the conjugate of this quaternion.
|
82
|
+
#
|
83
|
+
# @return [Quaternion] the conjugate of the os instance.
|
84
|
+
#
|
85
|
+
# @see conjugate!
|
86
|
+
def conjugate
|
87
|
+
end
|
88
|
+
|
89
|
+
##
|
90
|
+
# Alters this instance to be its conjugate.
|
91
|
+
#
|
92
|
+
# @return [self]
|
93
|
+
#
|
94
|
+
# @see conjugate
|
95
|
+
def conjugate!
|
96
|
+
end
|
97
|
+
|
98
|
+
##
|
99
|
+
# @return [Quaternion] the inverse of this quaternion.
|
100
|
+
def inverse
|
101
|
+
end
|
102
|
+
|
103
|
+
##
|
104
|
+
# Calculates the dot product of two quaternions.
|
105
|
+
#
|
106
|
+
# @param other [Quaternion] The source quaternion to compute product from.
|
107
|
+
#
|
108
|
+
# @return [Float] the dot product of the quaternions.
|
109
|
+
def dot(other)
|
110
|
+
end
|
111
|
+
|
112
|
+
##
|
113
|
+
# Concatenates this quaternion and another, the result represents the this
|
114
|
+
# rotation followed by the given quaternion's rotation.
|
115
|
+
#
|
116
|
+
# @param other [Quaternion] The rotation to add in the series.
|
117
|
+
#
|
118
|
+
# @return [Quaternion] a new quaternion representing the concatenation this
|
119
|
+
# rotation followed by the other rotation.
|
120
|
+
#
|
121
|
+
# @see concatenate!
|
122
|
+
def concatenate(other)
|
123
|
+
end
|
124
|
+
|
125
|
+
##
|
126
|
+
# @note This function is identical to {#concatenate}, but alters the values
|
127
|
+
# of this instance without creating a new object.
|
128
|
+
#
|
129
|
+
# Concatenates this quaternion and another, the result represents the this
|
130
|
+
# rotation followed by the given quaternion's rotation.
|
131
|
+
#
|
132
|
+
# @param other [Quaternion] The rotation to add in the series.
|
133
|
+
#
|
134
|
+
# @return [self]
|
135
|
+
#
|
136
|
+
# @see concatenate
|
137
|
+
def concatenate!(other)
|
138
|
+
end
|
139
|
+
|
140
|
+
##
|
141
|
+
# Linearly interpolates between this quaternion and another based on the
|
142
|
+
# given weighting.
|
143
|
+
#
|
144
|
+
# @param quaternion [Quaternion] The source quaternion to interpolate
|
145
|
+
# between.
|
146
|
+
# @param amount [Float] Value between `0.0` and `1.0` indicating the weight
|
147
|
+
# of the given quaternion.
|
148
|
+
#
|
149
|
+
# @return [Quaternion] the interpolated quaternion.
|
150
|
+
#
|
151
|
+
# @see lerp!
|
152
|
+
def lerp(quaternion, amount)
|
153
|
+
end
|
154
|
+
|
155
|
+
##
|
156
|
+
# Linearly interpolates between this quaternion and another based on the given
|
157
|
+
# weighting, altering the values of this quaternion.
|
158
|
+
#
|
159
|
+
# @param quaternion [Quaternion] The source quaternion to interpolate between.
|
160
|
+
# @param amount [Float] Value between `0.0` and `1.0` indicating the weight
|
161
|
+
# of the given quaternion.
|
162
|
+
#
|
163
|
+
# @return [self]
|
164
|
+
#
|
165
|
+
# @see lerp
|
166
|
+
def lerp!(quaternion, amount)
|
167
|
+
end
|
168
|
+
|
169
|
+
##
|
170
|
+
# Interpolates between this quaternion and another using spherical linear
|
171
|
+
# interpolation.
|
172
|
+
#
|
173
|
+
# @param quaternion [Quaternion] The source quaternion to interpolate between.
|
174
|
+
# @param amount [Float] Value between `0.0` and `1.0` indicating the weight
|
175
|
+
# of the given quaternion.
|
176
|
+
#
|
177
|
+
# @return [Quaternion] the interpolated quaternion.
|
178
|
+
#
|
179
|
+
# @see slerp!
|
180
|
+
def slerp(quaternion, amount)
|
181
|
+
end
|
182
|
+
|
183
|
+
##
|
184
|
+
# @note This function is identical to {#slerp}, but alters the values of
|
185
|
+
# this instance without creating a new object.
|
186
|
+
#
|
187
|
+
# Interpolates between this quaternion and another using spherical linear
|
188
|
+
# interpolation.
|
189
|
+
#
|
190
|
+
# @param quaternion [Quaternion] The source quaternion to interpolate between.
|
191
|
+
# @param amount [Float] Value between `0.0` and `1.0` indicating the weight
|
192
|
+
# of the given quaternion.
|
193
|
+
#
|
194
|
+
# @return [self]
|
195
|
+
#
|
196
|
+
# @see slerp
|
197
|
+
def slerp!(quaternion, amount)
|
198
|
+
end
|
199
|
+
|
200
|
+
##
|
201
|
+
# @return [String] a String representation of this instance.
|
202
|
+
def to_s
|
203
|
+
end
|
204
|
+
|
205
|
+
##
|
206
|
+
# @return [Array<Float>] an Array representation of this instance.
|
207
|
+
def to_a
|
208
|
+
end
|
209
|
+
|
210
|
+
alias_method :elements, :to_a
|
211
|
+
|
212
|
+
##
|
213
|
+
# @return [Hash{Symbol => Float}] a Hash representation of this instance.
|
214
|
+
def to_h
|
215
|
+
end
|
216
|
+
|
217
|
+
##
|
218
|
+
# @return [Vector4] a {Vector4} representation of this instance.
|
219
|
+
def to_vec4
|
220
|
+
end
|
221
|
+
|
222
|
+
##
|
223
|
+
# Performs unary negation on this quaternion instance.
|
224
|
+
#
|
225
|
+
# @return [Quaternion] the vector with swapped +/- values.
|
226
|
+
def -@
|
227
|
+
end
|
228
|
+
|
229
|
+
##
|
230
|
+
# Adds this quaternion with another.
|
231
|
+
#
|
232
|
+
# @param other [Quaternion] The quaternion to add.
|
233
|
+
#
|
234
|
+
# @return [Quaternion] the sum of the quaternions.
|
235
|
+
def +(other)
|
236
|
+
end
|
237
|
+
|
238
|
+
# Gets the difference of this quaternion and another.
|
239
|
+
#
|
240
|
+
# @param other [Quaternion] The quaternion to subtract.
|
241
|
+
#
|
242
|
+
# @return [Quaternion] the difference of the quaternions.
|
243
|
+
def -(other)
|
244
|
+
end
|
245
|
+
|
246
|
+
##
|
247
|
+
# Quaternion multiplication.
|
248
|
+
#
|
249
|
+
# @overload *(scalar)
|
250
|
+
# Scalar quaternion multiplication.
|
251
|
+
#
|
252
|
+
# @param scalar [Float] The scalar value.
|
253
|
+
#
|
254
|
+
# @overload *(other)
|
255
|
+
# Multiplies this quaternion by another.
|
256
|
+
#
|
257
|
+
# @param other [Quaternion] The source quaternion to multiply.
|
258
|
+
#
|
259
|
+
# @return [Quaternion] the product quaternion.
|
260
|
+
def *(other)
|
261
|
+
end
|
262
|
+
|
263
|
+
##
|
264
|
+
# Quaternion division.
|
265
|
+
#
|
266
|
+
# @overload *(scalar)
|
267
|
+
# Scalar quaternion division.
|
268
|
+
#
|
269
|
+
# @param scalar [Float] The scalar value.
|
270
|
+
#
|
271
|
+
# @overload *(other)
|
272
|
+
# Divides this quaternion by another.
|
273
|
+
#
|
274
|
+
# @param other [Quaternion] The source quaternion to divide.
|
275
|
+
#
|
276
|
+
# @return [Quaternion] the resulting quaternion.
|
277
|
+
def /(other)
|
278
|
+
end
|
279
|
+
|
280
|
+
##
|
281
|
+
# Returns flag if this quaternion instance is equal to the given object.
|
282
|
+
#
|
283
|
+
# @param other [Object] The object to compare.
|
284
|
+
#
|
285
|
+
# @return [Boolean] `true` if objects are equal, otherwise `false`.
|
286
|
+
def ==(other)
|
287
|
+
end
|
288
|
+
|
289
|
+
class << self
|
290
|
+
|
291
|
+
##
|
292
|
+
# @return [Quaternion] a quaternion representing no rotation.
|
293
|
+
def identity
|
294
|
+
end
|
295
|
+
|
296
|
+
##
|
297
|
+
# Creates a quaternion from a vector and an angle to rotate about the
|
298
|
+
# vector.
|
299
|
+
#
|
300
|
+
# @param axis [Vector3] The vector to rotate around.
|
301
|
+
# @param angle [Float] The angle, in radians, to rotate around the vector.
|
302
|
+
#
|
303
|
+
# @return [Quaternion] the created quaternion.
|
304
|
+
def from_axis_angle(axis, angle)
|
305
|
+
end
|
306
|
+
|
307
|
+
##
|
308
|
+
# Creates a new quaternion from the given yaw, pitch, and roll, in
|
309
|
+
# radians.
|
310
|
+
#
|
311
|
+
# @param yaw [Float] The yaw angle, in radians, around the Y-axis.
|
312
|
+
# @param pitch [Float] The pitch angle, in radians, around the X-axis.
|
313
|
+
# @param roll [Float] The roll angle, in radians, around the Z-axis.
|
314
|
+
#
|
315
|
+
# @return [Quaternion] the created quaternion.
|
316
|
+
def from_yaw_pitch_roll(yaw, pitch, roll)
|
317
|
+
end
|
318
|
+
|
319
|
+
##
|
320
|
+
# Creates a quaternion from the given rotation matrix.
|
321
|
+
#
|
322
|
+
# @param matrix [Matrix4x4] The rotation matrix
|
323
|
+
#
|
324
|
+
# @return [Quaternion] the created quaternion.
|
325
|
+
def from_rotation_matrix(matrix)
|
326
|
+
end
|
327
|
+
|
328
|
+
##
|
329
|
+
# Interpolates between two quaternions, using spherical linear
|
330
|
+
# interpolation.
|
331
|
+
#
|
332
|
+
# @param quaternion1 [Quaternion] The first source quaternion.
|
333
|
+
# @param quaternion2 [Quaternion] The second source quaternion.
|
334
|
+
# @param amount [Float] Value between `0.0` and `1.0` indicating the
|
335
|
+
# weight of the second source quaternion.
|
336
|
+
#
|
337
|
+
# @return [Quaternion] the interpolated quaternion.
|
338
|
+
def slerp(quaternion1, quaternion2, amount)
|
339
|
+
end
|
340
|
+
|
341
|
+
##
|
342
|
+
# Linearly interpolates between two quaternions based on the given
|
343
|
+
# weighting.
|
344
|
+
#
|
345
|
+
# @param quaternion1 [Quaternion] The first source quaternion.
|
346
|
+
# @param quaternion2 [Quaternion] The second source quaternion.
|
347
|
+
# @param amount [Float] Value between `0.0` and `1.0` indicating the
|
348
|
+
# weight of the second source quaternion.
|
349
|
+
#
|
350
|
+
# @return [Quaternion] the interpolated quaternion.
|
351
|
+
def lerp(quaternion1, quaternion2, amount)
|
352
|
+
end
|
353
|
+
end
|
354
|
+
end
|
355
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
|
2
|
+
module Numerix
|
3
|
+
|
4
|
+
##
|
5
|
+
# @abstract Abstract class providing common functionality to the base classes.
|
6
|
+
#
|
7
|
+
# This class cannot be instantiated, it of only for providing a common base
|
8
|
+
# class for all Numerix types and provide common functionality.
|
9
|
+
class Structure
|
10
|
+
|
11
|
+
private_class_method :new
|
12
|
+
|
13
|
+
##
|
14
|
+
# @return [Object] an exact duplicate of the object.
|
15
|
+
def dup
|
16
|
+
end
|
17
|
+
|
18
|
+
##
|
19
|
+
# @return [Integer] the address of the internal C-struct in memory.
|
20
|
+
def address
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# Enumerates over the components of the structure.
|
25
|
+
#
|
26
|
+
# @overload each
|
27
|
+
# When called with a block, enumerates through each component of the
|
28
|
+
# structure, yielding each before returning self;
|
29
|
+
#
|
30
|
+
# @yield [component] Yields a component to the block.
|
31
|
+
# @yieldparam component [Float] The current component.
|
32
|
+
#
|
33
|
+
# @return [self]
|
34
|
+
#
|
35
|
+
# @overload each
|
36
|
+
#
|
37
|
+
# When called without a block, returned an Enumerator for the structure.
|
38
|
+
#
|
39
|
+
# @return [Enumerator] the enumerator for the structure.
|
40
|
+
def each
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Retrieves the component of the structure at the specified position.
|
45
|
+
#
|
46
|
+
# @param index [Integer] The position of the component to retrieve.
|
47
|
+
#
|
48
|
+
# @return [Float, nil] the value at the given position, or +nil+ if _index_
|
49
|
+
# is out of range.
|
50
|
+
#
|
51
|
+
# @see []=
|
52
|
+
def [](index)
|
53
|
+
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# Sets the component of the structure at the specified position.
|
57
|
+
#
|
58
|
+
# If _index_ is out of range, the method does nothing.
|
59
|
+
#
|
60
|
+
# @param index [Integer] The position of the component to set.
|
61
|
+
# @param value [Float] The value to set.
|
62
|
+
#
|
63
|
+
# @return [Float] the value
|
64
|
+
#
|
65
|
+
# @see []
|
66
|
+
def []=(index, value)
|
67
|
+
end
|
68
|
+
|
69
|
+
##
|
70
|
+
# Packs the structures memory into a binary string.
|
71
|
+
#
|
72
|
+
# This is the equivalent of taking its values into an array and calling
|
73
|
+
# `array.pack('f*')` on it, though considerably faster as the parser is
|
74
|
+
# bypassed and done directly in C by accessing the memory directly.
|
75
|
+
#
|
76
|
+
# @return [String] the packed binary string.
|
77
|
+
#
|
78
|
+
# @see pack
|
79
|
+
def pack
|
80
|
+
end
|
81
|
+
|
82
|
+
alias_method :_dump, :pack
|
83
|
+
|
84
|
+
if RUBY_VERSION >= '2.0'
|
85
|
+
|
86
|
+
require 'fiddle'
|
87
|
+
|
88
|
+
##
|
89
|
+
# @note This method only exists in Ruby 2.0 and higher, and will not be
|
90
|
+
# present in lower versions.
|
91
|
+
#
|
92
|
+
# @return [Fiddle::Pointer] a sized pointer to the structure in memory.
|
93
|
+
#
|
94
|
+
# @see address
|
95
|
+
def ptr
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
class << self
|
100
|
+
|
101
|
+
##
|
102
|
+
# @return [Integer] the size, in bytes, the structure contains in memory.
|
103
|
+
def size
|
104
|
+
end
|
105
|
+
|
106
|
+
##
|
107
|
+
# Unpacks a binary string of data into a structure.
|
108
|
+
#
|
109
|
+
# This is the equivalent of calling `binary.unpack('f*')` on the string
|
110
|
+
# and using the values to create a new structure, but much faster as it
|
111
|
+
# bypasses the parser and is done in C directly with a pointer in memory.
|
112
|
+
#
|
113
|
+
# @param binary [String] Binary string of data.
|
114
|
+
#
|
115
|
+
# @return [Object] the unpacked structure.
|
116
|
+
#
|
117
|
+
# @see pack
|
118
|
+
def unpack(binary)
|
119
|
+
end
|
120
|
+
|
121
|
+
alias_method :_load, :unpack
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
module Numerix
|
3
|
+
|
4
|
+
##
|
5
|
+
# Analog of Ruby's standard library `Vector` class implemented in `C`.
|
6
|
+
#
|
7
|
+
# @note This class is not fully implemented integrated into the "core"
|
8
|
+
# Numerix classes as of version `1.0.0`. This will likely change in future
|
9
|
+
# releases.
|
10
|
+
class Vector
|
11
|
+
# @todo Document
|
12
|
+
end
|
13
|
+
end
|