home *** CD-ROM | disk | FTP | other *** search
- " ------------------------------------------------------------- "
- " Quaternion.st - Implementation of Quaternions class for "
- " AmigaTalk. "
- " ------------------------------------------------------------- "
-
- Class Quaternion :Magnitude
- ! s i j k !
- [
- new
- s <- Float new: 0.0.
- i <- Float new: 0.0.
- j <- Float new: 0.0.
- k <- Float new: 0.0
- |
- tensor
- ^s
- |
- ipart
- ^i
- |
- jpart
- ^j
- |
- kpart
- ^k
- |
- tensor: newReal
- s <- newReal
- |
- ipart: newI
- i <- newI
- |
- jpart: newJ
- j <- newJ
- |
- kpart: newK
- k <- newK
- |
- versor: ni p2: nj p3: nk
- i <- ni.
- j <- nj.
- k <- nk
- |
- coerce: aNumber ! newQuaternion !
- newQuaternion <- Quaternion new.
-
- newQuaternion tensor: aNumber.
- newQuaternion ipart: 0.0.
- newQuaternion jpart: 0.0.
- newQuaternion kpart: 0.0.
-
- ^ newQuaternion
- |
- conjugate
- i <- -1.0 * i.
- j <- -1.0 * j.
- k <- -1.0 * k.
- ^ self
- |
- ~
- ^ conjugate self
- |
- norm
- ^ ((s * s) + (i * i) + (j * j) + (k * k))
- |
- inverse
- ((self norm) = 0.0)
- ifTrue: [ <primitive 123 'Quaternion error: Division by zero!'>.
- ^ nil
- ].
-
- ^ ((self conjugate) / (self norm))
- |
- + aNumber ! nc !
-
- (aNumber isKindOf: (self class))
- ifFalse: [ nc <- self coerce: aNumber ]
- ifTrue: [ nc <- aNumber ].
-
- s <- nc spart + self spart.
- i <- nc ipart + self ipart.
- j <- nc jpart + self jpart.
- k <- nc kpart + self kpart.
-
- ^ self
- |
- - aNumber ! nc !
-
- (aNumber isKindOf: (self class))
- ifFalse: [ nc <- self coerce: aNumber ]
- ifTrue: [ nc <- aNumber ].
-
- s <- self spart - nc spart.
- i <- self ipart - nc ipart.
- j <- self jpart - nc jpart.
- k <- self kpart - nc kpart.
-
- ^ self
- |
- * aNumber ! nc !
-
- (aNumber isKindOf: (self class))
- ifFalse: [ nc <- self coerce: aNumber ]
- ifTrue: [ nc <- aNumber ].
-
- s <- (s * nc spart) - (i * nc ipart) - (j * nc jpart) - (k * nc kpart).
- i <- (i * nc spart) + (s * nc ipart) + (k * nc jpart) - (j * nc kpart).
- j <- (j * nc spart) - (k * nc ipart) + (s * nc jpart) + (i * nc kpart).
- k <- (k * nc spart) + (j * nc ipart) - (i * nc jpart) + (s * nc kpart).
-
- ^ self
- |
- / aNumber ! nc denom r i !
-
- (aNumber isKindOf: (self class))
- ifFalse: [ nc <- self coerce: aNumber ]
- ifTrue: [ nc <- aNumber ].
-
- ((nc spart == 0.0) & (nc ipart == 0.0))
- ifTrue: [ <primitive 123 'Quaternion error: Division by zero!'>.
- ^ nil
- ].
-
- self * (nc inverse).
-
- ^ self
- |
- printString
- ('{', <primitive 78 s>, ', ', <primitive 78 i>, ', ', <primitive 78 j>, ', ', <primitive 78 k>, '}') print.
- ^ self
- |
- == aNumber ! nc !
-
- (aNumber isKindOf: (self class))
- ifFalse: [ nc <- self coerce: aNumber ]
- ifTrue: [ nc <- aNumber ].
-
- ((s = nc spart) & (i = nc ipart) & (j = nc jpart) & (k = nc kpart))
- ifTrue: [ ^ true ]
- ifFalse: [ ^ false ]
- |
- < aNumber ! nc !
-
- (aNumber isKindOf: (self class))
- ifFalse: [ nc <- self coerce: aNumber ]
- ifTrue: [ nc <- aNumber ].
-
- self computeMag.
- nc computeMag.
-
- ((s < nc spart) & (i < nc ipart) & (j < nc jpart) & (k < nc kpart))
- ifTrue: [ ^ true ]
- ifFalse: [ ^ false ]
- |
- > aNumber ! nc !
-
- (aNumber isKindOf: (self class))
- ifFalse: [ nc <- self coerce: aNumber ]
- ifTrue: [ nc <- aNumber ].
-
- ((s > nc spart) & (i > nc ipart) & (j > nc jpart) & (k > nc kpart))
- ifTrue: [ ^ true ]
- ifFalse: [ ^ false ]
- |
- <= aNumber ! nc !
-
- (aNumber isKindOf: (self class))
- ifFalse: [ nc <- self coerce: aNumber ]
- ifTrue: [ nc <- aNumber ].
-
- ((s <= nc spart) & (i <= nc ipart) & (j <= nc jpart) & (k <= nc kpart))
- ifTrue: [ ^ true ]
- ifFalse: [ ^ false ]
- |
- >= aNumber ! nc !
-
- (aNumber isKindOf: (self class))
- ifFalse: [ nc <- self coerce: aNumber ]
- ifTrue: [ nc <- aNumber ].
-
- ((s >= nc spart) & (i >= nc ipart) & (j >= nc jpart) & (k >= nc kpart))
- ifTrue: [ ^ true ]
- ifFalse: [ ^ false ]
- |
- ~= aNumber ! nc !
-
- (aNumber isKindOf: (self class))
- ifFalse: [ nc <- self coerce: aNumber ]
- ifTrue: [ nc <- aNumber ].
-
- ((s ~= nc spart) ! (i ~= nc ipart) ! (j ~= nc jpart) ! (k ~= nc kpart))
- ifTrue: [ ^ true ]
- ifFalse: [ ^ false ]
- ]
-