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

标签 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)改变网格的形状;那么下一行的赋值将给出范围检查错误。我最终不得不将所有坐标都向后写入,而每当我忘记它们向后写入时,坏的事情最终就会在程序中发生。

有谁知道使坐标顺序直观工作的技巧?

最佳答案

您只需要在for语句中给出适当的界限即可。将低和高函数应用于多维数组时,请务必小心。对于当前示例(二维数组),low(grid)和high(grid)将返回第一维(行)的限制,而low(grid [0])和high(grid [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.


我对此进行了测试,它似乎确实可以满足您的要求。

关于delphi - 如何在Delphi中表示坐标网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1081088/

相关文章:

c# - 获取 3D 模型特定顶点可见时的屏幕空间坐标

c# - 如何在 C# 中处理精度

iphone - MKMapview坐标UTM32

Delphi Seattle 默认字体很大

delphi - 使用 Set8087CW、SetMXCSR 和 TWebBrowser 屏蔽浮点异常

delphi - 如何将 TMemo 组件中的多行添加到 MS Access 数据库?

java - 找出读入数据的正确方法

java - JFreeChart 交互式图表编辑处理 ChartMouseEvent

delphi - 文件mydatabase.fdb的不受支持的磁盘结构

Delphi:TOpenDialog + VCL 样式会损坏大量文件的文件名