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 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
- q_beta0, q_beta_s = q.get()
92
- beta0 = @beta0 * q_beta0 - @beta_s.inner_product(q_beta_s)
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
@@ -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
@@ -1,3 +1,3 @@
1
1
  class UnitQuaternion
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -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
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-03 00:00:00.000000000 Z
12
+ date: 2016-07-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler