Janilabo

Janilabo | BoxGrid & PointGrid

Aug 19th, 2012
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 14.15 KB | None | 0 0
  1. type
  2.   MSSL_TBoxGrid = record
  3.     startPoint: TPoint;
  4.     size, rows, columns, boxWidth, boxHeight, rowSpace, columnSpace: Integer;
  5.     grid: array of record
  6.       cell: MSSL_TCell;
  7.       bx: TBox;
  8.     end;
  9.   end;
  10.   MSSL_TPointGrid = record
  11.     startPoint: TPoint;
  12.     size, rows, columns, rowSpace, columnSpace: Integer;
  13.     grid: array of record
  14.       cell: MSSL_TCell;
  15.       pt: TPoint;
  16.     end;
  17.   end;
  18.  
  19. function MSSL_BGBuild(var bg: MSSL_TBoxGrid; startX, startY, boxWidth, boxHeight, rows, columns, rowSpace, columnSpace: Integer): Boolean;
  20. var
  21.   id, r, c: Integer;
  22. begin
  23.   if ((startX < 0) or (startY < 0) or (boxWidth < 1) or (boxHeight < 1) or (rows < 1) or (columns < 1) or (rowSpace < 0) or (columnSpace < 0)) then
  24.     Exit;
  25.   bg.size := (rows * columns);
  26.   bg.rows := rows;
  27.   bg.columns := columns;
  28.   bg.startPoint := Point(startX, startY);
  29.   bg.boxWidth := boxWidth;
  30.   bg.boxHeight := boxHeight;
  31.   bg.rowSpace := rowSpace;
  32.   bg.columnSpace := columnSpace;
  33.   SetLength(bg.grid, bg.size);
  34.   for r := 0 to (rows - 1) do
  35.     for c := 0 to (columns - 1) do
  36.     begin
  37.       id := ((r * columns) + c);
  38.       bg.grid[id].cell.row := r;
  39.       bg.grid[id].cell.column := c;
  40.       bg.grid[id].bx := Box((startX + ((id mod columns) * (boxWidth + (columnSpace + 1)))),
  41.                             (startY + ((id div columns) * (boxHeight + (rowSpace + 1)))),
  42.                             ((startX + ((id mod columns) * (boxWidth + (columnSpace + 1)))) + boxWidth),
  43.                             ((startY + ((id div columns) * (boxHeight + (rowSpace + 1)))) + boxHeight));
  44.     end;
  45.   Result := True;
  46. end;
  47.  
  48. function MSSL_BGAddRow(var bg: MSSL_TBoxGrid): Boolean;
  49. var
  50.   id, r, c: Integer;
  51. begin
  52.   if ((bg.startPoint.X < 0) or (bg.startPoint.Y < 0) or (bg.boxWidth < 1) or (bg.boxHeight < 1) or (bg.rowSpace < 0) or (bg.columnSpace < 0)) then
  53.     Exit;
  54.   SetLength(bg, 0);
  55.   Inc(bg.rows);
  56.   bg.size := (bg.rows * bg.columns);
  57.   SetLength(bg.grid, bg.size);
  58.   for r := 0 to (bg.rows - 1) do
  59.     for c := 0 to (bg.columns - 1) do
  60.     begin
  61.       id := ((r * bg.columns) + c);
  62.       bg.grid[id].cell.row := r;
  63.       bg.grid[id].cell.column := c;
  64.       bg.grid[id].bx := Box((bg.startPoint.X + ((id mod bg.columns) * (bg.boxWidth + (bg.columnSpace + 1)))),
  65.                             (bg.startPoint.Y + ((id div bg.columns) * (bg.boxHeight + (bg.rowSpace + 1)))),
  66.                             ((bg.startPoint.X + ((id mod bg.columns) * (bg.boxWidth + (bg.columnSpace + 1)))) + bg.boxWidth),
  67.                             ((bg.startPoint.Y + ((id div bg.columns) * (bg.boxHeight + (bg.rowSpace + 1)))) + bg.boxHeight));
  68.     end;
  69.   Result := True;
  70. end;
  71.  
  72. function MSSL_BGAddColumn(var bg: MSSL_TBoxGrid): Boolean;
  73. var
  74.   id, r, c: Integer;
  75. begin
  76.   if ((bg.startPoint.X < 0) or (bg.startPoint.Y < 0) or (bg.boxWidth < 1) or (bg.boxHeight < 1) or (bg.rowSpace < 0) or (bg.columnSpace < 0)) then
  77.     Exit;
  78.   SetLength(bg, 0);
  79.   Inc(bg.columns);
  80.   bg.size := (bg.rows * bg.columns);
  81.   SetLength(bg.grid, bg.size);
  82.   for r := 0 to (bg.rows - 1) do
  83.     for c := 0 to (bg.columns - 1) do
  84.     begin
  85.       id := ((r * bg.columns) + c);
  86.       bg.grid[id].cell.row := r;
  87.       bg.grid[id].cell.column := c;
  88.       bg.grid[id].bx := Box((bg.startPoint.X + ((id mod bg.columns) * (bg.boxWidth + (bg.columnSpace + 1)))),
  89.                             (bg.startPoint.Y + ((id div bg.columns) * (bg.boxHeight + (bg.rowSpace + 1)))),
  90.                             ((bg.startPoint.X + ((id mod bg.columns) * (bg.boxWidth + (bg.columnSpace + 1)))) + bg.boxWidth),
  91.                             ((bg.startPoint.Y + ((id div bg.columns) * (bg.boxHeight + (bg.rowSpace + 1)))) + bg.boxHeight));
  92.     end;
  93.   Result := True;
  94. end;
  95.  
  96. function MSSL_BGJumpCellByDistance(bg: MSSL_TBoxGrid; cell: MSSL_TCell; rowMoveDist, columnMoveDist: Integer): Boolean;
  97. begin
  98.   Result := (InRange(0, bg.rows, (cell.row + rowMoveDist)) and InRange(0, bg.columns, (cell.column + columnMoveDist)));
  99.   if not Result then
  100.     Exit;
  101.   cell.row := (cell.row + rowMoveDist);
  102.   cell.column := (cell.column + columnMoveDist);
  103. end;
  104.  
  105. function MSSL_BGJumpCellByCompassDirection(bg: MSSL_TBoxGrid; var cell: MSSL_TCell; direction, distance: Integer): Boolean;
  106. begin
  107.   if ((distance < 1) or (distance > bg.columns) or (distance > bg.rows) or not InRange(direction, 0, 7)) then
  108.     Exit;    
  109.   case direction of
  110.     MSSL_COMPASS_DIRECTION_NORTH_EAST:
  111.       begin
  112.         if ((0 > (cell.row - distance)) or ((bg.columns - 1) < (cell.column + distance))) then
  113.           Exit;
  114.         cell.row := (cell.row - distance);
  115.         cell.column := (cell.column + distance);                              
  116.       end;
  117.     MSSL_COMPASS_DIRECTION_SOUTH_EAST:
  118.       begin
  119.         if (((bg.rows - 1) < (cell.row + distance)) or ((bg.columns - 1) < (cell.column + distance))) then
  120.           Exit;
  121.         cell.row := (cell.row + distance);
  122.         cell.column := (cell.column + distance);    
  123.       end;
  124.     MSSL_COMPASS_DIRECTION_SOUTH_WEST:
  125.       begin
  126.         if (((bg.rows - 1) < (cell.row + distance)) or (0 > (cell.column - distance))) then
  127.           Exit;
  128.         cell.row := (cell.row + distance);
  129.         cell.column := (cell.column - distance);
  130.       end;
  131.     MSSL_COMPASS_DIRECTION_NORTH_WEST:
  132.       begin
  133.         if ((0 > (cell.row - distance)) or (0 > (cell.column - distance))) then
  134.           Exit;
  135.         cell.row := (cell.row - distance);
  136.         cell.column := (cell.column - distance);
  137.       end;
  138.     MSSL_COMPASS_DIRECTION_WEST:
  139.       begin
  140.         if (0 > (cell.column - distance)) then
  141.           Exit;
  142.         cell.column := (cell.column - distance);
  143.       end;
  144.     MSSL_COMPASS_DIRECTION_NORTH:
  145.       begin
  146.         if (0 > (cell.row - distance)) then
  147.           Exit;
  148.         cell.row := (cell.row - distance);
  149.       end;
  150.     MSSL_COMPASS_DIRECTION_EAST:
  151.       begin
  152.         if ((bg.columns - 1) < (cell.column + distance)) then
  153.           Exit;
  154.         cell.column := (cell.column + distance);
  155.       end;
  156.     MSSL_COMPASS_DIRECTION_SOUTH:
  157.       begin
  158.         if ((bg.rows - 1) < (cell.row + distance)) then
  159.           Exit;
  160.         cell.row := (cell.row + distance);
  161.       end;  
  162.   end;
  163.   Result := True;
  164. end;
  165.  
  166. function MSSL_BGGetBoxes(bg: MSSL_TBoxGrid): TBoxArray;
  167. var
  168.   i: Integer;
  169. begin
  170.   if (bg.size < 1) then
  171.     Exit;
  172.   SetLength(Result, bg.size);
  173.   for i := 0 to (bg.size - 1) do
  174.     Result[i] := bg.grid[i].bx;
  175. end;
  176.  
  177. function MSSL_BGConvertCellToID(bg: MSSL_TBoxGrid; cell: MSSL_TCell): Integer;
  178. begin
  179.   Result := -1;
  180.   if (InRange(cell.row, 0, (bg.rows - 1)) and InRange(cell.column, 0, (bg.columns - 1))) then
  181.     Result := ((cell.row * bg.columns) + cell.column);
  182. end;
  183.  
  184. function MSSL_BGConvertIDToCell(bg: MSSL_TBoxGrid; ID: Integer): MSSL_TCell;
  185. begin
  186.   if InRange(ID, 0, (bg.size - 1)) then
  187.     for Result.row := 0 to (bg.rows - 1) do
  188.       for Result.column := 0 to (bg.columns - 1) do
  189.         if (ID = ((Result.row * bg.columns) + Result.column)) then
  190.           Exit;
  191.   Result.row := -1;
  192.   Result.column := -1;
  193. end;
  194.  
  195. function MSSL_BGConvertPointToID(bg: MSSL_TBoxGrid; p: TPoint): Integer;
  196. var
  197.   i: Integer;
  198. begin
  199.   Result := -1;
  200.   if (bg.size > 0) then
  201.     for i := 0 to (bg.size - 1) do
  202.       if PointInBox(p, bg.grid[i].bx) then
  203.       begin
  204.         Result := i;
  205.         Exit;
  206.       end;
  207. end;
  208.  
  209. function MSSL_BGConvertIDToBox(bg: MSSL_TBoxGrid; ID: Integer): TBox;
  210. begin
  211.   Result := Box(-1, -1, -1, -1);
  212.   if (InRange(ID, 0, (bg.size - 1)) and (bg.size > 0)) then
  213.     Result := bg.grid[ID].bx;
  214. end;
  215.  
  216. function MSSL_PGBuild(var pg: MSSL_TPointGrid; startX, startY, rows, columns, rowSpace, columnSpace: Integer): Boolean;
  217. var
  218.   id, r, c: Integer;
  219. begin
  220.   if ((startX < 0) or (startY < 0) or (rows < 1) or (columns < 1) or (rowSpace < 0) or (columnSpace < 0)) then
  221.     Exit;
  222.   pg.size := (rows * columns);
  223.   pg.rows := rows;
  224.   pg.columns := columns;
  225.   pg.startPoint := Point(startX, startY);
  226.   pg.rowSpace := rowSpace;
  227.   pg.columnSpace := columnSpace;
  228.   SetLength(pg.grid, pg.size);
  229.   for r := 0 to (rows - 1) do
  230.     for c := 0 to (columns - 1) do
  231.     begin
  232.       id := ((r * columns) + c);
  233.       pg.grid[id].cell.row := r;
  234.       pg.grid[id].cell.column := c;
  235.       pg.grid[id].pt := Point((startX + ((id mod columns) * (columnSpace + 1))),
  236.                               (startY + ((id div columns) * (rowSpace + 1))));
  237.     end;
  238.   Result := True;
  239. end;
  240.  
  241. function MSSL_PGAddRow(var pg: MSSL_TPointGrid): Boolean;
  242. var
  243.   id, r, c: Integer;
  244. begin
  245.   if ((pg.startPoint.X < 0) or (pg.startPoint.Y < 0) or (pg.rowSpace < 0) or (pg.columnSpace < 0)) then
  246.     Exit;
  247.   SetLength(pg, 0);
  248.   Inc(pg.rows);
  249.   pg.size := (pg.rows * pg.columns);
  250.   SetLength(pg.grid, pg.size);
  251.   for r := 0 to (pg.rows - 1) do
  252.     for c := 0 to (pg.columns - 1) do
  253.     begin
  254.       id := ((r * pg.columns) + c);
  255.       pg.grid[id].cell.row := r;
  256.       pg.grid[id].cell.column := c;
  257.       pg.grid[id].pt := Point((pg.startPoint.X + ((id mod pg.columns) * (pg.columnSpace + 1))),
  258.                               (pg.startPoint.Y + ((id div pg.columns) * (pg.rowSpace + 1))));
  259.     end;
  260.   Result := True;
  261. end;
  262.  
  263. function MSSL_PGAddColumn(var pg: MSSL_TPointGrid): Boolean;
  264. var
  265.   id, r, c: Integer;
  266. begin
  267.   if ((pg.startPoint.X < 0) or (pg.startPoint.Y < 0) or (pg.rowSpace < 0) or (pg.columnSpace < 0)) then
  268.     Exit;
  269.   SetLength(pg, 0);
  270.   Inc(pg.columns);
  271.   pg.size := (pg.rows * pg.columns);
  272.   SetLength(pg.grid, pg.size);
  273.   for r := 0 to (pg.rows - 1) do
  274.     for c := 0 to (pg.columns - 1) do
  275.     begin
  276.       id := ((r * pg.columns) + c);
  277.       pg.grid[id].cell.row := r;
  278.       pg.grid[id].cell.column := c;
  279.       pg.grid[id].pt := Point((pg.startPoint.X + ((id mod pg.columns) * (pg.columnSpace + 1))),
  280.                               (pg.startPoint.Y + ((id div pg.columns) * (pg.rowSpace + 1))));
  281.     end;
  282.   Result := True;
  283. end;
  284.  
  285. function MSSL_PGJumpCellByDistance(pg: MSSL_TPointGrid; cell: MSSL_TCell; rowMoveDist, columnMoveDist: Integer): Boolean;
  286. begin
  287.   Result := (InRange(0, pg.rows, (cell.row + rowMoveDist)) and InRange(0, pg.columns, (cell.column + columnMoveDist)));
  288.   if not Result then
  289.     Exit;
  290.   cell.row := (cell.row + rowMoveDist);
  291.   cell.column := (cell.column + columnMoveDist);
  292. end;
  293.  
  294. function MSSL_PGJumpCellByCompassDirection(pg: MSSL_TPointGrid; var cell: MSSL_TCell; direction, distance: Integer): Boolean;
  295. begin
  296.   if ((distance < 1) or (distance > pg.columns) or (distance > pg.rows) or not InRange(direction, 0, 7)) then
  297.     Exit;    
  298.   case direction of
  299.     MSSL_COMPASS_DIRECTION_NORTH_EAST:
  300.       begin
  301.         if ((0 > (cell.row - distance)) or ((pg.columns - 1) < (cell.column + distance))) then
  302.           Exit;
  303.         cell.row := (cell.row - distance);
  304.         cell.column := (cell.column + distance);                              
  305.       end;
  306.     MSSL_COMPASS_DIRECTION_SOUTH_EAST:
  307.       begin
  308.         if (((pg.rows - 1) < (cell.row + distance)) or ((pg.columns - 1) < (cell.column + distance))) then
  309.           Exit;
  310.         cell.row := (cell.row + distance);
  311.         cell.column := (cell.column + distance);    
  312.       end;
  313.     MSSL_COMPASS_DIRECTION_SOUTH_WEST:
  314.       begin
  315.         if (((pg.rows - 1) < (cell.row + distance)) or (0 > (cell.column - distance))) then
  316.           Exit;
  317.         cell.row := (cell.row + distance);
  318.         cell.column := (cell.column - distance);
  319.       end;
  320.     MSSL_COMPASS_DIRECTION_NORTH_WEST:
  321.       begin
  322.         if ((0 > (cell.row - distance)) or (0 > (cell.column - distance))) then
  323.           Exit;
  324.         cell.row := (cell.row - distance);
  325.         cell.column := (cell.column - distance);
  326.       end;
  327.     MSSL_COMPASS_DIRECTION_WEST:
  328.       begin
  329.         if (0 > (cell.column - distance)) then
  330.           Exit;
  331.         cell.column := (cell.column - distance);
  332.       end;
  333.     MSSL_COMPASS_DIRECTION_NORTH:
  334.       begin
  335.         if (0 > (cell.row - distance)) then
  336.           Exit;
  337.         cell.row := (cell.row - distance);
  338.       end;
  339.     MSSL_COMPASS_DIRECTION_EAST:
  340.       begin
  341.         if ((pg.columns - 1) < (cell.column + distance)) then
  342.           Exit;
  343.         cell.column := (cell.column + distance);
  344.       end;
  345.     MSSL_COMPASS_DIRECTION_SOUTH:
  346.       begin
  347.         if ((pg.rows - 1) < (cell.row + distance)) then
  348.           Exit;
  349.         cell.row := (cell.row + distance);
  350.       end;  
  351.   end;
  352.   Result := True;
  353. end;
  354.  
  355. function MSSL_PGGetPoints(pg: MSSL_TPointGrid): TPointArray;
  356. var
  357.   i: Integer;
  358. begin
  359.   if (pg.size < 1) then
  360.     Exit;
  361.   SetLength(Result, pg.size);
  362.   for i := 0 to (pg.size - 1) do
  363.     Result[i] := pg.grid[i].pt;
  364. end;
  365.  
  366. function MSSL_PGCellToID(pg: MSSL_TPointGrid; cell: MSSL_TCell): Integer;
  367. begin
  368.   Result := -1;
  369.   if (InRange(cell.row, 0, (pg.rows - 1)) and InRange(cell.column, 0, (pg.columns - 1))) then
  370.     Result := ((cell.row * pg.columns) + cell.column);
  371. end;
  372.  
  373. function MSSL_PGIDToCell(pg: MSSL_TPointGrid; ID: Integer): MSSL_TCell;
  374. begin
  375.   if InRange(ID, 0, (pg.size - 1)) then
  376.     for Result.row := 0 to (pg.rows - 1) do
  377.       for Result.column := 0 to (pg.columns - 1) do
  378.         if (ID = ((Result.row * pg.columns) + Result.column)) then
  379.           Exit;
  380.   Result.row := -1;
  381.   Result.column := -1;
  382. end;
  383.  
  384. function MSSL_PGPointToID(pg: MSSL_TPointGrid; p: TPoint): Integer;
  385. var
  386.   i: Integer;
  387. begin
  388.   Result := -1;
  389.   if (pg.size > 0) then
  390.     for i := 0 to (pg.size - 1) do
  391.       if (p = pg.grid[i].pt) then
  392.       begin
  393.         Result := i;
  394.         Exit;
  395.       end;
  396. end;
  397.  
  398. function MSSL_PGIDToPoint(pg: MSSL_TPointGrid; ID: Integer): TPoint;
  399. begin
  400.   Result := Point(-1, -1);
  401.   if (InRange(ID, 0, (pg.size - 1)) and (pg.size > 0)) then
  402.     Result := pg.grid[ID].pt;
  403. end;
  404.  
  405. function MSSL_PGPointToCell(pg: MSSL_TPointGrid; p: TPoint): MSSL_TCell;
  406. begin
  407.   if (pg.size > 0) then
  408.     for Result.row := 0 to (pg.rows - 1) do
  409.       for Result.column := 0 to (pg.columns - 1) do
  410.         if (p = pg.grid[((Result.row * pg.columns) + Result.column)].pt) then
  411.           Exit;
  412.   Result.row := -1;
  413.   Result.column := -1;
  414. end;
  415.  
  416. function MSSL_PGCellToPoint(pg: MSSL_TPointGrid; cell: MSSL_TCell): TPoint;
  417. var
  418.   ID: Integer;
  419. begin
  420.   Result := Point(-1, -1);
  421.   if (InRange(ID, 0, (pg.size - 1)) and (pg.size > 0)) then
  422.     Result := pg.grid[((cell.row * pg.columns) + cell.column)].pt;
  423. end;
Advertisement
Add Comment
Please, Sign In to add comment