如何在Delphi中表示坐标网格?

时间:2009-07-03 23:00:45

标签: delphi coordinate-systems

我试图用二维数组表示二维坐标网格。问题是,由于Delphi分配数组的方式,声明数组会翻转X和Y坐标。这使得难以读取阵列的元素。例如,以下程序在尝试打印时给出范围检查错误:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

{$R+}
procedure play;
var
   grid: array of array of boolean;
   x, y: integer;
begin
  try
   setLength(grid, 3, 8);
   grid[1, 5] := true;
   for y := low(grid) to high(grid) do
   begin
      for x := low(grid[y]) to high(grid[y]) do
      begin
         if grid[x, y] then
            write('X')
         else write('.');
      end;
      writeln;
   end;
   readln;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end;

begin
   play;
end.

我必须向后写索引(如果是grid [y,x]那么)以防止这种情况发生,但随后网格打印出侧面,X显示在(5,1)而不是(1, 5)。如果我尝试通过说setLength(grid,3,8)来改变网格的形状;然后下一行的赋值给出范围检查错误。我最终不得不向后写所有我的坐标,每当我忘记他们倒退时,程序中最终会发生不好的事情。

有没有人知道使坐标顺序直观起作用的任何技巧?

3 个答案:

答案 0 :(得分:4)

您只需要在 for 语句中给出适当的界限。将函数应用于多维数组时,请务必小心。对于当前示例(二维数组),低(网格)和高(网格)将返回第一维(行)的限制,而低(网格[0])和高(网格[0])将返回第一列的限制(假设它存在)。请注意下面更改的 限制:

program Play_console;

{$APPTYPE CONSOLE}

uses
  SysUtils;

{$R+}
procedure play;
var
   grid: array of array of boolean;
   x, y: integer;
begin
  try
   setLength(grid, 3, 8);
   grid[1, 5] := true;
   for y := low(grid[0]) to high(grid[0]) do
   begin
      for x := low(grid) to high(grid) do
      begin
         if grid[x, y] then
            write('X')
         else write('.');
      end;
      writeln;
   end;

   readln;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end;

begin
   play;
end.

我对此进行了测试,似乎完全符合您的要求。

答案 1 :(得分:1)

[y,x]是大多数(所有?)编程语言的常见标准数组访问。如果你这样做的话,任何看你的代码的人都会感到困惑。

答案 2 :(得分:1)

我会说标准表示不仅与通用编程约定一致,它与一般的图形一致。在方格纸上绘制[1,4]并且你会得到与第二个(实际结果)示例中相同的东西,除了y轴在屏幕坐标中翻转,但你并没有抱怨这一点。

更具体地说,x轴始终是水平的,y轴始终是垂直的。这就是你的例子所显示的。它没有逆转。

我会说你已经习惯了。