|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
Object reb:QH
class
Functions for Quaternion and Hypercomplex operations.
For quaternions, multiplication is not commutative and division is always defined.
For hypercomplex, multiplication is commutative and division is not always defined. The inverses which are not defined lieon two orthogonal 4D hyperplanes.
The hypercomplex code is based upon the complex number methods of Clyde Davenport using his complex/complex model.
H1 = [a1,a2]
where a1 and a2 are both complex numbers. This is the method used in Fractint. a1 and a2 are converted to two new complex numbers:
fa1 = a1 - conj(flip(a2))
fa2 = a1 + conj(flip(a2))
These new complex numbers (and correspondingly fb1 and fb2) can be used for ordinary complex math, including multiplication, division, trancendental functions, powers, etc. For example, sqrt:
fa1 = sqrt(fa1)
fa2 = sqrt(fa2)
A second conversion is done at the end of the operation(s):
c1 = 0.5*(fa1+fa2)
c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2)))
H2 = [c1, c2]
Class QH { import "common.ulb" ; Functions for Quaternion and Hypercomplex operations. <br> ; <p> ; For quaternions, multiplication is not commutative and division is always ; defined. ; <p> ; For hypercomplex, multiplication is commutative and division is not always ; defined. The inverses which are not defined lieon two orthogonal ; 4D hyperplanes. ; <p> ; The hypercomplex code is based upon the complex number methods of Clyde ; Davenport using his complex/complex model. ; <p> ; <a href="http://home.comcast.net/~cmdaven/bhyprcpx.htm">Davenport's Website</a><br> ; <p> ; H1 = [a1,a2] <br> ; <p> ; where a1 and a2 are both complex numbers. This is the method used in Fractint. ; a1 and a2 are converted to two new complex numbers: ; <p> ; fa1 = a1 - conj(flip(a2)) <br> ; fa2 = a1 + conj(flip(a2)) <br> ; <p> ; These new complex numbers (and correspondingly fb1 and fb2) can be used for ; ordinary complex math, including multiplication, division, trancendental ; functions, powers, etc. For example, sqrt: ; <p> ; fa1 = sqrt(fa1) <br> ; fa2 = sqrt(fa2) <br> ; <p> ; A second conversion is done at the end of the operation(s): ; <p> ; c1 = 0.5*(fa1+fa2)<br> ; c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2)))<br> ; <p> ; H2 = [c1, c2] <br> ; public: ; Quaternian multiplication static func Qmul(Vector a, Vector b, Vector c) ; Q1*Q2 = [r1*r2 - V1.V2, r2*V1 + r1*V2 + V1xV2] ; calc V . V float dot = a.m_y*b.m_y + a.m_z*b.m_z + a.m_w*b.m_w ; calc V x V c.m_y = a.m_z*b.m_w - b.m_z*a.m_w c.m_z = -(a.m_y*b.m_w - b.m_y*a.m_w) c.m_w = a.m_y*b.m_z - b.m_y*a.m_z c.m_x = a.m_x*b.m_x-dot c.m_y = c.m_y + a.m_x*b.m_y + b.m_x*a.m_y c.m_z = c.m_z + a.m_x*b.m_z + b.m_x*a.m_z c.m_w = c.m_w + a.m_x*b.m_w + b.m_x*a.m_w endfunc ; Quaternian division calculated as Q2*(1/Q1) static func Qdiv(Vector a, Vector b, Vector c) ; 1/Q = [r, -V]/(r*r + V.V) ; then calculate Q2*(1/Q1) as for QMul float denom = 1/(b.m_x*b.m_x + b.m_y*b.m_y + b.m_z*b.m_z + b.m_w*b.m_w) ; calc V . V float dot = -(a.m_y*b.m_y + a.m_z*b.m_z + a.m_w*b.m_w) ; calc V x V c.m_y = -a.m_z*b.m_w + b.m_z*a.m_w c.m_z = a.m_y*b.m_w - b.m_y*a.m_w c.m_w = -a.m_y*b.m_z + b.m_y*a.m_z c.m_x = (a.m_x*b.m_x-dot)*denom c.m_y = (c.m_y - a.m_x*b.m_y + b.m_x*a.m_y)*denom c.m_z = (c.m_z - a.m_x*b.m_z + b.m_x*a.m_z)*denom c.m_w = (c.m_w - a.m_x*b.m_w + b.m_x*a.m_w)*denom endfunc ; Quaternian division calculated as 1/Q1)*Q2 static func Qdiv2(Vector a, Vector b, Vector c) ; 1/Q = [r, -V]/(r*r + V.V) ; then calculate (1/Q1)*Q2 as for QMul float denom = 1/(b.m_x*b.m_x + b.m_y*b.m_y + b.m_z*b.m_z + b.m_w*b.m_w) ; calc V . V float dot = -(a.m_y*b.m_y + a.m_z*b.m_z + a.m_w*b.m_w) ; calc V x V c.m_y = -b.m_z*a.m_w + a.m_z*b.m_w c.m_z = b.m_y*a.m_w - a.m_y*b.m_w c.m_w = -b.m_y*a.m_z + a.m_y*b.m_z c.m_x = (a.m_x*b.m_x-dot)*denom c.m_y = (c.m_y + b.m_x*a.m_y - a.m_x*b.m_y)*denom c.m_z = (c.m_z + b.m_x*a.m_z - a.m_x*b.m_z)*denom c.m_w = (c.m_w + b.m_x*a.m_w - a.m_x*b.m_w)*denom endfunc ; Quaternian square static func Qsqr(Vector a, Vector b) ; Q*Q = [r*r-V.V, 2*r*V] ; calc V . V float dot = a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w if dot == 0 dot = 1e-100 endif b.m_x = a.m_x*a.m_x-dot b.m_y = 2*a.m_x*a.m_y b.m_z = 2*a.m_x*a.m_z b.m_w = 2*a.m_x*a.m_w endfunc ; Quaternian square root static func Qsqrt(Vector a, Vector b) ; derived from the inverse of the equations for Qsqr float sdot = a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w if sdot == 0 sdot = 1e-100 endif b.m_x = sqrt((a.m_x + sqrt(a.m_x^2 + sdot))/2) float factor = 1/(2*b.m_x) b.m_y = a.m_y*factor b.m_z = a.m_z*factor b.m_w = a.m_w*factor endfunc ; Quaternian reciprocal or inverse static func Qrecip(Vector a, Vector b) ; 1/Q = [r, -V]/(r*r + V.V) float denom = 1/(a.m_x*a.m_x + a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) b.m_x = a.m_x*denom b.m_y = -a.m_y*denom b.m_z = -a.m_z*denom b.m_w = -a.m_w*denom endfunc ; Quaternian natural log static func Qlog(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = log(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian exponential static func Qexp(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = exp(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian power calculated as exp(ln(Q1)*Q2) static func Qpower(Vector a, Vector b, Vector c) ; Q1^Q2 = exp(ln(Q1)*Q2) ; Find the log of Q1 float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = log(z) float at = imag(z)/norm float x1 = real(z) float y1 = at*a.m_y float z1 = at*a.m_z float w1 = at*a.m_w ; Multiply log by Q2 float dot = y1*b.m_y + z1*b.m_z + w1*b.m_w ; calc V x V float y2 = z1*b.m_w - b.m_z*w1 float z2 = -(y1*b.m_w - b.m_y*w1) float w2 = y1*b.m_z - b.m_y*z1 float x2 = x1*b.m_x-dot y2 = y2 + x1*b.m_y + b.m_x*y1 z2 = z2 + x1*b.m_z + b.m_x*z1 w2 = w2 + x1*b.m_w + b.m_x*w1 ; Take the exponential norm = sqrt(y2*y2 + z2*z2 + w2*w2) if norm == 0 norm = 1e-100 endif z = x2 + flip(norm) z = exp(z) at = imag(z)/norm c.m_x = real(z) c.m_y = at*y2 c.m_z = at*z2 c.m_w = at*w2 endfunc ; Quaternian power calculated as exp(Q2*ln(Q1)) static func Qpower2(Vector a, Vector b, Vector c) ; Q1^Q2 = exp(Q2*ln(Q1)) ; Find the log of Q1 float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = log(z) float at = imag(z)/norm float x1 = real(z) float y1 = at*a.m_y float z1 = at*a.m_z float w1 = at*a.m_w ; Multiply log by Q2 float dot = y1*b.m_y + z1*b.m_z + w1*b.m_w ; calc V x V float y2 = -z1*b.m_w + b.m_z*w1 float z2 = (y1*b.m_w - b.m_y*w1) float w2 = -y1*b.m_z + b.m_y*z1 float x2 = x1*b.m_x-dot y2 = y2 + x1*b.m_y + b.m_x*y1 z2 = z2 + x1*b.m_z + b.m_x*z1 w2 = w2 + x1*b.m_w + b.m_x*w1 ; Take the exponential norm = sqrt(y2*y2 + z2*z2 + w2*w2) if norm == 0 norm = 1e-100 endif z = x2 + flip(norm) z = exp(z) at = imag(z)/norm c.m_x = real(z) c.m_y = at*y2 c.m_z = at*z2 c.m_w = at*w2 endfunc ; Quaternian sine static func Qsin(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = sin(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian arcsine static func Qasin(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = asin(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian cosine static func Qcos(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = cos(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian arccosine static func Qacos(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = acos(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian tangent static func Qtan(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = tan(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian hyperbolic tangent static func Qtanh(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = tanh(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian hyperbolic arctangent static func Qatanh(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = atanh(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian arctangent static func Qatan(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = atan(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian conjugate static func Qconj(Vector a, Vector b) ; conj(Q) = [r,-V] b.m_x = a.m_x b.m_y = -a.m_y b.m_z = -a.m_z b.m_w = -a.m_w endfunc ; Quaternian hyperbolic sine static func Qsinh(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = sinh(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian hyperbolic cosine static func Qcosh(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = cosh(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian hyperbolic arcsine static func Qasinh(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = asinh(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian hyperbolic arccosine static func Qacosh(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = acosh(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian cotangent static func Qcotan(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = cotan(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Quaternian hyperbolic cotangent static func Qcotanh(Vector a, Vector b) float norm = sqrt(a.m_y*a.m_y + a.m_z*a.m_z + a.m_w*a.m_w) if norm == 0 norm = 1e-100 endif complex z = a.m_x + flip(norm) z = cotanh(z) float at = imag(z)/norm b.m_x = real(z) b.m_y = at*a.m_y b.m_z = at*a.m_z b.m_w = at*a.m_w endfunc ; Hypercomplex multiplication static func Hmul(Vector a, Vector b, Vector c) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex b1 = b.m_x + flip(b.m_y) complex b2 = b.m_z + flip(b.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) complex fb1 = b1 - conj(flip(b2)) complex fb2 = b1 + conj(flip(b2)) fa1 = fa1*fb1 fa2 = fa2*fb2 c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) c.m_x = real(c1) c.m_y = imag(c1) c.m_z = real(c2) c.m_w = imag(c2) endfunc ; Hypercomplex division static func Hdiv(Vector a, Vector b, Vector c) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex b1 = b.m_x + flip(b.m_y) complex b2 = b.m_z + flip(b.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) complex fb1 = b1 - conj(flip(b2)) complex fb2 = b1 + conj(flip(b2)) fa1 = fa1/fb1 fa2 = fa2/fb2 c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) c.m_x = real(c1) c.m_y = imag(c1) c.m_z = real(c2) c.m_w = imag(c2) endfunc ; Hypercomplex square static func Hsqr(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = fa1*fa1 fa2 = fa2*fa2 c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex square root static func Hsqrt(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = sqrt(fa1) fa2 = sqrt(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex reciprocal or inverse static func Hrecip(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = 1/fa1 fa2 = 1/fa2 c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex natural log static func Hlog(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = log(fa1) fa2 = log(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex exponential static func Hexp(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = exp(fa1) fa2 = exp(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex power static func Hpower(Vector a, Vector b, Vector c) ; Q1^Q2 = exp(ln(Q1)*Q2) ; ; Find the log of Q1 complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex b1 = b.m_x + flip(b.m_y) complex b2 = b.m_z + flip(b.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) complex fb1 = b1 - conj(flip(b2)) complex fb2 = b1 + conj(flip(b2)) fa1 = log(fa1) fa2 = log(fa2) ; ; Multiply log by Q2 fa1 = fa1*fb1 fa2 = fa2*fb2 ; ; Take exponential fa1 = exp(fa1) fa2 = exp(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) c.m_x = real(c1) c.m_y = imag(c1) c.m_z = real(c2) c.m_w = imag(c2) endfunc static func Hsin(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = sin(fa1) fa2 = sin(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex cosine static func Hcos(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = cos(fa1) fa2 = cos(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex hyperbolic sine static func Hsinh(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = sinh(fa1) fa2 = sinh(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex hyperbolic cosine static func Hcosh(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = cosh(fa1) fa2 = cosh(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex conjugate static func Hconj(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = conj(fa1) fa2 = conj(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex tangent static func Htan(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = tan(fa1) fa2 = tan(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex arcsine static func Hasin(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = asin(fa1) fa2 = asin(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex arccosine static func Hacos(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = acos(fa1) fa2 = acos(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex arctangent static func Hatan(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = atan(fa1) fa2 = atan(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex hyperbolic tangent static func Htanh(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = tanh(fa1) fa2 = tanh(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex hyperbolic arcsine static func Hasinh(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = asinh(fa1) fa2 = asinh(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex hyperbolic arccosine static func Hacosh(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = acosh(fa1) fa2 = acosh(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex hyperbolic arctangent static func Hatanh(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = atanh(fa1) fa2 = atanh(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex cotangent static func Hcotan(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = cotan(fa1) fa2 = cotan(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc ; Hypercomplex hyperbolic cotangent static func Hcotanh(Vector a, Vector b) complex a1 = a.m_x + flip(a.m_y) complex a2 = a.m_z + flip(a.m_w) complex fa1 = a1 - conj(flip(a2)) complex fa2 = a1 + conj(flip(a2)) fa1 = cotanh(fa1) fa2 = cotanh(fa2) c1 = 0.5*(fa1+fa2) c2 = 0.5*(conj(flip(fa1)) - conj(flip(fa2))) b.m_x = real(c1) b.m_y = imag(c1) b.m_z = real(c2) b.m_w = imag(c2) endfunc default: title = "Quat Hyper Methods" int param v_quathyper caption = "Version (Quat Hyper Methods)" default = 100 hint = "This version parameter is used to detect when a change has been made to the formula that is incompatible with the previous version. When that happens, this field will reflect the old version number to alert you to the fact that an alternate rendering is being used." visible = @v_quathyper < 100 endparam }
Constructor Summary | |
---|---|
QH()
|
Method Summary | |
---|---|
static void |
Hacos(Vector a,
Vector b)
Hypercomplex arccosine |
static void |
Hacosh(Vector a,
Vector b)
Hypercomplex hyperbolic arccosine |
static void |
Hasin(Vector a,
Vector b)
Hypercomplex arcsine |
static void |
Hasinh(Vector a,
Vector b)
Hypercomplex hyperbolic arcsine |
static void |
Hatan(Vector a,
Vector b)
Hypercomplex arctangent |
static void |
Hatanh(Vector a,
Vector b)
Hypercomplex hyperbolic arctangent |
static void |
Hconj(Vector a,
Vector b)
Hypercomplex conjugate |
static void |
Hcos(Vector a,
Vector b)
Hypercomplex cosine |
static void |
Hcosh(Vector a,
Vector b)
Hypercomplex hyperbolic cosine |
static void |
Hcotan(Vector a,
Vector b)
Hypercomplex cotangent |
static void |
Hcotanh(Vector a,
Vector b)
Hypercomplex hyperbolic cotangent |
static void |
Hdiv(Vector a,
Vector b,
Vector c)
Hypercomplex division |
static void |
Hexp(Vector a,
Vector b)
Hypercomplex exponential |
static void |
Hlog(Vector a,
Vector b)
Hypercomplex natural log |
static void |
Hmul(Vector a,
Vector b,
Vector c)
Hypercomplex multiplication |
static void |
Hpower(Vector a,
Vector b,
Vector c)
Hypercomplex power |
static void |
Hrecip(Vector a,
Vector b)
Hypercomplex reciprocal or inverse |
static void |
Hsin(Vector a,
Vector b)
|
static void |
Hsinh(Vector a,
Vector b)
Hypercomplex hyperbolic sine |
static void |
Hsqr(Vector a,
Vector b)
Hypercomplex square |
static void |
Hsqrt(Vector a,
Vector b)
Hypercomplex square root |
static void |
Htan(Vector a,
Vector b)
Hypercomplex tangent |
static void |
Htanh(Vector a,
Vector b)
Hypercomplex hyperbolic tangent |
static void |
Qacos(Vector a,
Vector b)
Quaternian arccosine |
static void |
Qacosh(Vector a,
Vector b)
Quaternian hyperbolic arccosine |
static void |
Qasin(Vector a,
Vector b)
Quaternian arcsine |
static void |
Qasinh(Vector a,
Vector b)
Quaternian hyperbolic arcsine |
static void |
Qatan(Vector a,
Vector b)
Quaternian arctangent |
static void |
Qatanh(Vector a,
Vector b)
Quaternian hyperbolic arctangent |
static void |
Qconj(Vector a,
Vector b)
Quaternian conjugate |
static void |
Qcos(Vector a,
Vector b)
Quaternian cosine |
static void |
Qcosh(Vector a,
Vector b)
Quaternian hyperbolic cosine |
static void |
Qcotan(Vector a,
Vector b)
Quaternian cotangent |
static void |
Qcotanh(Vector a,
Vector b)
Quaternian hyperbolic cotangent |
static void |
Qdiv(Vector a,
Vector b,
Vector c)
Quaternian division calculated as Q2*(1/Q1) |
static void |
Qdiv2(Vector a,
Vector b,
Vector c)
Quaternian division calculated as 1/Q1)*Q2 |
static void |
Qexp(Vector a,
Vector b)
Quaternian exponential |
static void |
Qlog(Vector a,
Vector b)
Quaternian natural log |
static void |
Qmul(Vector a,
Vector b,
Vector c)
Quaternian multiplication |
static void |
Qpower(Vector a,
Vector b,
Vector c)
Quaternian power calculated as exp(ln(Q1)*Q2) |
static void |
Qpower2(Vector a,
Vector b,
Vector c)
Quaternian power calculated as exp(Q2*ln(Q1)) |
static void |
Qrecip(Vector a,
Vector b)
Quaternian reciprocal or inverse |
static void |
Qsin(Vector a,
Vector b)
Quaternian sine |
static void |
Qsinh(Vector a,
Vector b)
Quaternian hyperbolic sine |
static void |
Qsqr(Vector a,
Vector b)
Quaternian square |
static void |
Qsqrt(Vector a,
Vector b)
Quaternian square root |
static void |
Qtan(Vector a,
Vector b)
Quaternian tangent |
static void |
Qtanh(Vector a,
Vector b)
Quaternian hyperbolic tangent |
Methods inherited from class Object |
---|
|
Constructor Detail |
---|
public QH()
Method Detail |
---|
public static void Qmul(Vector a, Vector b, Vector c)
public static void Qdiv(Vector a, Vector b, Vector c)
public static void Qdiv2(Vector a, Vector b, Vector c)
public static void Qsqr(Vector a, Vector b)
public static void Qsqrt(Vector a, Vector b)
public static void Qrecip(Vector a, Vector b)
public static void Qlog(Vector a, Vector b)
public static void Qexp(Vector a, Vector b)
public static void Qpower(Vector a, Vector b, Vector c)
public static void Qpower2(Vector a, Vector b, Vector c)
public static void Qsin(Vector a, Vector b)
public static void Qasin(Vector a, Vector b)
public static void Qcos(Vector a, Vector b)
public static void Qacos(Vector a, Vector b)
public static void Qtan(Vector a, Vector b)
public static void Qtanh(Vector a, Vector b)
public static void Qatanh(Vector a, Vector b)
public static void Qatan(Vector a, Vector b)
public static void Qconj(Vector a, Vector b)
public static void Qsinh(Vector a, Vector b)
public static void Qcosh(Vector a, Vector b)
public static void Qasinh(Vector a, Vector b)
public static void Qacosh(Vector a, Vector b)
public static void Qcotan(Vector a, Vector b)
public static void Qcotanh(Vector a, Vector b)
public static void Hmul(Vector a, Vector b, Vector c)
public static void Hdiv(Vector a, Vector b, Vector c)
public static void Hsqr(Vector a, Vector b)
public static void Hsqrt(Vector a, Vector b)
public static void Hrecip(Vector a, Vector b)
public static void Hlog(Vector a, Vector b)
public static void Hexp(Vector a, Vector b)
public static void Hpower(Vector a, Vector b, Vector c)
public static void Hsin(Vector a, Vector b)
public static void Hcos(Vector a, Vector b)
public static void Hsinh(Vector a, Vector b)
public static void Hcosh(Vector a, Vector b)
public static void Hconj(Vector a, Vector b)
public static void Htan(Vector a, Vector b)
public static void Hasin(Vector a, Vector b)
public static void Hacos(Vector a, Vector b)
public static void Hatan(Vector a, Vector b)
public static void Htanh(Vector a, Vector b)
public static void Hasinh(Vector a, Vector b)
public static void Hacosh(Vector a, Vector b)
public static void Hatanh(Vector a, Vector b)
public static void Hcotan(Vector a, Vector b)
public static void Hcotanh(Vector a, Vector b)
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |