Como posso representar uma grade de coordenadas no Delphi?
-
22-08-2019 - |
Pergunta
Eu estou tentando representar uma grade de coordenadas bidimensional com uma matriz bidimensional. O problema é, declarando a matriz vira as coordenadas X e Y, devido à forma Delphi aloca a matriz. Isso torna difícil para ler elementos do array. Por exemplo, o seguinte programa dá um erro de verificação de intervalo ao tentar imprimir:
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.
Eu tenho que escrever as costas de índice (se grade [y, x], em seguida,) para evitar que isso aconteça, mas, em seguida, a grade imprime lado, com o X mostrado em (5, 1) em vez de em (1, 5). Se eu tentar mudar a forma da grade dizendo SetLength (grid, 3, 8); em seguida, a atribuição na linha seguinte dá um erro de verificação de intervalo. Eu acabar por ter de escrever todas de minhas coordenadas para trás, ea qualquer momento eu esqueço que eles estão para trás, coisas ruins acabar acontecendo no programa.
Alguém sabe todos os truques para fazer o trabalho coordenar ordem intuitivamente?
Solução
Você só precisa dar os limites adequados na declarações. É importante prestar atenção ao aplicar o baixo e alta ??strong> funções para arrays multi-dimensionais. Para o exemplo actual (uma matriz de duas dimensões), baixa (grade) e alta (grade) irá retornar os limites sobre a primeira dimensão (linha), enquanto a baixa (grade [0]) e alta (grade [0]) vai devolver os limites na primeira coluna ( assumindo que existe ). Observe o mudou limites abaixo:
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.
Eu testei isso e parece fazer exatamente o que você quer.
Outras dicas
[y, x] é o acesso comum e padrão variedade na maioria (todos?) Linguagens de programação. Vai ser confuso para alguém olhar para o seu código se você fazê-lo de outra forma.
Eu diria que a representação padrão não só é consistente com a convenção de programação geral, é consistente com gráficos em geral . Plot [1,4] no papel de gráfico e você vai ter a mesma coisa que em sua segunda (resultado real) exemplo, com a ressalva de que o eixo y é invertida em coordenadas de tela, mas você não está reclamando sobre isso.
Mais especificamente, o eixo x é sempre horizontal, e o eixo y é sempre vertical. Isso é o que seu exemplo shows. Não é revertida.
Eu diria que apenas se acostumar com isso.