Ich hab sowas mal gemacht. Hab einfach pro Zeile ein Array of integer genommen. Die Positionen der Zahlen obendrüber und untendrunter waren recht einfach auszurechnen (bei sowas hilft immer ein Blatt Papier).
Ich hab grad mal mein [!Test]-verzeichnis durchforstet und das Projekt tatsächlich gefunden (scheint ja besser sortiert zu sein als ich dachte
). Dass ich den Code geschrieben habe ist schon etwas her, weshalb es sein kann, dass ich es heute eleganter lösen könnte/würde, aber funktionieren tut es jedenfalls (bis darauf dass die oberste 1 nicht gezeichnet wird).
Delphi-Quellcode:
type
tintegerarray = array of integer;
var
numbers: tintegerarray;
const
breite = 24;
procedure TForm1.Button1Click(Sender: TObject);
var
level,i,tmpx,tmpx2: integer;
lastnumbers: tintegerarray;
function getv1(pos: integer): integer;
begin
if pos-1 < 0 then
begin
result := 1;
exit;
end;
result := lastnumbers[pos-1];
end;
function getv2(pos: integer): integer;
begin
if pos > high(lastnumbers) then
begin
result := 1;
exit;
end;
result := lastnumbers[pos];
end;
begin
for level := 0 to 5 do
begin
lastnumbers := numbers;
setlength(numbers,level+1);
for i := 0 to level do
begin
numbers[i] := getv1(i)+getv2(i);
end;
tmpx := clientwidth div 2-((level+1) div 2)*breite;
if odd(level+1) then //ungerade
tmpx := tmpx-breite div 2;
// 1 nr 1
tmpx2 := tmpx-1*breite;
tmpx2 := tmpx2-canvas.TextWidth('1') div 2;
canvas.TextOut(tmpx2,10+level*breite,'1');
// 1 nr 2
tmpx2 := tmpx+(level+1)*breite;
tmpx2 := tmpx2-canvas.TextWidth('1') div 2;
canvas.TextOut(tmpx2,10+level*breite,'1');
for i := 0 to level do
begin
tmpx2 := tmpx+i*breite;
tmpx2 := tmpx2-canvas.TextWidth(inttostr(numbers[i]))*3 div 4;
canvas.TextOut(tmpx2,10+level*breite,inttostr(numbers[i]));
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
setlength(numbers,1);
numbers[0] := 1;
end;