unit_quaternion 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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