afPathLinear.cpp
上传用户:kaiguan
上传日期:2007-10-28
资源大小:1074k
文件大小:2k
源码类别:

其他游戏

开发平台:

Visual C++

  1. #pragma warning(disable: 4514)
  2. #include "afPathLinear.h"
  3. #include <stdio.h>
  4. afPathLinear::afPathLinear() : interpolRot(false)
  5. {
  6. type = TYPE_LINEAR;
  7. }
  8. bool afPathLinear::load(const char* nFileName)
  9. {
  10.    //read the path file 
  11. return true;
  12. }
  13. afVec3 afPathLinear::getPosition(float nPos)
  14. {
  15. afVec3 pos;
  16. afVec3n dir;
  17. getPosDir(nPos, pos, dir);
  18. return pos;
  19. }
  20. afVec3n afPathLinear::getDirection(float nPos)
  21. {
  22. afVec3 pos;
  23. afVec3n dir;
  24. getPosDir(nPos, pos, dir);
  25. return dir;
  26. }
  27. int afPathLinear::getPosDir(float nPos, afVec3& nPosition, afVec3n& nDirection)
  28. {
  29. if(nPos<0.0f)
  30. nPos = 0.0f;
  31. if(nPos>1.0f)
  32. nPos = 1.0f;
  33. // handle some special cases which might make
  34. // problems later on... (begin & end of path)
  35. if(nPos==0.0f)
  36. {
  37. nPosition = posList[0];
  38. nDirection = posList[1]-posList[0];
  39. return 0;
  40. }
  41. if(nPos==1.0f)
  42. {
  43. nPosition = posList[posList.getSize()-1];
  44. nDirection = posList[posList.getSize()-1]-posList[posList.getSize()-2];
  45. return posList.getSize()-1;
  46. }
  47. int minIdx=0, midIdx=lenList.getSize()/2, maxIdx=lenList.getSize();
  48. float minVal=0.0f, midVal=lenList[midIdx], maxVal=1.0f;
  49. int runs=0;
  50. // do a binary search (which is in average
  51. // a lot faster than linear search:
  52. // ld(maxIdx) instead of maxIdx/2 steps)
  53. while(maxIdx-minIdx>1)
  54. {
  55. if(midVal<nPos)
  56. {
  57. minIdx = midIdx;
  58. minVal = midVal;
  59. }
  60. else
  61. {
  62. maxIdx = midIdx;
  63. maxVal = midVal;
  64. }
  65. midIdx = (minIdx+maxIdx)/2;
  66. midVal = lenList[midIdx];
  67. runs++;
  68. }
  69. const afVec3& pos0 = posList[minIdx],
  70. pos1 = posList[maxIdx];
  71. float secMin = lenList[minIdx],
  72. secLen = lenList[maxIdx]-lenList[minIdx];
  73. float f = (nPos-secMin)/secLen;
  74. assert(f>=0.0f && f<=1.0f);
  75. nPosition = pos1 * f + pos0 * (1.0f-f);
  76. nDirection = pos1-pos0;
  77. return minIdx;
  78. }