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

2D图形编程

开发平台:

Delphi

  1. unit Vectors2px;
  2. //---------------------------------------------------------------------------
  3. // Vectors2px.pas                                       Modified: 10-Feb-2007
  4. // Definitions and functions working with 2D integer vectors      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 Vectors2px.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, Math;
  41. //---------------------------------------------------------------------------
  42. type
  43.  PPoint2px = ^TPoint2px;
  44.  TPoint2px = record
  45.   x, y: Integer;
  46.   class operator Add(const a, b: TPoint2px): TPoint2px;
  47.   class operator Subtract(const a, b: TPoint2px): TPoint2px;
  48.   class operator Multiply(const a, b: TPoint2px): TPoint2px;
  49.   class operator Divide(const a, b: TPoint2px): TPoint2px;
  50.   class operator Negative(const v: TPoint2px): TPoint2px;
  51.   class operator Multiply(const v: TPoint2px; const k: Real): TPoint2px;
  52.   class operator Multiply(const v: TPoint2px; const k: Integer): TPoint2px;
  53.   class operator Divide(const v: TPoint2px; const k: Real): TPoint2px;
  54.   class operator Divide(const v: TPoint2px; const k: Integer): TPoint2px;
  55.   class operator Implicit(const Point: TPoint): TPoint2px;
  56.   class operator Implicit(const Point: TPoint2px): TPoint;
  57.   class operator Equal(const a, b: TPoint2px): Boolean;
  58.   class operator NotEqual(const a, b: TPoint2px): Boolean;
  59.  end;
  60. //---------------------------------------------------------------------------
  61.  TPoints2px = class
  62.  private
  63.   Data: array of TPoint2px;
  64.   DataCount: Integer;
  65.   function GetItem(Num: Integer): PPoint2px;
  66.   procedure Request(Amount: Integer);
  67.   function GetMemAddr(): Pointer;
  68.  public
  69.   property MemAddr: Pointer read GetMemAddr;
  70.   property Count: Integer read DataCount;
  71.   property Item[Num: Integer]: PPoint2px read GetItem; default;
  72.   function Add(const Point: TPoint2px): Integer; overload;
  73.   function Add(x, y: Integer): Integer; overload;
  74.   procedure Remove(Index: Integer);
  75.   procedure RemoveAll();
  76.   procedure CopyFrom(Source: TPoints2px);
  77.   procedure AddFrom(Source: TPoints2px);
  78.   constructor Create();
  79.   destructor Destroy(); override;
  80.  end;
  81. //---------------------------------------------------------------------------
  82. const
  83.  ZeroPoint2px : TPoint2px = (x: 0; y: 0);
  84.  UnityPoint2px: TPoint2px = (x: 1; y: 1);
  85.  InfPoint2px  : TPoint2px = (x: Low(Integer); y: Low(Integer));
  86. //---------------------------------------------------------------------------
  87. function Point2px(x, y: Integer): TPoint2px;
  88. function Length2px(const v: TPoint2px): Real;
  89. function Angle2px(const v: TPoint2px): Real;
  90. function Lerp2px(const v0, v1: TPoint2px; Alpha: Real): TPoint2px;
  91. function Dot2px(const a, b: TPoint2px): Integer;
  92. //---------------------------------------------------------------------------
  93. implementation
  94. //---------------------------------------------------------------------------
  95. const
  96.  CacheSize = 128;
  97. //---------------------------------------------------------------------------
  98. class operator TPoint2px.Add(const a, b: TPoint2px): TPoint2px;
  99. begin
  100.  Result.x:= a.x + b.x;
  101.  Result.y:= a.y + b.y;
  102. end;
  103. //---------------------------------------------------------------------------
  104. class operator TPoint2px.Subtract(const a, b: TPoint2px): TPoint2px;
  105. begin
  106.  Result.x:= a.x - b.x;
  107.  Result.y:= a.y - b.y;
  108. end;
  109. //---------------------------------------------------------------------------
  110. class operator TPoint2px.Multiply(const a, b: TPoint2px): TPoint2px;
  111. begin
  112.  Result.x:= a.x * b.x;
  113.  Result.y:= a.y * b.y;
  114. end;
  115. //---------------------------------------------------------------------------
  116. class operator TPoint2px.Divide(const a, b: TPoint2px): TPoint2px;
  117. begin
  118.  Result.x:= a.x div b.x;
  119.  Result.y:= a.y div b.y;
  120. end;
  121. //---------------------------------------------------------------------------
  122. class operator TPoint2px.Negative(const v: TPoint2px): TPoint2px;
  123. begin
  124.  Result.x:= -v.x;
  125.  Result.y:= -v.y;
  126. end;
  127. //---------------------------------------------------------------------------
  128. class operator TPoint2px.Multiply(const v: TPoint2px;
  129.  const k: Integer): TPoint2px;
  130. begin
  131.  Result.x:= v.x * k;
  132.  Result.y:= v.y * k;
  133. end;
  134. //---------------------------------------------------------------------------
  135. class operator TPoint2px.Multiply(const v: TPoint2px;
  136.  const k: Real): TPoint2px;
  137. begin
  138.  Result.x:= Round(v.x * k);
  139.  Result.y:= Round(v.y * k);
  140. end;
  141. //---------------------------------------------------------------------------
  142. class operator TPoint2px.Divide(const v: TPoint2px;
  143.  const k: Integer): TPoint2px;
  144. begin
  145.  Result.x:= v.x div k;
  146.  Result.y:= v.y div k;
  147. end;
  148. //---------------------------------------------------------------------------
  149. class operator TPoint2px.Divide(const v: TPoint2px;
  150.  const k: Real): TPoint2px;
  151. begin
  152.  Result.x:= Round(v.x / k);
  153.  Result.y:= Round(v.y / k);
  154. end;
  155. //---------------------------------------------------------------------------
  156. class operator TPoint2px.Implicit(const Point: TPoint): TPoint2px;
  157. begin
  158.  Result.x:= Point.X;
  159.  Result.y:= Point.Y;
  160. end;
  161. //---------------------------------------------------------------------------
  162. class operator TPoint2px.Implicit(const Point: TPoint2px): TPoint;
  163. begin
  164.  Result.X:= Point.x;
  165.  Result.Y:= Point.y;
  166. end;
  167. //---------------------------------------------------------------------------
  168. class operator TPoint2px.Equal(const a, b: TPoint2px): Boolean;
  169. begin
  170.  Result:= (a.x = b.x)and(a.y = b.y);
  171. end;
  172. //---------------------------------------------------------------------------
  173. class operator TPoint2px.NotEqual(const a, b: TPoint2px): Boolean;
  174. begin
  175.  Result:= (a.x <> b.x)or(a.y <> b.y);
  176. end;
  177. //---------------------------------------------------------------------------
  178. function Point2px(x, y: Integer): TPoint2px;
  179. begin
  180.  Result.x:= x;
  181.  Result.y:= y;
  182. end;
  183. //---------------------------------------------------------------------------
  184. function Length2px(const v: TPoint2px): Real;
  185. begin
  186.  Result:= Hypot(v.x, v.y);
  187. end;
  188. //---------------------------------------------------------------------------
  189. function Angle2px(const v: TPoint2px): Real;
  190. begin
  191.  Result:= ArcTan2(v.y, v.x);
  192. end;
  193. //---------------------------------------------------------------------------
  194. function Lerp2px(const v0, v1: TPoint2px; Alpha: Real): TPoint2px;
  195. begin
  196.  Result.x:= Round(v0.x + (v1.x - v0.x) * Alpha);
  197.  Result.y:= Round(v0.y + (v1.y - v0.y) * Alpha);
  198. end;
  199. //---------------------------------------------------------------------------
  200. function Dot2px(const a, b: TPoint2px): Integer;
  201. begin
  202.  Result:= (a.x * b.x) + (a.y * b.y);
  203. end;
  204. //---------------------------------------------------------------------------
  205. constructor TPoints2px.Create();
  206. begin
  207.  inherited;
  208.  DataCount:= 0;
  209. end;
  210. //---------------------------------------------------------------------------
  211. destructor TPoints2px.Destroy();
  212. begin
  213.  DataCount:= 0;
  214.  SetLength(Data, 0);
  215.  inherited;
  216. end;
  217. //---------------------------------------------------------------------------
  218. function TPoints2px.GetMemAddr(): Pointer;
  219. begin
  220.  Result:= @Data[0];
  221. end;
  222. //---------------------------------------------------------------------------
  223. function TPoints2px.GetItem(Num: Integer): PPoint2px;
  224. begin
  225.  if (Num >= 0)and(Num < DataCount) then Result:= @Data[Num]
  226.   else Result:= nil;
  227. end;
  228. //---------------------------------------------------------------------------
  229. procedure TPoints2px.Request(Amount: Integer);
  230. var
  231.  Required: Integer;
  232. begin
  233.  Required:= Ceil(Amount / CacheSize) * CacheSize;
  234.  if (Length(Data) < Required) then SetLength(Data, Required);
  235. end;
  236. //---------------------------------------------------------------------------
  237. function TPoints2px.Add(const Point: TPoint2px): Integer;
  238. var
  239.  Index: Integer;
  240. begin
  241.  Index:= DataCount;
  242.  Request(DataCount + 1);
  243.  Data[Index]:= Point;
  244.  Inc(DataCount);
  245.  Result:= Index;
  246. end;
  247. //---------------------------------------------------------------------------
  248. function TPoints2px.Add(x, y: Integer): Integer;
  249. begin
  250.  Result:= Add(Point2px(x, y));
  251. end;
  252. //---------------------------------------------------------------------------
  253. procedure TPoints2px.Remove(Index: Integer);
  254. var
  255.  i: Integer;
  256. begin
  257.  if (Index < 0)or(Index >= DataCount) then Exit;
  258.  for i:= Index to DataCount - 2 do
  259.   Data[i]:= Data[i + 1];
  260.  Dec(DataCount);
  261. end;
  262. //---------------------------------------------------------------------------
  263. procedure TPoints2px.RemoveAll();
  264. begin
  265.  DataCount:= 0;
  266. end;
  267. //---------------------------------------------------------------------------
  268. procedure TPoints2px.CopyFrom(Source: TPoints2px);
  269. var
  270.  i: Integer;
  271. begin
  272.  Request(Source.DataCount);
  273.  for i:= 0 to Source.DataCount - 1 do
  274.   Data[i]:= Source.Data[i];
  275.  DataCount:= Source.DataCount;
  276. end;
  277. //---------------------------------------------------------------------------
  278. procedure TPoints2px.AddFrom(Source: TPoints2px);
  279. var
  280.  i: Integer;
  281. begin
  282.  Request(DataCount + Source.DataCount);
  283.  for i:= 0 to Source.DataCount - 1 do
  284.   Data[i + DataCount]:= Source.Data[i];
  285.  Inc(DataCount, Source.DataCount);
  286. end;
  287. //---------------------------------------------------------------------------
  288. end.