Matrices3.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:6k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit Matrices3;
  2. //---------------------------------------------------------------------------
  3. // Matrices3.pas                                        Modified: 25-Apr-2007
  4. // Definitions and functions working with 3x3 matrices            Version 1.0
  5. //---------------------------------------------------------------------------
  6. // Important Notice:
  7. //
  8. // If you modify/use this code or one of its parts either in original or
  9. // modified form, you must comply with Mozilla Public License v1.1,
  10. // specifically section 3, "Distribution Obligations". Failure to do so will
  11. // result in the license breach, which will be resolved in the court.
  12. // Remember that violating author's rights is considered a serious crime in
  13. // many countries. Thank you!
  14. //
  15. // !! Please *read* Mozilla Public License 1.1 document located at:
  16. //  http://www.mozilla.org/MPL/
  17. //
  18. // If you require any clarifications about the license, feel free to contact
  19. // us or post your question on our forums at: http://www.afterwarp.net
  20. //---------------------------------------------------------------------------
  21. // The contents of this file are subject to the Mozilla Public License
  22. // Version 1.1 (the "License"); you may not use this file except in
  23. // compliance with the License. You may obtain a copy of the License at
  24. // http://www.mozilla.org/MPL/
  25. //
  26. // Software distributed under the License is distributed on an "AS IS"
  27. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  28. // License for the specific language governing rights and limitations
  29. // under the License.
  30. //
  31. // The Original Code is Matrices3.pas.
  32. //
  33. // The Initial Developer of the Original Code is M. Sc. Yuriy Kotsarenko.
  34. // Portions created by M. Sc. Yuriy Kotsarenko are Copyright (C) 2007,
  35. // M. Sc. Yuriy Kotsarenko. All Rights Reserved.
  36. //---------------------------------------------------------------------------
  37. interface
  38. //---------------------------------------------------------------------------
  39. uses
  40.  Vectors2;
  41. //---------------------------------------------------------------------------
  42. type
  43.  PMatrix3 = ^TMatrix3;
  44.  TMatrix3 = record
  45.   Data: array[0..2, 0..2] of Single;
  46.   class operator Add(const a, b: TMatrix3): TMatrix3;
  47.   class operator Subtract(const a, b: TMatrix3): TMatrix3;
  48.   class operator Multiply(const a, b: TMatrix3): TMatrix3;
  49.   class operator Multiply(const Mtx: TMatrix3; Theta: Single): TMatrix3;
  50.   class operator Multiply(const v: TPoint2; const m: TMatrix3): TPoint2;
  51.   class operator Divide(const Mtx: TMatrix3; Theta: Single): TMatrix3;
  52.  end;
  53. //---------------------------------------------------------------------------
  54. const
  55.  IdentityMtx3: TMatrix3 = (Data: ((1.0, 0.0, 0.0), (0.0, 1.0, 0.0),
  56.   (0.0, 0.0, 1.0)));
  57.  ZeroMtx3: TMatrix3 = (Data: ((0.0, 0.0, 0.0), (0.0, 0.0, 0.0),
  58.   (0.0, 0.0, 0.0)));
  59. //---------------------------------------------------------------------------
  60. function TransposeMtx3(const Mtx: TMatrix3): TMatrix3;
  61. function TranslateMtx3(const Offset: TPoint2): TMatrix3;
  62. function ScaleMtx3(const Coef: TPoint2): TMatrix3;
  63. function RotateMtx3(Angle: Single): TMatrix3;
  64. //---------------------------------------------------------------------------
  65. implementation
  66. //---------------------------------------------------------------------------
  67. class operator TMatrix3.Add(const a, b: TMatrix3): TMatrix3;
  68. var
  69.  i, j: Integer;
  70. begin
  71.  for j:= 0 to 2 do
  72.   for i:= 0 to 2 do
  73.    Result.Data[j, i]:= a.Data[j, i] + b.Data[j, i];
  74. end;
  75. //---------------------------------------------------------------------------
  76. class operator TMatrix3.Subtract(const a, b: TMatrix3): TMatrix3;
  77. var
  78.  i, j: Integer;
  79. begin
  80.  for j:= 0 to 2 do
  81.   for i:= 0 to 2 do
  82.    Result.Data[j, i]:= a.Data[j, i] - b.Data[j, i];
  83. end;
  84. //---------------------------------------------------------------------------
  85. class operator TMatrix3.Multiply(const a, b: TMatrix3): TMatrix3;
  86. var
  87.  i, j: Integer;
  88. begin
  89.  for j:= 0 to 2 do
  90.   for i:= 0 to 2 do
  91.    Result.Data[j, i]:= (a.Data[j, 0] * b.Data[0, i]) +
  92.     (a.Data[j, 1] * b.Data[1, i]) +
  93.     (a.Data[j, 2] * b.Data[2, i]);
  94. end;
  95. //---------------------------------------------------------------------------
  96. class operator TMatrix3.Multiply(const Mtx: TMatrix3; Theta: Single): TMatrix3;
  97. var
  98.  i, j: Integer;
  99. begin
  100.  for j:= 0 to 2 do
  101.   for i:= 0 to 2 do
  102.    Result.Data[j, i]:= Mtx.Data[j, i] * Theta;
  103. end;
  104. //---------------------------------------------------------------------------
  105. class operator TMatrix3.Divide(const Mtx: TMatrix3; Theta: Single): TMatrix3;
  106. var
  107.  i, j: Integer;
  108. begin
  109.  for j:= 0 to 2 do
  110.   for i:= 0 to 2 do
  111.    Result.Data[j, i]:= Mtx.Data[j, i] / Theta;
  112. end;
  113. //---------------------------------------------------------------------------
  114. class operator TMatrix3.Multiply(const v: TPoint2;
  115.  const m: TMatrix3): TPoint2;
  116. begin
  117.  Result.x:= (v.x * m.Data[0, 0]) + (v.y * m.Data[1, 0]) + m.Data[2, 0];
  118.  Result.y:= (v.x * m.Data[0, 1]) + (v.y * m.Data[1, 1]) + m.Data[2, 1];
  119. end;
  120. //--------------------------------------------------------------------------
  121. function TransposeMtx3(const Mtx: TMatrix3): TMatrix3;
  122. var
  123.  i, j: Integer;
  124. begin
  125.  for i:= 0 to 2 do
  126.   for j:= 0 to 2 do
  127.    Result.Data[i, j]:= Mtx.Data[j, i];
  128. end;
  129. //---------------------------------------------------------------------------
  130. function TranslateMtx3(const Offset: TPoint2): TMatrix3;
  131. begin
  132.  Result:= IdentityMtx3;
  133.  Result.Data[2, 0]:= Offset.x;
  134.  Result.Data[2, 1]:= Offset.y;
  135. end;
  136. //--------------------------------------------------------------------------
  137. function ScaleMtx3(const Coef: TPoint2): TMatrix3;
  138. begin
  139.  Result:= IdentityMtx3;
  140.  Result.Data[0, 0]:= Coef.x;
  141.  Result.Data[1, 1]:= Coef.y;
  142. end;
  143. //--------------------------------------------------------------------------
  144. function RotateMtx3(Angle: Single): TMatrix3;
  145. begin
  146.  Result:= IdentityMtx3;
  147.  Result.Data[0, 0]:=  Cos(Angle);
  148.  Result.Data[0, 1]:=  Sin(Angle);
  149.  Result.Data[1, 0]:= -Result.Data[0, 1];
  150.  Result.Data[1, 1]:=  Result.Data[0, 0];
  151. end;
  152. //---------------------------------------------------------------------------
  153. end.