home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / VOGLE.ZIP / SRC / MAPPING.C < prev    next >
C/C++ Source or Header  |  2000-02-11  |  2KB  |  91 lines

  1. #include "vogle.h"
  2.  
  3. static    float    Vcx, Vcy, Vsx, Vsy;
  4.  
  5. /*
  6.  * VtoWxy
  7.  *
  8.  * Return the world x and y values corresponding to the input
  9.  * screen x and y values.
  10.  * THIS ROUTINE IS BOLLOCKS and should be rethought.
  11.  */
  12. void
  13. VtoWxy(xs, ys, xw, yw)
  14.     float    xs, ys;
  15.     float    *xw, *yw;
  16. {
  17.     float    d, a1, a2, b1, b2, c1, c2, A, B;
  18.  
  19.     A = (xs - Vcx) / Vsx;
  20.     B = (ys - Vcy) / Vsy;
  21.  
  22.     a1 = vdevice.transmat->m[0][0] - vdevice.transmat->m[0][3] * A;
  23.     a2 = vdevice.transmat->m[0][1] - vdevice.transmat->m[0][3] * B;
  24.  
  25.     b1 = vdevice.transmat->m[1][0] - vdevice.transmat->m[1][3] * A;
  26.     b2 = vdevice.transmat->m[1][1] - vdevice.transmat->m[1][3] * B;
  27.  
  28.     c1 = vdevice.transmat->m[3][3] * A - vdevice.transmat->m[3][0];
  29.     c2 = vdevice.transmat->m[3][3] * B - vdevice.transmat->m[3][1];
  30.  
  31.     d = (a2 * b1 - b2 * a1);
  32.  
  33.     if (d != 0.0) {
  34.         *xw = (b1 * c2 - c1 * b2) / d;
  35.         *yw = (c1 * a2 - a1 * c2) / d;
  36.     } else {
  37.         *xw = A;
  38.         *yw = B;
  39.     }
  40.  
  41.     if (*xw == 0.0)
  42.         *xw = A;
  43.  
  44.     if (*yw == 0.0)
  45.         *yw = B;
  46. }
  47.  
  48. /*
  49.  * calcW2Vcoeffs
  50.  *
  51.  *    Calculate the linear coeffs defining the mapping of world
  52.  *    space to actual device space
  53.  */
  54. void
  55. CalcW2Vcoeffs()
  56. {
  57.     Vcx = (float)(vdevice.maxVx + vdevice.minVx) * 0.5;
  58.     Vcy = (float)(vdevice.maxVy + vdevice.minVy) * 0.5;
  59.  
  60.     Vsx = (float)(vdevice.maxVx - vdevice.minVx) * 0.5;
  61.     Vsy = (float)(vdevice.maxVy - vdevice.minVy) * 0.5;
  62. }
  63.  
  64. /*
  65.  * WtoVx
  66.  *
  67.  * return the Screen X coordinate corresponding to world point 'p' 
  68.  * (does the perspective division as well)
  69.  */
  70. int
  71. WtoVx(p)
  72.     float    p[];
  73. {
  74.     return((int)(p[0] * Vsx / p[3] + Vcx + 0.5));
  75. }
  76.  
  77. /*
  78.  * WtoVy
  79.  *
  80.  * return the Screen Y coordinate corresponding to world point 'p' 
  81.  * (does the perspective division as well)
  82.  */
  83. int
  84. WtoVy(p)
  85.     float    p[];
  86. {
  87.     return((int)(p[1] * Vsy / p[3] + Vcy + 0.5));
  88. }
  89.  
  90.  
  91.