Simba Code:
type
TCell = record
row, column: Integer;
end;
TBoxGrid = record
startPoint: TPoint;
size, rows, columns, boxWidth, boxHeight, rowSpace, columnSpace: Integer;
grid: array of record
cell: TCell;
bx: TBox;
end;
end;
TPointGrid = record
startPoint: TPoint;
size, rows, columns, rowSpace, columnSpace: Integer;
grid: array of record
cell: TCell;
pt: TPoint;
end;
end;
const
COMPASS_DIRECTION_NORTH_EAST = 0;
COMPASS_DIRECTION_SOUTH_EAST = 1;
COMPASS_DIRECTION_SOUTH_WEST = 2;
COMPASS_DIRECTION_NORTH_WEST = 3;
COMPASS_DIRECTION_WEST = 4;
COMPASS_DIRECTION_NORTH = 5;
COMPASS_DIRECTION_EAST = 6;
COMPASS_DIRECTION_SOUTH = 7;
function Box(X1, Y1, X2, Y2: Integer): TBox;
begin
Result.X1 := X1;
Result.Y1 := Y1;
Result.X2 := X2;
Result.Y2 := Y2;
end;
function Cell(row, column: Integer): TCell;
begin
Result.row := row;
Result.column := column;
end;
function grid_Build_BoxGrid(var bg: TBoxGrid; startX, startY, boxWidth, boxHeight, rows, columns, rowSpace, columnSpace: Integer): Boolean;
var
id, r, c: Integer;
begin
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
Exit;
bg.size := (rows * columns);
bg.rows := rows;
bg.columns := columns;
bg.startPoint := Point(startX, startY);
bg.boxWidth := boxWidth;
bg.boxHeight := boxHeight;
bg.rowSpace := rowSpace;
bg.columnSpace := columnSpace;
SetLength(bg.grid, bg.size);
for r := 0 to (rows - 1) do
for c := 0 to (columns - 1) do
begin
id := (r * columns) + c;
bg.grid[id].cell.row := r;
bg.grid[id].cell.column := c;
bg.grid[id].bx := Box((startX + ((id mod columns) * (boxWidth + (columnSpace + 1)))),
(startY + ((id div columns) * (boxHeight + (rowSpace + 1)))),
((startX + ((id mod columns) * (boxWidth + (columnSpace + 1)))) + boxWidth),
((startY + ((id div columns) * (boxHeight + (rowSpace + 1)))) + boxHeight));
end;
Result := True;
end;
function grid_Add_BoxGrid_Row(var bg: TBoxGrid): Boolean;
var
id, r, c: Integer;
begin
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
Exit;
SetLength(bg, 0);
Inc(bg.rows);
bg.size := (bg.rows * bg.columns);
SetLength(bg.grid, bg.size);
for r := 0 to (bg.rows - 1) do
for c := 0 to (bg.columns - 1) do
begin
id := (r * bg.columns) + c;
bg.grid[id].cell.row := r;
bg.grid[id].cell.column := c;
bg.grid[id].bx := Box((bg.startPoint.X + ((id mod bg.columns) * (bg.boxWidth + (bg.columnSpace + 1)))),
(bg.startPoint.Y + ((id div bg.columns) * (bg.boxHeight + (bg.rowSpace + 1)))),
((bg.startPoint.X + ((id mod bg.columns) * (bg.boxWidth + (bg.columnSpace + 1)))) + bg.boxWidth),
((bg.startPoint.Y + ((id div bg.columns) * (bg.boxHeight + (bg.rowSpace + 1)))) + bg.boxHeight));
end;
Result := True;
end;
function grid_Add_BoxGrid_Column(var bg: TBoxGrid): Boolean;
var
id, r, c: Integer;
begin
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
Exit;
SetLength(bg, 0);
Inc(bg.columns);
bg.size := (bg.rows * bg.columns);
SetLength(bg.grid, bg.size);
for r := 0 to (bg.rows - 1) do
for c := 0 to (bg.columns - 1) do
begin
id := (r * bg.columns) + c;
bg.grid[id].cell.row := r;
bg.grid[id].cell.column := c;
bg.grid[id].bx := Box((bg.startPoint.X + ((id mod bg.columns) * (bg.boxWidth + (bg.columnSpace + 1)))),
(bg.startPoint.Y + ((id div bg.columns) * (bg.boxHeight + (bg.rowSpace + 1)))),
((bg.startPoint.X + ((id mod bg.columns) * (bg.boxWidth + (bg.columnSpace + 1)))) + bg.boxWidth),
((bg.startPoint.Y + ((id div bg.columns) * (bg.boxHeight + (bg.rowSpace + 1)))) + bg.boxHeight));
end;
Result := True;
end;
function grid_Jump_BoxGrid_CellByDistance(bg: TBoxGrid; cell: TCell; rowMoveDist, columnMoveDist: Integer): Boolean;
begin
Result := InRange(0, bg.rows, (cell.row + rowMoveDist)) and InRange(0, bg.columns, (cell.column + columnMoveDist));
if not Result then
Exit;
cell.row := (cell.row + rowMoveDist);
cell.column := (cell.column + columnMoveDist);
end;
function grid_Get_BoxGrid_Boxes(bg: TBoxGrid): TBoxArray;
var
i: Integer;
begin
if bg.size < 1 then
Exit;
SetLength(Result, bg.size);
for i := 0 to (bg.size - 1) do
Result[i] := bg.grid[i].bx;
end;
function grid_Convert_BoxGrid_CellToID(bg: TBoxGrid; cell: TCell): Integer;
begin
Result := -1;
if InRange(cell.row, 0, (bg.rows - 1)) and InRange(cell.column, 0, (bg.columns - 1)) then
Result := ((cell.row * bg.columns) + cell.column);
end;
function grid_Convert_BoxGrid_IDToCell(bg: TBoxGrid; ID: Integer): TCell;
begin
if InRange(ID, 0, (bg.size - 1)) then
for Result.row := 0 to (bg.rows - 1) do
for Result.column := 0 to (bg.columns - 1) do
if ID = ((Result.row * bg.columns) + Result.column) then
Exit;
Result.row := -1;
Result.column := -1;
end;
function grid_Convert_BoxGrid_PointToID(bg: TBoxGrid; p: TPoint): Integer;
var
i: Integer;
begin
Result := -1;
if bg.size > 0 then
for i := 0 to (bg.size - 1) do
if PointInBox(p, bg.grid[i].bx) then
begin
Result := i;
Exit;
end;
end;
function grid_Convert_BoxGrid_IDToBox(bg: TBoxGrid; ID: Integer): TBox;
begin
Result := Box(-1, -1, -1, -1);
if InRange(ID, 0, (bg.size - 1)) and (bg.size > 0) then
Result := bg.grid[ID].bx;
end;
function grid_Jump_BoxGrid_CellByCompassDirection(bg: TBoxGrid; var cell: TCell; direction, distance: Integer): Boolean;
begin
if (distance < 1) or (distance > bg.columns) or (distance > bg.rows) or not InRange(direction, 0, 7) then
Exit;
case direction of
COMPASS_DIRECTION_NORTH_EAST: begin
if (0 > (cell.row - distance)) or ((bg.columns - 1) < (cell.column + distance)) then
Exit;
cell.row := (cell.row - distance);
cell.column := (cell.column + distance);
end;
COMPASS_DIRECTION_SOUTH_EAST: begin
if ((bg.rows - 1) < (cell.row + distance)) or ((bg.columns - 1) < (cell.column + distance)) then
Exit;
cell.row := (cell.row + distance);
cell.column := (cell.column + distance);
end;
COMPASS_DIRECTION_SOUTH_WEST: begin
if ((bg.rows - 1) < (cell.row + distance)) or (0 > (cell.column - distance)) then
Exit;
cell.row := (cell.row + distance);
cell.column := (cell.column - distance);
end;
COMPASS_DIRECTION_NORTH_WEST: begin
if (0 > (cell.row - distance)) or (0 > (cell.column - distance)) then
Exit;
cell.row := (cell.row - distance);
cell.column := (cell.column - distance);
end;
COMPASS_DIRECTION_WEST: begin
if (0 > (cell.column - distance)) then
Exit;
cell.column := (cell.column - distance);
end;
COMPASS_DIRECTION_NORTH: begin
if (0 > (cell.row - distance)) then
Exit;
cell.row := (cell.row - distance);
end;
COMPASS_DIRECTION_EAST: begin
if ((bg.columns - 1) < (cell.column + distance)) then
Exit;
cell.column := (cell.column + distance);
end;
COMPASS_DIRECTION_SOUTH: begin
if ((bg.rows - 1) < (cell.row + distance)) then
Exit;
cell.row := (cell.row + distance);
end;
end;
Result := True;
end;
function grid_Build_PointGrid(var pg: TPointGrid; startX, startY, rows, columns, rowSpace, columnSpace: Integer): Boolean;
var
id, r, c: Integer;
begin
if (startX < 0) or (startY < 0) or (rows < 1) or (columns < 1) or (rowSpace < 0) or (columnSpace < 0) then
Exit;
pg.size := (rows * columns);
pg.rows := rows;
pg.columns := columns;
pg.startPoint := Point(startX, startY);
pg.rowSpace := rowSpace;
pg.columnSpace := columnSpace;
SetLength(pg.grid, pg.size);
for r := 0 to (rows - 1) do
for c := 0 to (columns - 1) do
begin
id := (r * columns) + c;
pg.grid[id].cell.row := r;
pg.grid[id].cell.column := c;
pg.grid[id].pt := Point((startX + ((id mod columns) * (columnSpace + 1))),
(startY + ((id div columns) * (rowSpace + 1))));
end;
Result := True;
end;
function grid_Add_Point_Row(var pg: TPointGrid): Boolean;
var
id, r, c: Integer;
begin
if (pg.startPoint.X < 0) or (pg.startPoint.Y < 0) or (pg.rowSpace < 0) or (pg.columnSpace < 0) then
Exit;
SetLength(pg, 0);
Inc(pg.rows);
pg.size := (pg.rows * pg.columns);
SetLength(pg.grid, pg.size);
for r := 0 to (pg.rows - 1) do
for c := 0 to (pg.columns - 1) do
begin
id := (r * pg.columns) + c;
pg.grid[id].cell.row := r;
pg.grid[id].cell.column := c;
pg.grid[id].pt := Point((pg.startPoint.X + ((id mod pg.columns) * (pg.columnSpace + 1))),
(pg.startPoint.Y + ((id div pg.columns) * (pg.rowSpace + 1))));
end;
Result := True;
end;
function grid_Add_PointGrid_Column(var pg: TPointGrid): Boolean;
var
id, r, c: Integer;
begin
if (pg.startPoint.X < 0) or (pg.startPoint.Y < 0) or (pg.rowSpace < 0) or (pg.columnSpace < 0) then
Exit;
SetLength(pg, 0);
Inc(pg.columns);
pg.size := (pg.rows * pg.columns);
SetLength(pg.grid, pg.size);
for r := 0 to (pg.rows - 1) do
for c := 0 to (pg.columns - 1) do
begin
id := (r * pg.columns) + c;
pg.grid[id].cell.row := r;
pg.grid[id].cell.column := c;
pg.grid[id].pt := Point((pg.startPoint.X + ((id mod pg.columns) * (pg.columnSpace + 1))),
(pg.startPoint.Y + ((id div pg.columns) * (pg.rowSpace + 1))));
end;
Result := True;
end;
function grid_Jump_PointGrid_CellByDistance(pg: TPointGrid; cell: TCell; rowMoveDist, columnMoveDist: Integer): Boolean;
begin
Result := InRange(0, pg.rows, (cell.row + rowMoveDist)) and InRange(0, pg.columns, (cell.column + columnMoveDist));
if not Result then
Exit;
cell.row := (cell.row + rowMoveDist);
cell.column := (cell.column + columnMoveDist);
end;
function grid_Jump_PointGrid_CellByCompassDirection(pg: TPointGrid; var cell: TCell; direction, distance: Integer): Boolean;
begin
if (distance < 1) or (distance > pg.columns) or (distance > pg.rows) or not InRange(direction, 0, 7) then
Exit;
case direction of
COMPASS_DIRECTION_NORTH_EAST: begin
if (0 > (cell.row - distance)) or ((pg.columns - 1) < (cell.column + distance)) then
Exit;
cell.row := (cell.row - distance);
cell.column := (cell.column + distance);
end;
COMPASS_DIRECTION_SOUTH_EAST: begin
if ((pg.rows - 1) < (cell.row + distance)) or ((pg.columns - 1) < (cell.column + distance)) then
Exit;
cell.row := (cell.row + distance);
cell.column := (cell.column + distance);
end;
COMPASS_DIRECTION_SOUTH_WEST: begin
if ((pg.rows - 1) < (cell.row + distance)) or (0 > (cell.column - distance)) then
Exit;
cell.row := (cell.row + distance);
cell.column := (cell.column - distance);
end;
COMPASS_DIRECTION_NORTH_WEST: begin
if (0 > (cell.row - distance)) or (0 > (cell.column - distance)) then
Exit;
cell.row := (cell.row - distance);
cell.column := (cell.column - distance);
end;
COMPASS_DIRECTION_WEST: begin
if (0 > (cell.column - distance)) then
Exit;
cell.column := (cell.column - distance);
end;
COMPASS_DIRECTION_NORTH: begin
if (0 > (cell.row - distance)) then
Exit;
cell.row := (cell.row - distance);
end;
COMPASS_DIRECTION_EAST: begin
if ((pg.columns - 1) < (cell.column + distance)) then
Exit;
cell.column := (cell.column + distance);
end;
COMPASS_DIRECTION_SOUTH: begin
if ((pg.rows - 1) < (cell.row + distance)) then
Exit;
cell.row := (cell.row + distance);
end;
end;
Result := True;
end;
function grid_Get_PointGrid_Points(pg: TPointGrid): TPointArray;
var
i: Integer;
begin
if pg.size < 1 then
Exit;
SetLength(Result, pg.size);
for i := 0 to (pg.size - 1) do
Result[i] := pg.grid[i].pt;
end;
function grid_Convert_PointGrid_CellToID(pg: TPointGrid; cell: TCell): Integer;
begin
Result := -1;
if InRange(cell.row, 0, (pg.rows - 1)) and InRange(cell.column, 0, (pg.columns - 1)) then
Result := ((cell.row * pg.columns) + cell.column);
end;
function grid_Convert_PointGrid_IDToCell(pg: TPointGrid; ID: Integer): TCell;
begin
if InRange(ID, 0, (pg.size - 1)) then
for Result.row := 0 to (pg.rows - 1) do
for Result.column := 0 to (pg.columns - 1) do
if ID = ((Result.row * pg.columns) + Result.column) then
Exit;
Result.row := -1;
Result.column := -1;
end;
function grid_Convert_PointGrid_PointToID(pg: TPointGrid; p: TPoint): Integer;
var
i: Integer;
begin
Result := -1;
if pg.size > 0 then
for i := 0 to (pg.size - 1) do
if p = pg.grid[i].pt then
begin
Result := i;
Exit;
end;
end;
function grid_Convert_PointGrid_IDToPoint(pg: TPointGrid; ID: Integer): TPoint;
begin
Result := Point(-1, -1);
if InRange(ID, 0, (pg.size - 1)) and (pg.size > 0) then
Result := pg.grid[ID].pt;
end;
function grid_Convert_PointGrid_PointToCell(pg: TPointGrid; p: TPoint): TCell;
begin
if pg.size > 0 then
for Result.row := 0 to (pg.rows - 1) do
for Result.column := 0 to (pg.columns - 1) do
if p = pg.grid[(Result.row * pg.columns) + Result.column].pt then
Exit;
Result.row := -1;
Result.column := -1;
end;
function grid_Convert_PointGrid_CellToPoint(pg: TPointGrid; cell: TCell): TPoint;
var
ID: Integer;
begin
Result := Point(-1, -1);
if InRange(ID, 0, (pg.size - 1)) and (pg.size > 0) then
Result := pg.grid[(cell.row * pg.columns) + cell.column].pt;
end;
var
i, r, c: Integer;
boxGrid: TBoxGrid;
const
START_X = 95;
START_Y = 70;
BOX_WIDTH = 45;
BOX_HEIGHT = 45;
ROWS = 12;
COLUMNS = 6;
ROW_SPACE = 1;
COLUMN_SPACE = 1;
begin
ClearDebug;
grid_Build_BoxGrid(boxGrid,
START_X,
START_Y,
BOX_WIDTH,
BOX_HEIGHT,
ROWS,
COLUMNS,
ROW_SPACE,
COLUMN_SPACE);
for r := 0 to (boxGrid.rows - 1) do
for c := 0 to (boxGrid.columns - 1) do
begin
i := grid_Convert_BoxGrid_CellToID(boxGrid, Cell(r, c));
WriteLn('boxGrid.grid[' + ToStr(i) + '].bx: ' + ToStr(boxGrid.grid[i].bx));
WriteLn('boxGrid.grid[' + ToStr(i) + '].cell.Row: ' + ToStr(boxGrid.grid[i].cell.row));
WriteLn('boxGrid.grid[' + ToStr(i) + '].cell.Column: ' + ToStr(boxGrid.grid[i].cell.column));
if i < (boxGrid.size - 1) then
WriteLn('');
end;
end.