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

2D图形编程

开发平台:

Delphi

  1. unit AsphyreUtils;
  2. //---------------------------------------------------------------------------
  3. // AsphyreUtils.pas                                     Modified: 14-Feb-2007
  4. // Asphyre utility routines                                       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 AsphyreUtils.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. // Afterwarp Interactive. All Rights Reserved.
  36. //---------------------------------------------------------------------------
  37. interface
  38. //---------------------------------------------------------------------------
  39. uses
  40.  Types, Vectors2px;
  41. //---------------------------------------------------------------------------
  42. // returns True if the given point is within the specified rectangle
  43. //---------------------------------------------------------------------------
  44. function PointInRect(const Point: TPoint2px; const Rect: TRect): Boolean;
  45. //---------------------------------------------------------------------------
  46. // returns True if the given rectangle is within the specified rectangle
  47. //---------------------------------------------------------------------------
  48. function RectInRect(const Rect1, Rect2: TRect): Boolean;
  49. //---------------------------------------------------------------------------
  50. // returns True if the specified rectangles overlap
  51. //---------------------------------------------------------------------------
  52. function OverlapRect(const Rect1, Rect2: TRect): Boolean;
  53. //---------------------------------------------------------------------------
  54. // returns True if the specified point is inside the triangle
  55. //---------------------------------------------------------------------------
  56. function PointInTriangle(const Pos, v1, v2, v3: TPoint2px): Boolean;
  57. //---------------------------------------------------------------------------
  58. // returns the value of Catmull-Rom cubic spline
  59. //---------------------------------------------------------------------------
  60. function CatmullRom(x0, x1, x2, x3, Theta: Real): Real;
  61. //---------------------------------------------------------------------------
  62. function MinMax2(Value, Min, Max: Integer): Integer;
  63. function Min2(a, b: Integer): Integer;
  64. function Max2(a, b: Integer): Integer;
  65. function Min3(a, b, c: Integer): Integer;
  66. function Max3(a, b, c: Integer): Integer;
  67. //---------------------------------------------------------------------------
  68. // Fixed point 24:8 math routines
  69. //---------------------------------------------------------------------------
  70. function iMul8(x, y: Integer): Integer;
  71. function iCeil8(x: Integer): Integer;
  72. function iDiv8(x, y: Integer): Integer;
  73. //---------------------------------------------------------------------------
  74. // Fixed point 16:16 math routines
  75. //---------------------------------------------------------------------------
  76. function iMul16(x, y: Integer): Integer;
  77. function iCeil16(x: Integer): Integer;
  78. function iDiv16(x, y: Integer): Integer;
  79. //---------------------------------------------------------------------------
  80. implementation
  81. //-----------------------------------------------------------------------------
  82. function PointInRect(const Point: TPoint2px; const Rect: TRect): Boolean;
  83. begin
  84.  Result:= (Point.x >= Rect.Left)and(Point.x <= Rect.Right)and
  85.   (Point.y >= Rect.Top)and(Point.y <= Rect.Bottom);
  86. end;
  87. //---------------------------------------------------------------------------
  88. function RectInRect(const Rect1, Rect2: TRect): Boolean;
  89. begin
  90.  Result:= (Rect1.Left >= Rect2.Left)and(Rect1.Right <= Rect2.Right)and
  91.   (Rect1.Top >= Rect2.Top)and(Rect1.Bottom <= Rect2.Bottom);
  92. end;
  93. //---------------------------------------------------------------------------
  94. function OverlapRect(const Rect1, Rect2: TRect): Boolean;
  95. begin
  96.  Result:= (Rect1.Left < Rect2.Right)and(Rect1.Right > Rect2.Left)and
  97.   (Rect1.Top < Rect2.Bottom)and(Rect1.Bottom > Rect2.Top);
  98. end;
  99. //---------------------------------------------------------------------------
  100. function PointInTriangle(const Pos, v1, v2, v3: TPoint2px): Boolean;
  101. var
  102.  Aux: Integer;
  103. begin
  104.  Aux:= (Pos.y - v2.y) * (v3.x - v2.x) - (Pos.x - v2.x) * (v3.y - v2.y);
  105.  Result:= (Aux * ((Pos.y - v1.y) * (v2.x - v1.x) - (Pos.x - v1.x) *
  106.   (v2.y - v1.y)) > 0)and(Aux * ((Pos.y - v3.y) * (v1.x - v3.x) - (Pos.x -
  107.   v3.x) * (v1.y - v3.y)) > 0);
  108. end;
  109. //---------------------------------------------------------------------------
  110. function CatmullRom(x0, x1, x2, x3, Theta: Real): Real;
  111. begin
  112.  Result:= 0.5 * ((2.0 * x1) + Theta * (-x0 + x2 + Theta * (2.0 * x0 - 5.0 *
  113.   x1 + 4.0 * x2 - x3 + Theta * (-x0 + 3.0 * x1 - 3.0 * x2 + x3))));
  114. end;
  115. //---------------------------------------------------------------------------
  116. function MinMax2(Value, Min, Max: Integer): Integer;
  117. asm { params: eax, edx, ecx }
  118.  cmp eax, edx
  119.  cmovl eax, edx
  120.  cmp eax, ecx
  121.  cmovg eax, ecx
  122. end;
  123. //---------------------------------------------------------------------------
  124. function Min2(a, b: Integer): Integer;
  125. asm { params: eax, edx }
  126.  cmp   edx, eax
  127.  cmovl eax, edx
  128. end;
  129. //---------------------------------------------------------------------------
  130. function Max2(a, b: Integer): Integer;
  131. asm { params: eax, edx }
  132.  cmp   edx, eax
  133.  cmovg eax, edx
  134. end;
  135. //---------------------------------------------------------------------------
  136. function Min3(a, b, c: Integer): Integer;
  137. asm { params: eax, edx, ecx }
  138.  cmp   edx, eax
  139.  cmovl eax, edx
  140.  cmp   ecx, eax
  141.  cmovl eax, ecx
  142. end;
  143. //---------------------------------------------------------------------------
  144. function Max3(a, b, c: Integer): Integer;
  145. asm { params: eax, edx, ecx }
  146.  cmp   edx, eax
  147.  cmovg eax, edx
  148.  cmp   ecx, eax
  149.  cmovg eax, ecx
  150. end;
  151. //---------------------------------------------------------------------------
  152. function iMul8(x, y: Integer): Integer;
  153. asm { params: eax, edx }
  154.  imul edx
  155.  shrd eax, edx, 8
  156. end;
  157. //---------------------------------------------------------------------------
  158. function iCeil8(x: Integer): Integer;
  159. asm
  160.  add eax, $FF
  161.  sar eax, 8
  162. end;
  163. //---------------------------------------------------------------------------
  164. function iDiv8(x, y: Integer): Integer;
  165. asm { params: eax, edx }
  166.  mov ecx, edx
  167.  mov edx, eax
  168.  sar edx, 24
  169.  shl eax, 8
  170.  idiv ecx
  171. end;
  172. //---------------------------------------------------------------------------
  173. function iMul16(x, y: Integer): Integer;
  174. asm { params: eax, edx }
  175.  imul edx
  176.  shrd eax, edx, 16
  177. end;
  178. //---------------------------------------------------------------------------
  179. function iCeil16(x: Integer): Integer;
  180. asm
  181.  add eax, $FFFF
  182.  sar eax, 16
  183. end;
  184. //---------------------------------------------------------------------------
  185. function iDiv16(x, y: Integer): Integer;
  186. asm { params: eax, edx }
  187.  mov ecx, edx
  188.  mov edx, eax
  189.  sar edx, 16
  190.  shl eax, 16
  191.  idiv ecx
  192. end;
  193. //---------------------------------------------------------------------------
  194. end.