home *** CD-ROM | disk | FTP | other *** search
/ Fractal Creations (Second Edition) / FRACTALS_2E.iso / frasrc.exe / HCMPLX.C < prev    next >
C/C++ Source or Header  |  1993-02-18  |  3KB  |  98 lines

  1. /* some hyper complex functions */
  2. #include "fractint.h"
  3. #include "mpmath.h"
  4.  
  5. void HComplexMult(_HCMPLX *arg1, _HCMPLX *arg2, _HCMPLX *out)
  6. {
  7.     /* it is possible to reoganize this code and reduce the multiplies
  8.         from 16 to 10, but on my 486 it is SLOWER !!! so I left it
  9.         like this - Tim Wegner */
  10.     out->x = arg1->x * arg2->x - arg1->y * arg2->y 
  11.            - arg1->z * arg2->z + arg1->t * arg2->t;
  12.     out->y = arg1->y * arg2->x + arg1->x * arg2->y 
  13.            - arg1->t * arg2->z - arg1->z * arg2->t;
  14.     out->z = arg1->z * arg2->x - arg1->t * arg2->y 
  15.            + arg1->x * arg2->z - arg1->y * arg2->t;
  16.     out->t = arg1->t * arg2->x + arg1->z * arg2->y 
  17.            + arg1->y * arg2->z + arg1->x * arg2->t;
  18. }
  19.  
  20. void HComplexSqr(_HCMPLX *arg, _HCMPLX *out)
  21. {
  22.     out->x = arg->x * arg->x - arg->y * arg->y 
  23.            - arg->z * arg->z + arg->t * arg->t;
  24.     out->y = 2 * arg->x * arg->y - 2 * arg->z * arg->t;
  25.     out->z = 2 * arg->z * arg->x - 2 * arg->t * arg->y; 
  26.     out->t = 2 * arg->t * arg->x + 2 * arg->z * arg->y;
  27. }
  28.  
  29. int HComplexInv(_HCMPLX *arg, _HCMPLX *out)
  30. {
  31.    double det, mod, xt_minus_yz;
  32.    
  33.    det = (sqr(arg->x - arg->t) + sqr(arg->y + arg->z))* 
  34.            (sqr(arg->x + arg->t) + sqr(arg->y - arg->z));
  35.  
  36.    if(det == 0.0)
  37.       return(-1);
  38.    mod = sqr(arg->x) + sqr(arg->y) + sqr(arg->z) + sqr(arg->t);
  39.    xt_minus_yz = arg->x * arg->t - arg->y * arg->z;
  40.  
  41.    out->x = ( arg->x * mod - 2 * arg->t * xt_minus_yz)/det;
  42.    out->y = (-arg->y * mod - 2 * arg->z * xt_minus_yz)/det;
  43.    out->z = (-arg->z * mod - 2 * arg->y * xt_minus_yz)/det;
  44.    out->t = ( arg->t * mod - 2 * arg->x * xt_minus_yz)/det;
  45.    return(0);
  46. }
  47.  
  48. void HComplexAdd(_HCMPLX *arg1, _HCMPLX *arg2, _HCMPLX *out)
  49. {
  50.     out->x = arg1->x + arg2->x;
  51.     out->y = arg1->y + arg2->y;
  52.     out->z = arg1->z + arg2->z;
  53.     out->t = arg1->t + arg2->t;
  54. }
  55.  
  56. void HComplexSub(_HCMPLX *arg1, _HCMPLX *arg2, _HCMPLX *out)
  57. {
  58.     out->x = arg1->x - arg2->x;
  59.     out->y = arg1->y - arg2->y;
  60.     out->z = arg1->z - arg2->z;
  61.     out->t = arg1->t - arg2->t;
  62. }
  63.  
  64. void HComplexMinus(_HCMPLX *arg1, _HCMPLX *out)
  65. {
  66.     out->x = -arg1->x;
  67.     out->y = -arg1->y;
  68.     out->z = -arg1->z;
  69.     out->t = -arg1->t;
  70. }
  71.  
  72. /* extends the unary function f to *h1 */
  73. void HComplexTrig0(_HCMPLX *h, _HCMPLX *out)
  74. {
  75.     /* This is the whole beauty of Hypercomplex numbers - *ANY* unary 
  76.        complex valued function of a complex variable can easily 
  77.        be generalized to hypercomplex numbers */
  78.     
  79.     _CMPLX a,b, resulta,resultb;
  80.     double t,s;
  81.     
  82.     /* convert to duplex form */
  83.     a.x = h->x - h->t;    
  84.     a.y = h->y + h->z;    
  85.     b.x = h->x + h->t;    
  86.     b.y = h->y - h->z;    
  87.  
  88.     /* apply function to each part */
  89.     CMPLXtrig0(a,resulta);
  90.     CMPLXtrig0(b,resultb);
  91.     
  92.     /* convert back */    
  93.     out->x =  (resulta.x + resultb.x)/2;
  94.     out->y =  (resulta.y + resultb.y)/2;
  95.     out->z =  (resulta.y - resultb.y)/2;
  96.     out->t =  (resultb.x - resulta.x)/2;
  97. }
  98.