TCDIRECT.CPP
上传用户:abcdshs
上传日期:2007-01-07
资源大小:1858k
文件大小:4k
源码类别:

游戏

开发平台:

Visual C++

  1. // (C) Copyright 1996 by Anthony J. Carin.  All Rights Reserved.
  2. #include <stdafx.h>
  3. #include "tcdirect.h"
  4. #include <math.h>
  5. direction& direction::operator *(float r)
  6. {
  7.     static direction ret;
  8.     ret.m_val = (short) (recalc() * r);
  9.     return ret;
  10. }
  11. char operator<(direction& a, direction& b)
  12. {
  13.    short r = (short)((a.recalc()+TC_PI2)-(b.recalc()+TC_PI2));
  14.    if (abs(r) > TC_PI)
  15.    {
  16.       if (r < 0)
  17.          r = (a+(direction) TC_PI2)-b;
  18.       else
  19.          r = a-(b+(direction) TC_PI2);
  20.    }
  21.    if (r > 0)
  22.       return FALSE;
  23.    return TRUE;
  24. }
  25. const float ISTEP     = .01f;
  26. const int     CSCTBLSIZ = 314;
  27. const int     INTV      = 163;
  28. const float   TCPI      = 3.14f;
  29. static float searchcsc(float);
  30. static float getangle(float x,float y);
  31. static const short csctbl[] =
  32. {32760, 16239, 8118, 5411, 4057, 3245, 2703, 2316, 2025, 1799, 1618, 
  33. 1470, 1346, 1242, 1152, 1074, 1006, 945, 892, 844, 801, 761, 726, 
  34. 693, 663, 635, 610, 586, 564, 544, 524, 506, 489, 473, 458, 444, 431, 
  35. 418, 406, 394, 383, 373, 363, 353, 344, 336, 327, 319, 311, 304, 297, 
  36. 290, 283, 276, 270, 264, 258, 253, 247, 242, 237, 232, 227, 222, 217, 
  37. 213, 208, 204, 200, 196, 192, 188, 184, 181, 177, 173, 170, 167, 163, 
  38. 160, 157, 154, 151, 148, 145, 142, 139, 136, 133, 131, 128, 125, 123, 
  39. 120, 118, 115, 113, 110, 108, 106, 103, 101, 99, 97, 94, 92, 90, 88, 
  40. 86, 84, 82, 80, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 58, 56, 55, 
  41. 53, 51, 49, 47, 46, 44, 42, 40, 39, 37, 35, 34, 32, 30, 28, 27, 25, 
  42. 23, 22, 20, 18, 17, 15, 13, 12, 10, 9, 7, 5, 4, 2, 0, 0, -2, -4, -5, 
  43. -7, -9, -10, -12, -13, -15, -17, -18, -20, -22, -23, -25, -27, -28, 
  44. -30, -32, -34, -35, -37, -39, -40, -42, -44, -46, -47, -49, -51, -53, 
  45. -55, -56, -58, -60, -62, -64, -66, -68, -70, -72, -74, -76, -78, -80, 
  46. -82, -84, -86, -88, -90, -92, -94, -97, -99, -101, -103, -106, -108, 
  47. -110, -113, -115, -118, -120, -123, -125, -128, -131, -133, -136, 
  48. -139, -142, -145, -148, -151, -154, -157, -160, -163, -167, -170, 
  49. -173, -177, -181, -184, -188, -192, -196, -200, -204, -208, -213, 
  50. -217, -222, -227, -232, -237, -242, -247, -253, -258, -264, -270, 
  51. -276, -283, -290, -297, -304, -311, -319, -327, -336, -344, -353, 
  52. -363, -373, -383, -394, -406, -418, -431, -444, -458, -473, -489, 
  53. -506, -524, -544, -564, -586, -610, -635, -663, -693, -726, -761, 
  54. -801, -844, -892, -945, -1006, -1074, -1152, -1242, -1346, -1470, 
  55. -1618, -1799, -2025, -2316, -2703, -3245, -4057, -5411, -8118, -16239, 
  56. -32760};
  57. direction& getdirection(float ox,float oy,float px,float py)
  58. {
  59.     static direction r;
  60.     r = (short)(getangle(px-ox,py-oy)*100.0f);
  61.     return r;
  62. }
  63. static float getangle(float x,float y)
  64. {
  65.     if (x == 0) {
  66.         if (y > 0)
  67.             return 0.0f;
  68.         else
  69.             return TCPI;
  70.     }
  71.     float i = (searchcsc((float)y/(float)x)*TCPI)/CSCTBLSIZ;
  72.     if (x < 0)
  73.         i += TCPI;
  74.     return i;
  75. }
  76. static float searchcsc(float x)
  77. {
  78.     short
  79.         e = CSCTBLSIZ,
  80.         b = 0,
  81.         i = (CSCTBLSIZ/2);
  82.     long
  83.         k = (long) (x*INTV);
  84.     while ((e - b) > 2) {
  85.         if (k == (long) csctbl[i])
  86.             break;
  87.         if (k < (long) csctbl[i]) {
  88.             b = i;
  89.             i = (short)((short)i + (short) (((e - b) / 2) + 1));
  90.         }
  91.         else {
  92.             e = i;
  93.             i = (short)((short)i - (short) (((e - b) / 2) + 1));
  94.         }
  95.     }
  96.     return (float) i;
  97. }
  98. void createtrigtable(float *sintable, float *costable)
  99. {
  100.     for (int i = 0; i < TC_PI2; i++)
  101.     {
  102.         sintable[i] = (float) sin((6.28*(double)i)/(double)TC_PI2);
  103.         costable[i] = (float) cos((6.28*(double)i)/(double)TC_PI2);
  104.     }
  105. }