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

2D图形编程

开发平台:

Delphi

  1. unit HelperSets;
  2. //---------------------------------------------------------------------------
  3. // HelperSets.pas                                       Modified: 20-Feb-2007
  4. // Helper classes to aid the development of application logic     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 HelperSets.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, Vectors2px, AsphyreUtils;
  41. //---------------------------------------------------------------------------
  42. type
  43.  PPointHolder = ^TPointHolder;
  44.  TPointHolder = record
  45.   Point: TPoint2px;
  46.   Data : Pointer;
  47.  end;
  48. //---------------------------------------------------------------------------
  49.  TIntegerList = class
  50.  private
  51.   Data: array of Integer;
  52.   DataCount: Integer;
  53.   function GetItem(Num: Integer): Integer;
  54.   procedure SetItem(Num: Integer; const Value: Integer);
  55.   procedure Request(Amount: Integer);
  56.   function GetMemAddr(): Pointer;
  57.   function GetIntAvg(): Integer;
  58.   function GetIntSum(): Integer;
  59.   function GetIntMax(): Integer;
  60.   function GetIntMin(): Integer; public
  61.   property MemAddr: Pointer read GetMemAddr;
  62.   property Count: Integer read DataCount;
  63.   property Items[Num: Integer]: Integer read GetItem write SetItem; default;
  64.   property IntSum: Integer read GetIntSum;
  65.   property IntAvg: Integer read GetIntAvg;
  66.   property IntMax: Integer read GetIntMax;
  67.   property IntMin: Integer read GetIntMin;
  68.   function IndexOf(Value: Integer): Integer;
  69.   function Insert(Value: Integer): Integer; overload;
  70.   procedure Remove(Index: Integer);
  71.   procedure Clear();
  72.   procedure CopyFrom(Source: TIntegerList);
  73.   procedure AddFrom(Source: TIntegerList);
  74.   procedure Include(Value: Integer);
  75.   procedure Exclude(Value: Integer);
  76.   function Exists(Value: Integer): Boolean;
  77.   procedure Serie(Count: Integer);
  78.   procedure Shuffle();
  79.   constructor Create();
  80.   destructor Destroy(); override;
  81.  end;
  82. //---------------------------------------------------------------------------
  83.  TPointList = class
  84.  private
  85.   Data: array of TPointHolder;
  86.   DataCount: Integer;
  87.   function GetItem(Num: Integer): PPointHolder;
  88.   procedure Request(Amount: Integer);
  89.   function GetMemAddr(): Pointer;
  90.   function GetPoint(Num: Integer): PPoint2px;
  91.  public
  92.   property MemAddr: Pointer read GetMemAddr;
  93.   property Count: Integer read DataCount;
  94.   property Item[Num: Integer]: PPointHolder read GetItem; default;
  95.   property Point[Num: Integer]: PPoint2px read GetPoint;
  96.   function Insert(const Point: TPoint2px; Data: Pointer = nil): Integer; overload;
  97.   function Insert(x, y: Integer; Data: Pointer = nil): Integer; overload;
  98.   procedure Remove(Index: Integer);
  99.   procedure Clear();
  100.   function IndexOf(const Point: TPoint2px): Integer;
  101.   procedure Include(const Point: TPoint2px; Data: Pointer = nil);
  102.   procedure Exclude(const Point: TPoint2px);
  103.   procedure CopyFrom(Source: TPointList);
  104.   procedure AddFrom(Source: TPointList);
  105.   constructor Create();
  106.   destructor Destroy(); override;
  107.  end;
  108. //---------------------------------------------------------------------------
  109.  TRectList = class
  110.  private
  111.   Data: array of TRect;
  112.   DataCount: Integer;
  113.   function GetItem(Num: Integer): PRect;
  114.   procedure Request(Amount: Integer);
  115.   function GetMemAddr(): Pointer;
  116.  public
  117.   property MemAddr: Pointer read GetMemAddr;
  118.   property Count: Integer read DataCount;
  119.   property Item[Num: Integer]: PRect read GetItem; default;
  120.   function Add(const Rect: TRect): Integer; overload;
  121.   function Add(x, y, Width, Height: Integer): Integer; overload;
  122.   procedure Remove(Index: Integer);
  123.   procedure Clear();
  124.   procedure CopyFrom(Source: TRectList);
  125.   procedure AddFrom(Source: TRectList);
  126.   constructor Create();
  127.   destructor Destroy(); override;
  128.  end;
  129. //---------------------------------------------------------------------------
  130. implementation
  131. //---------------------------------------------------------------------------
  132. const
  133.  CacheSize = 32;
  134. //---------------------------------------------------------------------------
  135. constructor TIntegerList.Create();
  136. begin
  137.  inherited;
  138.  DataCount:= 0;
  139. end;
  140. //---------------------------------------------------------------------------
  141. destructor TIntegerList.Destroy();
  142. begin
  143.  DataCount:= 0;
  144.  SetLength(Data, 0);
  145.  inherited;
  146. end;
  147. //---------------------------------------------------------------------------
  148. function TIntegerList.GetMemAddr(): Pointer;
  149. begin
  150.  Result:= @Data[0];
  151. end;
  152. //---------------------------------------------------------------------------
  153. function TIntegerList.GetItem(Num: Integer): Integer;
  154. begin
  155.  if (Num >= 0)and(Num < DataCount) then Result:= Data[Num]
  156.   else Result:= Low(Integer);
  157. end;
  158. //---------------------------------------------------------------------------
  159. procedure TIntegerList.SetItem(Num: Integer; const Value: Integer);
  160. begin
  161.  if (Num >= 0)and(Num < DataCount) then
  162.   Data[Num]:= Value;
  163. end;
  164. //---------------------------------------------------------------------------
  165. procedure TIntegerList.Request(Amount: Integer);
  166. var
  167.  Required: Integer;
  168. begin
  169.  Required:= Ceil(Amount / CacheSize) * CacheSize;
  170.  if (Length(Data) < Required) then SetLength(Data, Required);
  171. end;
  172. //---------------------------------------------------------------------------
  173. function TIntegerList.Insert(Value: Integer): Integer;
  174. var
  175.  Index: Integer;
  176. begin
  177.  Index:= DataCount;
  178.  Request(DataCount + 1);
  179.  Data[Index]:= Value;
  180.  Inc(DataCount);
  181.  Result:= Index;
  182. end;
  183. //---------------------------------------------------------------------------
  184. procedure TIntegerList.Remove(Index: Integer);
  185. var
  186.  i: Integer;
  187. begin
  188.  if (Index < 0)or(Index >= DataCount) then Exit;
  189.  for i:= Index to DataCount - 2 do
  190.   Data[i]:= Data[i + 1];
  191.  Dec(DataCount);
  192. end;
  193. //---------------------------------------------------------------------------
  194. procedure TIntegerList.Clear();
  195. begin
  196.  DataCount:= 0;
  197. end;
  198. //---------------------------------------------------------------------------
  199. procedure TIntegerList.CopyFrom(Source: TIntegerList);
  200. var
  201.  i: Integer;
  202. begin
  203.  Request(Source.DataCount);
  204.  for i:= 0 to Source.DataCount - 1 do
  205.   Data[i]:= Source.Data[i];
  206.  DataCount:= Source.DataCount;
  207. end;
  208. //---------------------------------------------------------------------------
  209. procedure TIntegerList.AddFrom(Source: TIntegerList);
  210. var
  211.  i: Integer;
  212. begin
  213.  Request(DataCount + Source.DataCount);
  214.  for i:= 0 to Source.DataCount - 1 do
  215.   Data[i + DataCount]:= Source.Data[i];
  216.  Inc(DataCount, Source.DataCount);
  217. end;
  218. //---------------------------------------------------------------------------
  219. function TIntegerList.IndexOf(Value: Integer): Integer;
  220. var
  221.  i: Integer;
  222. begin
  223.  Result:= -1;
  224.  for i:= 0 to DataCount - 1 do
  225.   if (Data[i] = Value) then
  226.    begin
  227.     Result:= i;
  228.     Exit;
  229.    end;
  230. end;
  231. //---------------------------------------------------------------------------
  232. procedure TIntegerList.Include(Value: Integer);
  233. begin
  234.  if (IndexOf(Value) = -1) then Insert(Value);
  235. end;
  236. //---------------------------------------------------------------------------
  237. procedure TIntegerList.Exclude(Value: Integer);
  238. var
  239.  Index: Integer;
  240. begin
  241.  Index:= IndexOf(Value);
  242.  if (Index <> -1) then Remove(Index);
  243. end;
  244. //---------------------------------------------------------------------------
  245. function TIntegerList.Exists(Value: Integer): Boolean;
  246. begin
  247.  Result:= (IndexOf(Value) <> -1);
  248. end;
  249. //---------------------------------------------------------------------------
  250. procedure TIntegerList.Shuffle();
  251. var
  252.  i, Aux, Indx: Integer;
  253. begin
  254.  for i:= DataCount - 1 downto 1 do
  255.   begin
  256.    Indx:= Random(i);
  257.    Aux:= Data[i];
  258.    Data[i]:= Data[Indx];
  259.    Data[Indx]:= Aux;
  260.   end;
  261. end;
  262. //---------------------------------------------------------------------------
  263. procedure TIntegerList.Serie(Count: Integer);
  264. var
  265.  i: Integer;
  266. begin
  267.  Request(Count);
  268.  DataCount:= Count;
  269.  for i:= 0 to DataCount - 1 do
  270.   Data[i]:= i;
  271. end;
  272. //---------------------------------------------------------------------------
  273. function TIntegerList.GetIntSum(): Integer;
  274. var
  275.  i: Integer;
  276. begin
  277.  Result:= 0;
  278.  for i:= 0 to DataCount - 1 do
  279.   Inc(Result, Data[i]);
  280. end;
  281. //---------------------------------------------------------------------------
  282. function TIntegerList.GetIntAvg(): Integer;
  283. begin
  284.  if (DataCount > 0) then
  285.   Result:= GetIntSum() div DataCount
  286.    else Result:= 0;
  287. end;
  288. //---------------------------------------------------------------------------
  289. function TIntegerList.GetIntMax(): Integer;
  290. var
  291.  i: Integer;
  292. begin
  293.  if (DataCount < 1) then
  294.   begin
  295.    Result:= 0;
  296.    Exit;
  297.   end;
  298.  Result:= Data[0];
  299.  for i:= 1 to DataCount - 1 do
  300.   Result:= Max2(Result, Data[i]);
  301. end;
  302. //---------------------------------------------------------------------------
  303. function TIntegerList.GetIntMin(): Integer;
  304. var
  305.  i: Integer;
  306. begin
  307.  if (DataCount < 1) then
  308.   begin
  309.    Result:= 0;
  310.    Exit;
  311.   end;
  312.  Result:= Data[0];
  313.  for i:= 1 to Length(Data) - 1 do
  314.   Result:= Min2(Result, Data[i]);
  315. end;
  316. //---------------------------------------------------------------------------
  317. constructor TPointList.Create();
  318. begin
  319.  inherited;
  320.  DataCount:= 0;
  321. end;
  322. //---------------------------------------------------------------------------
  323. destructor TPointList.Destroy();
  324. begin
  325.  DataCount:= 0;
  326.  SetLength(Data, 0);
  327.  inherited;
  328. end;
  329. //---------------------------------------------------------------------------
  330. function TPointList.GetMemAddr(): Pointer;
  331. begin
  332.  Result:= @Data[0];
  333. end;
  334. //---------------------------------------------------------------------------
  335. function TPointList.GetItem(Num: Integer): PPointHolder;
  336. begin
  337.  if (Num >= 0)and(Num < DataCount) then Result:= @Data[Num]
  338.   else Result:= nil;
  339. end;
  340. //---------------------------------------------------------------------------
  341. function TPointList.GetPoint(Num: Integer): PPoint2px;
  342. begin
  343.  if (Num >= 0)and(Num < DataCount) then Result:= @Data[Num].Point
  344.   else Result:= nil;
  345. end;
  346. //---------------------------------------------------------------------------
  347. procedure TPointList.Request(Amount: Integer);
  348. var
  349.  Required: Integer;
  350. begin
  351.  Required:= Ceil(Amount / CacheSize) * CacheSize;
  352.  if (Length(Data) < Required) then SetLength(Data, Required);
  353. end;
  354. //---------------------------------------------------------------------------
  355. function TPointList.Insert(const Point: TPoint2px;
  356.  Data: Pointer = nil): Integer;
  357. var
  358.  Index: Integer;
  359. begin
  360.  Index:= DataCount;
  361.  Request(DataCount + 1);
  362.  Self.Data[Index].Point:= Point;
  363.  Self.Data[Index].Data := Data;
  364.  Inc(DataCount);
  365.  Result:= Index;
  366. end;
  367. //---------------------------------------------------------------------------
  368. function TPointList.Insert(x, y: Integer; Data: Pointer = nil): Integer;
  369. begin
  370.  Result:= Insert(Point2px(x, y), Data);
  371. end;
  372. //---------------------------------------------------------------------------
  373. procedure TPointList.Remove(Index: Integer);
  374. var
  375.  i: Integer;
  376. begin
  377.  if (Index < 0)or(Index >= DataCount) then Exit;
  378.  for i:= Index to DataCount - 2 do
  379.   Data[i]:= Data[i + 1];
  380.  Dec(DataCount);
  381. end;
  382. //---------------------------------------------------------------------------
  383. function TPointList.IndexOf(const Point: TPoint2px): Integer;
  384. var
  385.  i: Integer;
  386. begin
  387.  Result:= -1;
  388.  for i:= 0 to DataCount - 1 do
  389.   if (Data[i].Point = Point) then
  390.    begin
  391.     Result:= i;
  392.     Break;
  393.    end;
  394. end;
  395. //---------------------------------------------------------------------------
  396. procedure TPointList.Include(const Point: TPoint2px; Data: Pointer = nil);
  397. begin
  398.  if (IndexOf(Point) = -1) then Insert(Point, Data);
  399. end;
  400. //---------------------------------------------------------------------------
  401. procedure TPointList.Exclude(const Point: TPoint2px);
  402. begin
  403.  Remove(IndexOf(Point));
  404. end;
  405. //---------------------------------------------------------------------------
  406. procedure TPointList.Clear();
  407. begin
  408.  DataCount:= 0;
  409. end;
  410. //---------------------------------------------------------------------------
  411. procedure TPointList.CopyFrom(Source: TPointList);
  412. var
  413.  i: Integer;
  414. begin
  415.  Request(Source.DataCount);
  416.  for i:= 0 to Source.DataCount - 1 do
  417.   Data[i]:= Source.Data[i];
  418.  DataCount:= Source.DataCount;
  419. end;
  420. //---------------------------------------------------------------------------
  421. procedure TPointList.AddFrom(Source: TPointList);
  422. var
  423.  i: Integer;
  424. begin
  425.  Request(DataCount + Source.DataCount);
  426.  for i:= 0 to Source.DataCount - 1 do
  427.   Data[i + DataCount]:= Source.Data[i];
  428.  Inc(DataCount, Source.DataCount);
  429. end;
  430. //---------------------------------------------------------------------------
  431. constructor TRectList.Create();
  432. begin
  433.  inherited;
  434.  DataCount:= 0;
  435. end;
  436. //---------------------------------------------------------------------------
  437. destructor TRectList.Destroy();
  438. begin
  439.  DataCount:= 0;
  440.  SetLength(Data, 0);
  441.  inherited;
  442. end;
  443. //---------------------------------------------------------------------------
  444. function TRectList.GetMemAddr(): Pointer;
  445. begin
  446.  Result:= @Data[0];
  447. end;
  448. //---------------------------------------------------------------------------
  449. function TRectList.GetItem(Num: Integer): PRect;
  450. begin
  451.  if (Num >= 0)and(Num < DataCount) then Result:= @Data[Num]
  452.   else Result:= nil;
  453. end;
  454. //---------------------------------------------------------------------------
  455. procedure TRectList.Request(Amount: Integer);
  456. var
  457.  Required: Integer;
  458. begin
  459.  Required:= Ceil(Amount / CacheSize) * CacheSize;
  460.  if (Length(Data) < Required) then SetLength(Data, Required);
  461. end;
  462. //---------------------------------------------------------------------------
  463. function TRectList.Add(const Rect: TRect): Integer;
  464. var
  465.  Index: Integer;
  466. begin
  467.  Index:= DataCount;
  468.  Request(DataCount + 1);
  469.  Data[Index]:= Rect;
  470.  Inc(DataCount);
  471.  Result:= Index;
  472. end;
  473. //---------------------------------------------------------------------------
  474. function TRectList.Add(x, y, Width, Height: Integer): Integer;
  475. begin
  476.  Result:= Add(Bounds(x, y, Width, Height));
  477. end;
  478. //---------------------------------------------------------------------------
  479. procedure TRectList.Remove(Index: Integer);
  480. var
  481.  i: Integer;
  482. begin
  483.  if (Index < 0)or(Index >= DataCount) then Exit;
  484.  for i:= Index to DataCount - 2 do
  485.   Data[i]:= Data[i + 1];
  486.  Dec(DataCount);
  487. end;
  488. //---------------------------------------------------------------------------
  489. procedure TRectList.Clear();
  490. begin
  491.  DataCount:= 0;
  492. end;
  493. //---------------------------------------------------------------------------
  494. procedure TRectList.CopyFrom(Source: TRectList);
  495. var
  496.  i: Integer;
  497. begin
  498.  Request(Source.DataCount);
  499.  for i:= 0 to Source.DataCount - 1 do
  500.   Data[i]:= Source.Data[i];
  501.  DataCount:= Source.DataCount;
  502. end;
  503. //---------------------------------------------------------------------------
  504. procedure TRectList.AddFrom(Source: TRectList);
  505. var
  506.  i: Integer;
  507. begin
  508.  Request(DataCount + Source.DataCount);
  509.  for i:= 0 to Source.DataCount - 1 do
  510.   Data[i + DataCount]:= Source.Data[i];
  511.  Inc(DataCount, Source.DataCount);
  512. end;
  513. //---------------------------------------------------------------------------
  514. end.