Zitat von
Matze:
Auch dir danke, Medium. Wenn ich die Zeit finde, probiere ich das auch mal aus, wobei das recht kompliziert aussieht.
In Code gegossen dürfte es weniger tief verschachtelt, und sogar etwas kürzer als die aktuelle Version ausfallen
. Das Ergebnis wird allerdings bei steigender Dicke dem von Himi immer unähnlicher.
Was mir aber auch noch gerade einfiel ist die
Hough-Transformation! Grob gesagt kannst du damit aus so einfachen Bildern recht genau die Parameter für die zugehörigen Geradengleichungen herausbekommen, und mit diesen dann sogar vektoriell ganz neu zeichnen, mit allen Freiheiten die das so bringen könnte. Also... zumindest theoretisch
Edit:
Das "array[0..0] of Typ" ist eine C-übliche Schreibweise für dynamische Arrays. Technisch entspricht das einem "^Typ", also einem Pointer. Der Unterschied ist nun, dass man einen Pointer mit inc() weiterschubsen müsste, bei der Schreibweise als Array übernimmt der Compiler die Pointerarithmetik und man kann hübsch mit Indizes dran gehen. Weniger hübsch ist, dass man ohne Netz und doppelten Boden über die Grenze des eigentlichen Datenbereichs hinweg flutschen kann, die Größenangabe also mehr als wichtig dabei ist.
Diese zwei Codefetzen dürften identische Wirkung haben:
1:
Delphi-Quellcode:
type
TOpenIntArray = array[0..0] of Integer;
procedure Foo(input: array of Integer; length: Integer);
var
a: TOpenIntArray;
i, bar: Integer;
begin
a := input;
for i := 0 to length-1 do
begin
bar := a[i];
end;
end;
2:
Delphi-Quellcode:
procedure Foo(input: array of Integer; length: Integer);
var
a: PInteger;
i, bar: Integer;
begin
a := @input[0];
for i := 0 to length-1 do
begin
bar := a^;
inc(a);
end;
end;
Da es in C keine offenen Arrays gibt, hat man sich mit diesem Konstrukt beholfen. Dort muss dann auch von Hand vom Speichermanager entsprechend
RAM angefordert werden, und die Bereichsprüfung ist auch Handarbeit. Alles der Kram, der bei Delphi durch die Compilermagic in dynamischen Arrays halt so passiert. Und da es in Delphi prinzipiell auch anders und
imho eleganter geht, sollte man dieses array[0..0] auch eher als Ergebnis einer 1:1 Übersetzung sehen, keinesfalls aber als empfohlen. Es ist eigentlich ein überholtes Relikt.
In diesem Fall hier ist es auch kein 2GB großes Array
. Die Deklaration so einer Variable belegt an sich erstmal genau eine Registerbreite Speicher - es ist nur ein Pointer. Der wird hier dann auf den Speicherbereich des ersten (bzw. eigentlich letzten) Pixels gebogen, so dass man durch Weiterrücken pixelweise über diesen Buffer läuft. Es ist nur ein popeliger Pointer, der etwas "lustig" hingeschrieben ist damit man indizierten Zugriff ohne Handarbeit haben kann - bzw. weil irgend jemand mal C Code so nach Delphi übersetzt hat, und es Schule gemacht hat =)
Man könnte genauso gut ein "echtes" dynamisches Delphi-Array nehmen, und es mit etwas trickserei genau auf den selben Bereich zeigen lassen. Die Verwendung wäre identisch, und man fordert auch nie selbst nochmal Speicher dafür an (kein SetLength in diesem Fall). Der ist schon da, im Bitmap.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)