unit_quaternion 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +2 -1
- data/lib/quaternion.rb +12 -5
- data/lib/unit_quaternion.rb +15 -0
- data/lib/unit_quaternion/version.rb +1 -1
- data/tests/tests_UnitQuaternion.rb +38 -0
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -1,2 +1,3 @@
|
|
1
1
|
Version 0.0.3: Initial release
|
2
|
-
Version 0.0.4: Improve documentation
|
2
|
+
Version 0.0.4: Improve documentation
|
3
|
+
Version 0.0.5: Fix a bug in UnitQuaternion multiplication, where multiplying a UnitQuaternion by a Quaternion used to return a UnitQuaternion, but now returns a Quaternion
|
data/lib/quaternion.rb
CHANGED
@@ -88,11 +88,8 @@ class Quaternion
|
|
88
88
|
if q.is_a?(Numeric)
|
89
89
|
return Quaternion.new(@beta0 * q, *(@beta_s * q))
|
90
90
|
elsif q.is_a?(Quaternion)
|
91
|
-
|
92
|
-
|
93
|
-
beta_s = @beta0 * q_beta_s + q_beta0 * @beta_s +
|
94
|
-
cross_product(@beta_s, q_beta_s)
|
95
|
-
result = self.class.new(beta0, *beta_s)
|
91
|
+
beta0, beta_s = quatMult(q)
|
92
|
+
result = Quaternion.new(beta0, *beta_s)
|
96
93
|
return result
|
97
94
|
end
|
98
95
|
end
|
@@ -124,4 +121,14 @@ class Quaternion
|
|
124
121
|
v1[0]*v2[1] - v1[1]*v2[0] ]
|
125
122
|
end
|
126
123
|
|
124
|
+
# Multiplies with another quaternion, and returns the resulting
|
125
|
+
# beta0 and beta_s values.
|
126
|
+
def quatMult(q)
|
127
|
+
q_beta0, q_beta_s = q.get()
|
128
|
+
beta0 = @beta0 * q_beta0 - @beta_s.inner_product(q_beta_s)
|
129
|
+
beta_s = @beta0 * q_beta_s + q_beta0 * @beta_s +
|
130
|
+
cross_product(@beta_s, q_beta_s)
|
131
|
+
return beta0, beta_s
|
132
|
+
end
|
133
|
+
|
127
134
|
end
|
data/lib/unit_quaternion.rb
CHANGED
@@ -275,6 +275,21 @@ class UnitQuaternion < Quaternion
|
|
275
275
|
return result
|
276
276
|
end
|
277
277
|
|
278
|
+
# Returns the result of multiplying the quaternin by a scalar or
|
279
|
+
# another quaternion. If the result has magnitude 1, this method
|
280
|
+
# will return a UnitQuaternion. Otherwise, it will return a
|
281
|
+
# quaternion.
|
282
|
+
def *(q)
|
283
|
+
if q.is_a?(Numeric) and q.abs() == 1
|
284
|
+
return UnitQuaternion.new(@beta0 * q, *(@beta_s * q))
|
285
|
+
elsif q.is_a?(UnitQuaternion)
|
286
|
+
beta0, beta_s = quatMult(q)
|
287
|
+
return UnitQuaternion.new(beta0, *beta_s)
|
288
|
+
else
|
289
|
+
return super(q)
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
278
293
|
private
|
279
294
|
def isRightHanded(axes)
|
280
295
|
if axes.length() != 3
|
@@ -213,6 +213,44 @@ class TestUnitQuaternion < Test::Unit::TestCase
|
|
213
213
|
0, 1e-14)
|
214
214
|
end
|
215
215
|
end
|
216
|
+
|
217
|
+
q = UnitQuaternion.new(1,2,3,4)
|
218
|
+
result = q * 1
|
219
|
+
assert(result.is_a?(UnitQuaternion))
|
220
|
+
assert_in_delta( (q - result).norm(), 0, 1e-15 )
|
221
|
+
|
222
|
+
result = q * -1
|
223
|
+
assert(result.is_a?(UnitQuaternion))
|
224
|
+
|
225
|
+
result = 1 * q
|
226
|
+
assert(result.is_a?(UnitQuaternion))
|
227
|
+
assert_in_delta( (q - result).norm(), 0, 1e-15 )
|
228
|
+
|
229
|
+
result = -1 * q
|
230
|
+
assert(result.is_a?(UnitQuaternion))
|
231
|
+
|
232
|
+
q2 = Quaternion.new(1,2,3,4)
|
233
|
+
result = q * q2
|
234
|
+
assert(result.is_a?(Quaternion))
|
235
|
+
assert(!result.is_a?(UnitQuaternion))
|
236
|
+
|
237
|
+
result = q2 * q
|
238
|
+
assert(result.is_a?(Quaternion))
|
239
|
+
assert(!result.is_a?(UnitQuaternion))
|
240
|
+
|
241
|
+
for i in 2..10
|
242
|
+
result = q * i
|
243
|
+
assert(result.is_a?(Quaternion))
|
244
|
+
assert(!result.is_a?(UnitQuaternion))
|
245
|
+
assert_in_delta(i * q.get()[0], result.get()[0], 1e-15)
|
246
|
+
assert_equal((i * q.get()[1] - result.get()[1]).norm(), 0, 1e-15)
|
247
|
+
|
248
|
+
result = i * q
|
249
|
+
assert(result.is_a?(Quaternion))
|
250
|
+
assert(!result.is_a?(UnitQuaternion))
|
251
|
+
assert_in_delta(i * q.get()[0], result.get()[0], 1e-15)
|
252
|
+
assert_equal((i * q.get()[1] - result.get()[1]).norm(), 0, 1e-15)
|
253
|
+
end
|
216
254
|
end
|
217
255
|
|
218
256
|
def test_transform
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unit_quaternion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-07-
|
12
|
+
date: 2016-07-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|