home *** CD-ROM | disk | FTP | other *** search
/ vsiftp.vmssoftware.com / VSIPUBLIC@vsiftp.vmssoftware.com.tar / FREEWARE / FREEWARE40.ZIP / xjig / mat2.c < prev    next >
C/C++ Source or Header  |  1996-07-09  |  2KB  |  91 lines

  1.  
  2. #ifndef _global_h
  3. #    include "global.h"
  4. #endif
  5. #ifndef _mat2_h
  6. #    include "mat2.h"
  7. #endif
  8.  
  9.  
  10. const Mat2 &Mat2::operator*=(const Mat2 &m)
  11. {
  12.    Real h11=r11;
  13.    Real h12=r12;
  14.    Real h21=r21;
  15.    Real h22=r22;
  16.    r11 = h11*m.r11 + h12*m.r21;
  17.    r21 = h21*m.r11 + h22*m.r21;
  18.    r12 = h11*m.r12 + h12*m.r22;
  19.    r22 = h21*m.r12 + h22*m.r22;
  20.    tx += h11*m.tx  + h12*m.ty;
  21.    ty += h21*m.tx  + h22*m.ty;
  22.    return *this;
  23. }
  24.  
  25. void Mat2::Invert(Mat2 *m) const
  26. {
  27.    Real detA = r11*r22-r12*r21;
  28.  
  29.    m->r11 =  r22/detA;
  30.    m->r12 = -r12/detA;
  31.    m->r21 = -r21/detA;
  32.    m->r22 =  r11/detA;
  33.    m->tx  = -m->r11*tx -m->r12*ty;
  34.    m->ty  = -m->r21*tx -m->r22*ty;
  35. }
  36.  
  37. void Mat2::Split(Real *sh_p, Real *sx_p, Real *sy_p, Real *angle_p, Real *tx_p, Real *ty_p) const
  38. {
  39.    Real cosa;        // Rotation
  40.  
  41.     if (r21) {
  42.        Real r1121 = r11/r21;
  43.             cosa = r1121 / sqrt(1+r1121*r1121);
  44.             *angle_p = acos(cosa);
  45.             *sx_p = r11/cosa;
  46.  
  47.             *sy_p = (r11*r22/r21-r12)/(sin(*angle_p/180*M_PI)+r11*cosa/r21);
  48.             *sh_p  = (r22-cosa**sy_p)/r21;
  49.     }
  50.     else {
  51.         if (r11) {
  52.             *sx_p        = r11;
  53.             *angle_p = 0.0;
  54.             cosa    = 1.0;
  55.             *sh_p   = r12/r11;
  56.             *sy_p        = r22;
  57.         }
  58.         else {
  59.             *sx_p = 0;
  60.             *sh_p  = 0;    // sowieso egal
  61.  
  62.             Real r2212 = r22/r12;
  63.             cosa = -r2212 / sqrt(1+r2212*r2212);
  64.             *angle_p = acos(cosa);
  65.             *sy_p = r22/cosa;
  66.         }
  67.     }
  68.  
  69.     // wenn beide Skalierungen negativ: Punktspiegelung
  70.     if (*sx_p<0 && *sy_p<0) {
  71.         *sx_p = *sx_p * -1;
  72.         *sy_p = *sy_p * -1;
  73.         if (*angle_p>0)    *angle_p-=180.0;
  74.         else                *angle_p+=180.0;
  75.     }
  76.     if (fabs(*sx_p-1)<EPS)    *sx_p=1.0;
  77.     if (fabs(*sy_p-1)<EPS)    *sy_p=1.0;
  78.     if (fabs(*sx_p-*sy_p)<EPS)    *sy_p=*sx_p;
  79.     if (fabs(*sh_p)<EPS)        *sh_p=0.0;
  80.     if (fabs(*angle_p)<EPS)    *angle_p=0.0;
  81.     *tx_p = (fabs(tx)>EPS)?tx:0;
  82.     *ty_p = (fabs(ty)>EPS)?ty:0;
  83. }
  84.  
  85.  
  86. // void Mat2::Print() const
  87. // {
  88. //    cout <<  "Matrix  r11, r12, tx  " <<r11<<"  "<<r12<<"  "<<tx<< endl;
  89. //    cout <<  "        r21, r22, ty  " <<r21<<"  "<<r22<<"  "<<ty<< endl;
  90. // }
  91.