Hallo Jochen,
Grundlehren der Informatik:
- nichts wächst so schnell wie exponentiell
- nichts geht so schnell schief wie rekursiv
Du kannst deine Logik entweder iterativ (Schleife über $myY) oder rekursiv programmieren. Du tust aber beides.
Solange Du weiße Zeilen findest, zählst Du myY herunter. Okay. Aber sobald Du eine Zeile mit Farbe drin hast, rufst Du Dich rekursiv auf. Kehrt die Rekursion zurück, machst Du da weiter, wo Du in die Rekursion eingestiegen bist, deswegen der Sprung zurück zur 757.
Da Du für jeden 'failed' eine Rekursion einleitest, bist Du hier schon auf Rekursionslevel 27. Irgendwann kommst Du da raus, dann gibt's einen Sprung zurück zur 758, dann zur 759, und jedesmal läuft der ganze Klumpatsch von vorn los. Ackermann lässt grüßen, fürchte ich.
Du willst einen weißen Streifen finden, der
- möglichst hoch oben ist
- hoch genug ist
Richtig? In dem Fall solltest Du von oben nach unten suchen. Keine Rekursion, einfach nur $myY von oben nach unten marschieren lassen.
Wenn Du eine nichtweiße Zeile findest:
- setze $freiraum auf 0
- setze $whiteStart auf $myY + 1
Wenn Du eine weiße Zeile findest:
- erhöhe $freiraum um 1
- ist $freiraum >= 150, brich die Schleife ab.
Hinter der Schleife prüfe, ob $freiraum >= 150 ist. Wenn ja, zeichne das Logo ab y=$whiteStart.
Ob getImagePixelColor und getColorAsString eine effiziente Methode zur pixelweisen Prüfung sind, weiß ich nicht, dazu habe ich von Imagick zu wenig Ahnung. Unter .net wäre das der Performance-Todesstoß, DA habe ich Erfahrung...
Rolf
sumpsi - posui - obstruxi