Kennt jemand eine FILL-Routine in BASIC?

Es gibt 51 Antworten in diesem Thema, welches 6.959 mal aufgerufen wurde. Der letzte Beitrag (17. Juli 2022 um 23:03) ist von Peter.

  • Ich habe folgende Problemstellung: Im Textbildschirm habe ich eine 16x16 Zeichen große "Grafik" die aus Punkten und Sternen besteht. (Das ganze soll mal ein Zeichensatzeditor für 2x2 Zeichen werden.)

    Bitte melde dich an, um diesen Anhang zu sehen.

    An der mit X markierten Stelle (oder an einer beliebigen anderen Stelle) möchte ich einen Paint/Fill-Vorgang durchführen. Das heißt der Bereich zwischen dem größeren Ring und dem kleineren Ring soll mit Sternen ausgefüllt werden.

    Also genau das, was die Füll-Werkzeuge in den gängigen Malprogrammen auch machen.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Ist das mit BASIC überhaupt möglich? Und hat vielleicht sogar jemand einen fertigen Code dafür, den er mir zur Verfügung stellen kann?

    Ich programmiere einen Zeichensatzeditor mit TSB/Simons Basic. Aber einen Lösungsansatz in v2 Basic würde ich ebenso begrüßen, da v2 Basic ja eine Teilmenge von TSB ist.

  • Ja, das geht auch in BASIC. Mit zwei Zeichenketten X$ und Y$, welche sich die X,Y-Koordinaten von "zurückgestellten" Anfangspositionen in einer Warteschlange merken, z.B. so:

    "@1,X,Y" und "@(X,Y)" sind Punktsetz- und -abfragefunktionen in einer eigenen BASIC-Erweiterung (MINIGRAFIK) auf dem VC-20, die müßtest Du (genau wie die Zeilennummern) anpassen, der Rest ist Standard V2 BASIC.

    Bei extrem komplizierten/verwinkelten auszufüllenden Formen ist es zwar möglich, daß die Zeichenketten "überlaufen", dann gibt es einen ?STRING TOO LONG ERROR. In der Praxis kommt das aber praktisch nicht vor.

    Das vollständige Programm für den VC-20 hab' ich mal angehängt. Es malt einen Garfield, zum Schluß werden die Ohren und Augen mit dem nachgebauten PAINT/FILL-Befehl gefüllt. Das Programm braucht mindestens eine +8K RAM-Erweiterung.

    Bitte melde dich an, um diesen Anhang zu sehen.

  • Bei extrem komplizierten/verwinkelten auszufüllenden Formen ist es zwar möglich, daß die Zeichenketten "überlaufen", dann gibt es einen ?STRING TOO LONG ERROR.

    Meine Grafiken sind ja maximal 16x16 Zeichen groß. Meinst Du das passt immer?

    Das vollständige Programm für den VC-20 hab' ich mal angehängt.

    Hab leider keinen VC20 Emu am Start. Aber ich versuche mal Deinen Programmcode umzusetzen und schaue ob es funktioniert.

    Erstmal vielen Dank. :)

    Ach übrigens: Wo legt man denn die Startkoordinaten in Deinem Programm fest? Ich blicke da noch nicht so ganz durch.

  • Meine Grafiken sind ja maximal 16x16 Zeichen groß. Meinst Du das passt immer?

    In diesem Fall kann ich das garantieren, sogar mathematisch. Sobald die Füllroutine hier eine Fläche mit mindestens zwei zusammenhängenden Punkten ausfüllen muß, kann sie gar nicht mehr als 255 Koordinaten "zurückstellen" und damit reichen die 255 Zeichen, die maximal in X$ und Y$ rein gehen auf jeden Fall aus.

    Ich habe aber keine Probleme damit, die Routine auch in der 160x192 Bitmap von MINIGRAFIK einzusetzen. Man muß wirklich schon sehr spezielle, rekursiv definierte Baumstrukturen auf diesen Füllalgorithmus ansetzen, um ihn zu überlisten.

    Hab leider keinen VC20 Emu am Start.

    In VICE ist xvic drin.

    Ach übrigens: Wo legt man denn die Startkoordinaten in Deinem Programm fest? Ich blicke da noch nicht so ganz durch.

    X und Y beim Aufruf mit GOSUB.

  • Die Funktion -@(x,y). Was liefert die genau an Dein Programm zurück?

    -1 Pixel gesetzt, 0 Pixel nicht gesetzt?

    Und der Befehl @1,x,y der setzt -1 an eine bestimmte Koordinate.

    In meiner "Grafik" wäre dann . gleichbedeutend mit 0 und * gleichbedeutend mit -1. Oder?

  • Im Prinzip stimmt das so alles, ja.

    Nur zur Erklärung noch: die Unterroutine nutzt die Werte 0 und -1 als Boole'sche Prädikate, die Zeichenbefehle allerdings 0 und 1 für "leer" und "voll". Das Minuszeichen bei der @()-Funktion dient dazu, zwischen den Malfarben und Prädikaten zu vermitteln, die liefert sonst ebenso 0 oder 1 (im Hires-Modus) zurück.

    Edit: der Vollständigkeit halber hier mal eine Liste der Befehle von MINIGRAFIK -

    @ON - Grafik einschalten

    @CLR - Bitmap löschen

    @RETURN - zurück zum Textmodus (wird automatisch vor Ausgabe einer Fehlermeldung mit ausgeführt)

    @<farbe>,<x>,<y> - Punkt setzen

    @<farbe>,<x1>,<y1>TO<x2>,<y2> - Linie ziehen

    @SAVE<dateiname>,<gerät> - Bild speichern

    @LOAD<dateiname>,<gerät> - Bild laden

    und mit

    @(<x>,<y>) als Funktion kriegt man die aktuelle Farbnummer am Ort geliefert.

    Alle Parameter in den spitzen Klammern können als Konstante, Variable oder Ausdruck angegeben werden.

    Folgt so ein Befehl direkt nach einem THEN, so muß zwischen THEN und @ noch ein Doppelpunkt eingefügt werden, sonst kommt es zu einem ?SYNTAX ERROR.

    Mit POKEs auf die Adressen 646, 36878 und 36879 kann man die logischen und physikalischen Farben ändern. Sowohl Hires- als auch Multicolour-Modus werden unterstützt (auch gemischt), und die Attribute im Farb-RAM werden durch die Zeichenbefehle entsprechend behandelt.

  • Ich hatte gerade Lust auf einen kleinen Brain-Twister, daher hier noch mal eine "triviale" Implementierung. Nicht optimiert, aber hoffentlich verständlich ^^.

    Dateien

    ────────────────────────────────────────────────────────────
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    ────────────────────────────────────────────────────────────

  • [...] hier noch mal eine "triviale" Implementierung [...]

    Meine Routine arbeitet ganz ähnlich, allerdings legt sie für jeden horizontalen Spann nur jeweils einen Startpunkt in die Queue. :)

  • Mike: Ich habe mal provisorisch Dein Programm in ein C64 Programm umgewandelt.

    Dazu habe ich Dein @1,x,y durch eine Subroutine in 270 ersetzt und Dein -@(x,y) durch eine Subroutine in 200.

    Der Bildschirmspeicher beim C64 beginnt bei Adresse 1024. Der Zeichencode 42 steht für Stern "*" und der Zeichencode 46 für Punkt ".".

    Funktioniert super. Die Geschwindigkeit ist für meine Zwecke vollkommen ausreichend.

    Vielen herzlichen Dank. Das ist ein tolles Programm. Da wäre ich alleine nie drauf gekommen. :thumbsup:

    Ich werde es in meinen Zeichensatzeditor einbauen. Natürlich nur wenn Du erlaubst.

  • Claus: Auch Dir vielen herzlichen Dank. Du hast Dein Programm sogar schon genau an meine Anforderungen angepasst. Echt spitzenklasse.

    Jetzt weiß ich gar nicht welches von den beiden ich nehmen soll. Ich muß mal die Stoppuhr holen...

    Also:

    Claus => 16 Sekunden

    Mike => 29 Sekunden

    Zur Verteidigung von Mike's Ehre muß ich allerdings dazu sagen, dass ich in seinem Programmcode rumgepopelt habe und seine Pixel-Routinen durch provisorische (und wahrscheinlich schlechte) Unterprogramme ersetzt habe.

    Wie dem auch sei. Vielen vielen Dank an euch beide. Ich bin total begeistert. Heute morgen habe ich noch gedacht, dass das in BASIC gar nicht geht.

  • ach verdammt, hatte inzwischen auch Mikes Code auf Charscreen angepasst:

    Bitte melde dich an, um diesen Anhang zu sehen.

    p.s. Dauer: 20 Sekunden :)

  • Ja, das hat mich auch getriggert. Ich habe einfach den Algorithmus aus Wikipedia direkt konvertiert und war überrascht, wie einfach das ging. Ich bin ja überhaupt nicht in Basic zuhause ^^.

    ────────────────────────────────────────────────────────────
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    ────────────────────────────────────────────────────────────

  • Deine Implementierung ist dann auch mit 19,8 Sekunden dabei. :)

    Dann fasse ich hier nochmal neu zusammen:

    1. Claus ==> 16 Sekunden

    2. Mikes gute C64 Anpassung von Lynx ==> 19,8 Sekunden

    3. Mikes schlechte C64 Anpassung von Omega ==> 29 Sekunden

    Der Pokal :emojiSmiley-146: geht an Claus, dicht gefolgt von Mike. Lynx hat Mikes Fill-Routine den Turbo-Boost verpasst, den sie verdient hat.

    Herzlichen Glückwunsch an alle Teilnehmer. :Peace

  • sieht nach einer neuen BASIC Challenge fürs Forum aus 😂 schnellste Fill Routine finden

  • Mit so einer Füll-Routine hat Aquantor angefangen. Macht was draus! :)

    C64Studio: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- C64Studio WIP: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.