TRAKBALL.C 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <math.h>
  2. #include "mono.h"
  3. #include "fix.h"
  4. dist_2d(fix x,fix y);
  5. #pragma aux dist_2d parm [eax] [ebx] value [eax] modify [ecx edx] = \
  6. "imul eax" \
  7. "xchg ebx,eax" \
  8. "mov ecx,edx" \
  9. "imul eax" \
  10. "add eax,ebx" \
  11. "adc edx,ecx" \
  12. "call quad_sqrt";
  13. // Given mouse movement in dx, dy, returns a 3x3 rotation matrix in RotMat.
  14. // Taken from Graphics Gems III, page 51, "The Rolling Ball"
  15. void GetMouseRotation( int idx, int idy, fix * RotMat )
  16. {
  17. fix dr, cos_theta, sin_theta, denom, cos_theta1;
  18. fix Radius = i2f(100);
  19. fix dx,dy;
  20. fix dxdr,dydr;
  21. dx = i2f(idx); dy = i2f(idy);
  22. dr = dist_2d(dx,dy);
  23. denom = dist_2d(Radius,dr);
  24. cos_theta = fixdiv(Radius,denom);
  25. sin_theta = fixdiv(dr,denom);
  26. cos_theta1 = f1_0 - cos_theta;
  27. dxdr = fixdiv(dx,dr);
  28. dydr = fixdiv(dy,dr);
  29. RotMat[0] = cos_theta + fixmul(fixmul(dydr,dydr),cos_theta1);
  30. RotMat[1] = - fixmul(fixmul(dxdr,dydr),cos_theta1);
  31. RotMat[2] = fixmul(dxdr,sin_theta);
  32. RotMat[3] = RotMat[1];
  33. RotMat[4] = cos_theta + fixmul(fixmul(dxdr,dxdr),cos_theta1);
  34. RotMat[5] = fixmul(dydr,sin_theta);
  35. RotMat[6] = -RotMat[2];
  36. RotMat[7] = -RotMat[5];
  37. RotMat[8] = cos_theta;
  38. }
  39. ÿ