UVECTOR.PAS 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. Unit UVector;
  2. INTERFACE
  3. type
  4. pVec = ^tVec;
  5. tVec = record
  6. x, y, z : double;
  7. end;
  8. CONST
  9. EPS : double = 1e-6;
  10. INF : double = 1e30;
  11. ZEROVEC : tVec = (X:0;Y:0;Z:0);
  12. Function Max(a,b:double):double; {}
  13. Function vCos(a,b:tVec):double; {Cos(a^b) || 0, если a^b > 90}
  14. Function aCos(a,b:tVec):double; {|Cos(a^b)|}
  15. Function rCos(a,b:tVec):double; {Cos(a^b)}
  16. Function Tan(a:double):double;
  17. Function ArcCos(x:real):real;
  18. Function Pow(a:double;N:double):double; {a ^ N}
  19. Procedure VSet(var aR:tVec;x,y,z : double); {И так понятно}
  20. Procedure VNorm(var aV:tVec;aLen:double); {Нормализация вектора}
  21. Function VDot(aV1,aV2:tVec):double; {v1.v2 Скалярное произведение}
  22. Procedure VCross(var R : tVec;aV1,aV2:tVec); {v1 X v2 Векторное произведение}
  23. Procedure VLinear(var V:tVec;V1,V2:tVec;k1,k2:double);
  24. Function VLength(aV:tVec):double;
  25. {Линейная продукция (V=V1*k1+V2*K2}
  26. Procedure VRandomize(var aN:tVec;C:double); {Небольшое случайное
  27. изменение вектора}
  28. IMPLEMENTATION
  29. Procedure VLinear; {Линейная продукция (V=V1*k1+V2*K2}
  30. begin
  31. V.x:= V1.x*k1 + V2.x*K2;
  32. V.y:= V1.y*k1 + V2.y*K2;
  33. V.z:= V1.z*k1 + V2.z*K2;
  34. end;{Linear}
  35. {--------------------------------------------------------------------}
  36. Function VDot; {v1.v2 Скалярное произведение}
  37. begin
  38. VDot := aV1.X*aV2.X + aV1.Y*aV2.Y + aV1.Z*aV2.Z;
  39. end;{DotMul}
  40. {--------------------------------------------------------------------}
  41. Procedure VCross; {v1 X v2 Векторное произведение}
  42. begin
  43. R.X := av1.y*av2.z - av1.z*av2.y;
  44. R.Y := av1.z*av2.x - av1.x*av2.z;
  45. R.Z := av1.x*av2.y - av1.y*av2.x;
  46. end;{XMul}
  47. {--------------------------------------------------------------------}
  48. Procedure VSet; {И так понятно}
  49. begin
  50. aR.x := x;aR.y := y;aR.z := z;
  51. end;
  52. {--------------------------------------------------------------------}
  53. Procedure VNorm(var aV:tVec;aLen:double); {Нормализация вектора}
  54. {By IE}
  55. var len : double;
  56. begin
  57. Len := sqrt(VDot(aV,aV));
  58. aV.X := aV.X*aLen / Len;
  59. aV.Y := aV.Y*aLen / Len;
  60. aV.z := aV.z*aLen / Len;
  61. end;{VNorm}
  62. Function Max;
  63. begin
  64. if A > B then Max:=a
  65. else Max:=b;
  66. end;{Max}
  67. {--------------------------------------------------------------------}
  68. Function vCos(a,b:tVec):double; {Cos(a^b) || 0, если a^b > 90}
  69. begin
  70. vCos:=Max(VDot(a, b), 0) / sqrt(VDot(a, a) * VDot(b, b));
  71. end;{vCos}
  72. {------------------------------------------}
  73. Function aCos(a,b:tVec):double; {|Cos(a^b)|}
  74. begin
  75. aCos:=abs(VDot(a, b)) / sqrt(VDot(a, a) * VDot(b, b));
  76. end;{vCos}
  77. {------------------------------------------}
  78. Function rCos(a,b:tVec):double; {Cos(a^b)}
  79. begin
  80. rCos:=VDot(a, b) / sqrt(VDot(a, a) * VDot(b, b));
  81. end;{vCos}
  82. {------------------------------------------}
  83. Function Tan(a:double):double;
  84. begin
  85. if Frac(2*a/pi) <> 0 then Tan:=sin(a)/cos(a)
  86. else Tan := INF;
  87. end;
  88. {------------------------------------------}
  89. Function Pow(a:double;N:double):double; {a ^ N}
  90. begin
  91. if a <> 0 then
  92. Pow:=Exp(Ln(a)*n)
  93. else Pow:=0;
  94. end;
  95. {------------------------------------------}
  96. Function ArcCos(x:real):real;
  97. begin
  98. if abs(x) > 1 then exit;
  99. if x=0 then ArcCos := PI / 2
  100. else
  101. ArcCos := ArcTan(sqrt(1-x*x)/X);
  102. end;
  103. {------------------------------------------}
  104. Function VLength;
  105. begin
  106. VLength := sqrt(aV.X*aV.X + aV.Y*aV.Y + aV.z*aV.z);
  107. end;
  108. {------------------------------------------}
  109. Procedure VRandomize;
  110. begin
  111. with aN do begin
  112. X := X + (-1+Random(2)*2) * Random * C;
  113. Y := Y + (-1+Random(2)*2) * Random * C;
  114. Z := Z + (-1+Random(2)*2) * Random * C;
  115. end;
  116. end;
  117. END.