home *** CD-ROM | disk | FTP | other *** search
/ Encyclopedia of Graphics File Formats Companion / GFF_CD.ISO / software / unix / saoimage / sao1_07.tar / crdtrans.c < prev    next >
C/C++ Source or Header  |  1990-04-20  |  3KB  |  104 lines

  1. #ifndef lint
  2. static char SccsId[] = "%W%  %G%";
  3. #endif
  4.  
  5. /* Module:    crdtrans.c (Coordinate Transformation)
  6.  * Purpose:    Transform x,y, coordinates through transformation matrix
  7.  * Subroutine:    d_transform()            returns: void
  8.  * Subroutine:    i_transform()            returns: void
  9.  * Xlib calls:    none
  10.  * Copyright:    1988 Smithsonian Astrophysical Observatory
  11.  *        You may do anything you like with this file except remove
  12.  *        this copyright.  The Smithsonian Astrophysical Observatory
  13.  *        makes no representations about the suitability of this
  14.  *        software for any purpose.  It is provided "as is" without
  15.  *        express or implied warranty.
  16.  * Modified:    {0} Michael VanHilst    initial version            16 March 1988
  17.  *        {n} <who> -- <does what> -- <when>
  18.  */
  19.  
  20. #include "hfiles/coord.h"        /* coord structs */
  21.  
  22. /*
  23.  * Subroutine:    d_transform
  24.  * Purpose:    Perform coordinate translation on floating point
  25.  *        x and y values
  26.  */
  27. void d_transform ( trans, xin, yin, xout, yout )
  28.      Transform *trans;
  29.      double xin, yin;
  30.      float *xout, *yout;
  31. {
  32.   if( trans->no_rot ) {
  33.     *xout = (trans->inx_outx * (float)xin) + trans->add_outx;
  34.     *yout = (trans->iny_outy * (float)yin) + trans->add_outy;
  35.   } else {
  36.     *xout = trans->add_outx +
  37.       (trans->inx_outx * (float)xin) + (trans->iny_outx * (float)yin);
  38.     *yout = trans->add_outy +
  39.       (trans->inx_outy * (float)xin) + (trans->iny_outy * (float)yin);
  40.   }
  41. }
  42.  
  43. /*
  44.  * Subroutine:    i_transform
  45.  * Purpose:    Perform coordinate translation using integer input values
  46.  * Note:    Does some checking for computational short-cuts
  47.  */
  48. void i_transform ( trans, xin, yin, xout, yout )
  49.      Transform *trans;
  50.      int xin, yin;
  51.      float *xout, *yout;
  52. {
  53.  
  54.   /* if operation is orthogonal and can be performed in integer math */
  55.   if( trans->int_math ) {
  56.     /* if x and y axes are flipped */
  57.     if( trans->flip ) {
  58.       /* if not zoom 1 (no zoom) */
  59.       if( trans->zoom ) {
  60.     if( trans->multiply ) {
  61.       /* multiply means integer multiply */
  62.       *xout = (float)(yin * trans->ixzoom) + trans->iadd_outx;
  63.       *yout = (float)(xin * trans->iyzoom) + trans->iadd_outy;
  64.     } else {
  65.       /* else divide */
  66.       *xout = ((float)yin / (float)trans->ixzoom) + trans->iadd_outx;
  67.       *yout = ((float)xin / (float)trans->iyzoom) + trans->iadd_outy;
  68.     }
  69.       } else {
  70.     /* no zoom is zoom 1 */
  71.     *xout = (float)yin + trans->iadd_outx;
  72.     *yout = (float)xin + trans->iadd_outx;
  73.       }
  74.     } else {
  75.       if( trans->zoom ) {
  76.     if( trans->multiply ) {
  77.       /* multiply means integer multiply */
  78.       *xout = (float)(xin * trans->ixzoom) + trans->iadd_outx;
  79.       *yout = (float)(yin * trans->iyzoom) + trans->iadd_outy;
  80.     }
  81.     else {
  82.       /* else divide */
  83.       *xout = ((float)xin / (float)trans->ixzoom) + trans->iadd_outx;
  84.       *yout = ((float)yin / (float)trans->iyzoom) + trans->iadd_outy;
  85.     }
  86.       } else {
  87.     /* no zoom is zoom 1 */
  88.     *xout = (float)xin + trans->iadd_outx;
  89.     *yout = (float)yin + trans->iadd_outy;
  90.       }
  91.     }
  92.   } else {
  93.     /* else translation must be computed with floating point operations */
  94.     register float Xin, Yin;
  95.  
  96.     Xin = xin;
  97.     Yin = yin;
  98.     *xout =
  99.       (trans->inx_outx * Xin) + (trans->iny_outx * Yin) + trans->iadd_outx;
  100.     *yout =
  101.       (trans->inx_outy * Xin) + (trans->iny_outy * Yin) + trans->iadd_outy;
  102.   }
  103. }
  104.