utmathvectorbase.pas 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. unit utmathvectorbase;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testutils, testregistry, Types, system.math.vectors;
  6. const
  7. c45 = Sqrt(2)/2; // cosine/sine 45°
  8. c60 = Sqrt(3)/2; // cosine 60°
  9. c30 = 1/2; // cosine 30°
  10. s30 = C60; // sine 30°
  11. s45 = c45; // sine 45°
  12. s60 = c30; // sine 60°
  13. type
  14. { TCMathVectorsBase }
  15. TCMathVectorsBase = class(TTestCase)
  16. protected
  17. procedure SetUp; override;
  18. procedure TearDown; override;
  19. class Procedure AssertEquals(const Msg : String; aExpected,aActual : TVector); overload;
  20. class Procedure AssertEquals(const Msg : String; aExpected,aActual : TPoint3D); overload;
  21. class Procedure AssertEquals(const Msg : String; aExpected,aActual : TPointF); overload;
  22. class Procedure AssertEquals(const Msg : String; aExpected,aActual : TVector3D); overload;
  23. class Procedure AssertVector3D(const Msg : String; aExpectedX,aExpectedY,aExpectedZ,aExpectedW: Single; aActual : TVector3D);
  24. class Procedure AssertVector(const Msg : String; aExpectedX,aExpectedY,aExpectedW: Single; aActual : TVector);
  25. class Procedure AssertPoint3D(const Msg : String; aExpectedX,aExpectedY,aExpectedZ: Single; aActual : TPoint3D);
  26. class procedure AssertMatrix(Const Msg : String; m11, m12, m13, m21, m22, m23, m31, m32, m33 : Single; aActual : TMatrix);
  27. class procedure AssertMatrix(Const Msg : String; aExpected : Array of single; aActual : TMatrix);
  28. class procedure AssertMatrix(Const Msg : String; aExpected, aActual : TMatrix);
  29. class procedure AssertMatrix3D(Const Msg : String; m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44 : Single; aActual : TMatrix3D);
  30. class procedure AssertMatrix3D(Const Msg : String; aExpected : Array of single; aActual : TMatrix3D);
  31. class procedure AssertMatrix3D(Const Msg : String; aExpected, aActual : TMatrix3D);
  32. class Procedure AssertPointF(const Msg : String; aExpectedX,aExpectedY: Single; aActual : TPointF);
  33. class Procedure AssertQuaternion(const Msg : String; aExpectedReal,aExpectedImagX,aExpectedImagY,aExpectedImagZ: Single; aActual : TQuaternion3D);
  34. class Procedure AssertQuaternion(const Msg : String; aExpectedReal: Single; aExpectedImag : TPoint3D; aActual : TQuaternion3D);
  35. end;
  36. implementation
  37. procedure TCMathVectorsBase.SetUp;
  38. begin
  39. end;
  40. procedure TCMathVectorsBase.TearDown;
  41. begin
  42. end;
  43. class procedure TCMathVectorsBase.AssertEquals(const Msg: String; aExpected,
  44. aActual: TVector);
  45. begin
  46. AssertEquals(Msg+' X',aExpected.X,aActual.X,TEpsilon.Vector);
  47. AssertEquals(Msg+' Y',aExpected.Y,aActual.Y,TEpsilon.Vector);
  48. AssertEquals(Msg+' W',aExpected.W,aActual.W,TEpsilon.Vector);
  49. end;
  50. class procedure TCMathVectorsBase.AssertEquals(const Msg: String; aExpected,
  51. aActual: TPoint3D);
  52. begin
  53. AssertEquals(Msg+' X',aExpected.X,aActual.X,TEpsilon.Vector);
  54. AssertEquals(Msg+' Y',aExpected.Y,aActual.Y,TEpsilon.Vector);
  55. AssertEquals(Msg+' Z',aExpected.Z,aActual.Z,TEpsilon.Vector);
  56. end;
  57. class procedure TCMathVectorsBase.AssertEquals(const Msg: String; aExpected,
  58. aActual: TPointF);
  59. begin
  60. AssertEquals(Msg+' X',aExpected.X,aActual.X,TEpsilon.Vector);
  61. AssertEquals(Msg+' Y',aExpected.Y,aActual.Y,TEpsilon.Vector);
  62. end;
  63. class procedure TCMathVectorsBase.AssertEquals(const Msg: String; aExpected,
  64. aActual: TVector3D);
  65. begin
  66. AssertEquals(Msg+' X',aExpected.X,aActual.X,TEpsilon.Vector);
  67. AssertEquals(Msg+' Y',aExpected.Y,aActual.Y,TEpsilon.Vector);
  68. AssertEquals(Msg+' Z',aExpected.Z,aActual.Z,TEpsilon.Vector);
  69. AssertEquals(Msg+' W',aExpected.W,aActual.W,TEpsilon.Vector);
  70. end;
  71. class procedure TCMathVectorsBase.AssertVector3D(const Msg: String; aExpectedX,
  72. aExpectedY, aExpectedZ, aExpectedW: Single; aActual: TVector3D);
  73. begin
  74. AssertEquals(Msg+' X',aExpectedX,aActual.X,TEpsilon.Vector);
  75. AssertEquals(Msg+' Y',aExpectedY,aActual.Y,TEpsilon.Vector);
  76. AssertEquals(Msg+' Z',aExpectedZ,aActual.Z,TEpsilon.Vector);
  77. AssertEquals(Msg+' W',aExpectedW,aActual.W,TEpsilon.Vector);
  78. end;
  79. class procedure TCMathVectorsBase.AssertVector(const Msg: String; aExpectedX,
  80. aExpectedY, aExpectedW: Single; aActual: TVector);
  81. begin
  82. AssertEquals(Msg+' X',aExpectedX,aActual.X,TEpsilon.Vector);
  83. AssertEquals(Msg+' Y',aExpectedY,aActual.Y,TEpsilon.Vector);
  84. AssertEquals(Msg+' W',aExpectedW,aActual.W,TEpsilon.Vector);
  85. end;
  86. class procedure TCMathVectorsBase.AssertPoint3D(const Msg: String; aExpectedX, aExpectedY, aExpectedZ: Single; aActual: TPoint3D);
  87. begin
  88. AssertEquals(Msg+' X',aExpectedX,aActual.X,TEpsilon.Vector);
  89. AssertEquals(Msg+' Y',aExpectedY,aActual.Y,TEpsilon.Vector);
  90. AssertEquals(Msg+' Z',aExpectedZ,aActual.Z,TEpsilon.Vector);
  91. end;
  92. class procedure TCMathVectorsBase.AssertMatrix(const Msg: String; m11, m12, m13, m21, m22, m23, m31, m32, m33: Single;
  93. aActual: TMatrix);
  94. begin
  95. AssertEquals(Msg+' m11',m11,aActual.m11,TEpsilon.Vector);
  96. AssertEquals(Msg+' m12',m12,aActual.m12,TEpsilon.Vector);
  97. AssertEquals(Msg+' m13',m13,aActual.m13,TEpsilon.Vector);
  98. AssertEquals(Msg+' m21',m21,aActual.m21,TEpsilon.Vector);
  99. AssertEquals(Msg+' m22',m22,aActual.m22,TEpsilon.Vector);
  100. AssertEquals(Msg+' m23',m23,aActual.m23,TEpsilon.Vector);
  101. AssertEquals(Msg+' m31',m31,aActual.m31,TEpsilon.Vector);
  102. AssertEquals(Msg+' m32',m32,aActual.m32,TEpsilon.Vector);
  103. AssertEquals(Msg+' m33',m33,aActual.m33,TEpsilon.Vector);
  104. end;
  105. class procedure TCMathVectorsBase.AssertMatrix(const Msg: String; aExpected: array of single; aActual: TMatrix);
  106. begin
  107. AssertEquals(Msg+' number of elements',9,Length(aExpected));
  108. AssertMatrix(Msg,aExpected[0],aExpected[1],aExpected[2],
  109. aExpected[3],aExpected[4],aExpected[5],
  110. aExpected[6],aExpected[7],aExpected[8],aActual);
  111. end;
  112. class procedure TCMathVectorsBase.AssertMatrix(const Msg: String; aExpected, aActual: TMatrix);
  113. begin
  114. With aExpected do
  115. AssertMatrix(Msg,m11, m12, m13, m21, m22, m23, m31, m32, m33,aActual);
  116. end;
  117. class procedure TCMathVectorsBase.AssertMatrix3D(const Msg: String; m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33,
  118. m34, m41, m42, m43, m44 : Single; aActual: TMatrix3D);
  119. begin
  120. AssertEquals(Msg+' m11',m11,aActual.m11,TEpsilon.Vector);
  121. AssertEquals(Msg+' m12',m12,aActual.m12,TEpsilon.Vector);
  122. AssertEquals(Msg+' m13',m13,aActual.m13,TEpsilon.Vector);
  123. AssertEquals(Msg+' m14',m14,aActual.m14,TEpsilon.Vector);
  124. AssertEquals(Msg+' m21',m21,aActual.m21,TEpsilon.Vector);
  125. AssertEquals(Msg+' m22',m22,aActual.m22,TEpsilon.Vector);
  126. AssertEquals(Msg+' m23',m23,aActual.m23,TEpsilon.Vector);
  127. AssertEquals(Msg+' m24',m24,aActual.m24,TEpsilon.Vector);
  128. AssertEquals(Msg+' m31',m31,aActual.m31,TEpsilon.Vector);
  129. AssertEquals(Msg+' m32',m32,aActual.m32,TEpsilon.Vector);
  130. AssertEquals(Msg+' m33',m33,aActual.m33,TEpsilon.Vector);
  131. AssertEquals(Msg+' m34',m34,aActual.m34,TEpsilon.Vector);
  132. AssertEquals(Msg+' m41',m41,aActual.m41,TEpsilon.Vector);
  133. AssertEquals(Msg+' m42',m42,aActual.m42,TEpsilon.Vector);
  134. AssertEquals(Msg+' m43',m43,aActual.m43,TEpsilon.Vector);
  135. AssertEquals(Msg+' m44',m44,aActual.m44,TEpsilon.Vector);
  136. end;
  137. class procedure TCMathVectorsBase.AssertMatrix3D(const Msg: String; aExpected: array of single; aActual: TMatrix3D);
  138. begin
  139. AssertEquals(Msg+' number of elements',16,Length(aExpected));
  140. AssertMatrix3D(Msg,aExpected[0],aExpected[1],aExpected[2],aExpected[3],
  141. aExpected[4],aExpected[5],aExpected[6],aExpected[7],
  142. aExpected[8],aExpected[9], aExpected[10], aExpected[11],
  143. aExpected[12], aExpected[13], aExpected[14], aExpected[15], aActual);
  144. end;
  145. class procedure TCMathVectorsBase.AssertMatrix3D(const Msg: String; aExpected, aActual: TMatrix3D);
  146. begin
  147. With aExpected do
  148. AssertMatrix3D(Msg,m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44, aActual);
  149. end;
  150. class procedure TCMathVectorsBase.AssertPointF(const Msg: String; aExpectedX, aExpectedY: Single; aActual: TPointF);
  151. begin
  152. AssertEquals(Msg+' X',aExpectedX,aActual.X,TEpsilon.Vector);
  153. AssertEquals(Msg+' Y',aExpectedY,aActual.Y,TEpsilon.Vector);
  154. end;
  155. class procedure TCMathVectorsBase.AssertQuaternion(const Msg: String; aExpectedReal, aExpectedImagX, aExpectedImagY,
  156. aExpectedImagZ: Single; aActual: TQuaternion3D);
  157. begin
  158. AssertEquals(Msg+' RealPart',aExpectedReal,aActual.RealPart,TEpsilon.Vector);
  159. AssertEquals(Msg+' ImagPart.X',aExpectedImagX,aActual.ImagPart.X,TEpsilon.Vector);
  160. AssertEquals(Msg+' ImagPart.Y',aExpectedImagY,aActual.ImagPart.Y,TEpsilon.Vector);
  161. AssertEquals(Msg+' ImagPart.Z',aExpectedImagZ,aActual.ImagPart.Z,TEpsilon.Vector);
  162. end;
  163. class procedure TCMathVectorsBase.AssertQuaternion(const Msg: String; aExpectedReal: Single; aExpectedImag: TPoint3D;
  164. aActual: TQuaternion3D);
  165. begin
  166. AssertEquals(Msg+' RealPart',aExpectedReal,aActual.RealPart,TEpsilon.Vector);
  167. AssertEquals(Msg+' ImagPart.X',aExpectedImag.X,aActual.ImagPart.X,TEpsilon.Vector);
  168. AssertEquals(Msg+' ImagPart.Y',aExpectedImag.Y,aActual.ImagPart.Y,TEpsilon.Vector);
  169. AssertEquals(Msg+' ImagPart.Z',aExpectedImag.Z,aActual.ImagPart.Z,TEpsilon.Vector);
  170. end;
  171. end.