st2rvec.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:2k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1998.  */
  2. /* This program is freely distributable without licensing fees
  3.    and is provided without guarantee or warrantee expressed or
  4.    implied. This program is -not- in the public domain. */
  5. /* st2rvec - converts between reflection vectors and sphere map s & t */
  6. #include <stdio.h>
  7. #include <math.h>
  8. void
  9. rvec2st(float rx, float ry, float rz, float *sp, float *tp)
  10. {
  11. double s, t;
  12. double m;
  13. m = 2 * sqrt(rx*rx + ry*ry + (rz+1)*(rz+1));
  14. s = rx/m + 0.5;
  15. t = ry/m + 0.5;
  16. *sp = (float) s;
  17. *tp = (float) t;
  18. }
  19. double
  20. dist(float x, float y, float z)
  21. {
  22. return sqrt(x*x + y*y + z*z);
  23. }
  24. void
  25. st2rvec(float s, float t, float *xp, float *yp, float *zp)
  26. {
  27. double rx, ry, rz;
  28. double tmp1, tmp2;
  29. tmp1 = s*(1-s) + t*(1-t);
  30. tmp2 = 2 * sqrt(4*tmp1 - 1);
  31. rx = tmp2 * (2*s-1);
  32. ry = tmp2 * (2*t-1);
  33. rz = 8 * tmp1 - 3;
  34. *xp = (float) rx;
  35. *yp = (float) ry;
  36. *zp = (float) rz;
  37. }
  38. int
  39. main(int argc, char **argv)
  40. {
  41. float s, t;
  42. float x, y, z;
  43. int count;
  44. printf("nYOU ENTER S & T SPHERE MAP TEXTURE COORDINATES...n");
  45. printf("n  I CONVERT IT TO A NORMALIZED REFLECTION VECTOR");
  46. printf("n      (AND CONVERT BACK!)nn");
  47.         while (!feof(stdin)) {
  48. printf("(s,t) > ");
  49. count = scanf("%f%f", &s, &t);
  50. if (count == EOF) {
  51. break;
  52. } else if (count == 2) {
  53. printf("READ s=%f, t=%fnn", s, t);
  54. st2rvec(s, t, &x, &y, &z);
  55. printf("CONVERTING TO REFLECTION VECTOR:n");
  56. printf("  x=%f, y=%f, z=%fnn", x, y, z);
  57. printf("CONVERTING BACK TO TEXTURE COORDINATE:n");
  58. rvec2st(x, y, z, &s, &t);
  59. printf("  s=%f, t=%fnn", s, t);
  60. } else {
  61. printf("BAD INPUT!nn");
  62. break;
  63. }
  64. }
  65. return 0;
  66. }