Vektorgrafik für den C64

Es gibt 81 Antworten in diesem Thema, welches 20.069 mal aufgerufen wurde. Der letzte Beitrag (11. Oktober 2022 um 18:38) ist von bbock.

  • Ich habe jetzt auch eine Vektorgrafik beizusteuern. Es war gar nicht so einfach, aus der Flächen-bezogenen Grafik manuell nur die reinen Linien (und ohne doppelte an aneinander-stoßenden Flächen) zu extrahieren. Als VEC und SVG enthalten.

    Wozu musstest du denn die Linien manuell extrahieren? Das macht doch TinySVG für dich. Wie sieht die Original-SVG-Datei vor deiner manuellen Extraktion aus?

    Da ja schon der Java-Konverter die Grafik auf die passende Zielauflösung umrechnet: Was passiert eigentlich, wenn man eine "falsche" VEC-Datei öffnet? Und kann man vorab an irgendwas erkennen, für welche Zielauflösung die Grafik generiert wurde?

    Das VEC-Format war ursprünglich nur für die Schneider Joyce gedacht, und da ist die Auflösung fix 720x256 (mit Pixeln, die doppelt so hoch wie breit sind). Dass das Format jetzt auch für den C64 genutzt wird, ist neu; man kann die Zielauflösung nicht direkt erkennen. Das sollte vielleicht in das noch zu finalisierende erweiterte VEC-Format einfließen. Wenn das Anzeigeprogramm skalieren kann, dann benötigt man diese Information nicht unbedingt.

    Wenn man eine "falsche" VEC-Datei öffnet, dann können verschiedene Dinge passieren, je nachdem, was das Anzeigeprogramm macht. Im schlimmsten Fall könnte es abstürzen; vielleicht zeigt es aber auch nur einen Ausschnitt der Grafik oder eine zu kleine Grafik an.

  • Wozu musstest du denn die Linien manuell extrahieren? Das macht doch TinySVG für dich.

    Zum einen wusste ich nicht, dass der Konverter sowas alles erledigt, zum anderen musste ich erstmal alle Teilflächen entfernen (dachte ich zumindest), die von anderen Flächen verdeckt werden (um dann noch weitere Optimierungen durchzuführen). Sobald Flächen transparent werden, erscheinen doch die verdeckten Flächen dahinter – oder kann der Konverter das alles automatisch herausrechnen? (Ich habe es nicht probiert, weil ich dachte, TinySVG würde einfach nur "stumpf" vorhandene Linien in ein anderes Format umsetzen.)

    Bitte melde dich an, um diesen Link zu sehen. | Meine Lieblings-Themen im Forum64:

    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. | 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. | Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.

  • Kurz mein Gedankengang: Ich hatte befürchtet, dass aus meiner Originalgrafik (mit verdeckten Teilflächen) als Ergebnis "A" herauskommt. Also habe ich die horizontalen Zwischenschritte gemacht, damit ich "B" erhalte. Schritt "1" hätte auch schon gereicht für die Optik, allerdings wären (nach meiner Befürchung) die fett dargestellten Linien doppelt gemalt worden (Performance-Nachteil), deshalb habe ich sie manuell (Schritt "2") entfernt.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Bitte melde dich an, um diesen Link zu sehen. | Meine Lieblings-Themen im Forum64:

    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. | 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. | Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.

  • Ok, jetzt verstehe ich; danke für die anschauliche Erklärung. Deine Vermutung war natürlich richtig: TinySVG kümmert sich nicht um verdeckte Linien. Das Ergebnis wäre also wie in "A" gewesen.

  • Mit dieser Variante läuft der Lehrer Lämpel in der compilierten BASIC V2-Version in 4:46 statt in 8:55.

    Na, das ist doch schon was.

    Aber es stimmt schon, man kann wirklich nicht erwarten, das jeder hier jeden Beitrag liest... :wink:

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

  • Na, das ist doch schon was.

    Komischerweise bringt es in der reinen BASIC-Version (also ohne Compiler) fast nichts. Die läuft nur etwa 40 Sek. schneller, was bei über 25 Minuten Gesamtlaufzeit im Prinzip kein Unterschied ist. Vermutlich ist das Zeichnen hier so viel langsamer, dass andere Verbesserungen nur zu einem ganz geringen Prozentsatz durchschlagen.

    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.

  • Vermutlich ist das Zeichnen hier so viel langsamer, dass andere Verbesserungen nur zu einem ganz geringen Prozentsatz durchschlagen.

    Möglicherweise. Ich würde auch mal die ganzen ST-Abfragen auf das allernötigste reduzieren. Wenn die Datei kaput ist (und das ist sie, wenn der Fehler beim Parametereinlesen auftritt), dann ist es egal, wenn der letzte Punkt nur murks liefert (obwohl, hm, bei Deiner Basic-Implementierung weiß ich nicht, ob da ein Parametergrenzwertcheck dabei ist).

    Normalerweise sollte das Ende der Datei nur nach einem kompletten Befehl kommen. Und selbst wenn Multi-Line crasht ist nach 255 wirren Linien Schluß.

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

  • So, konnte mich nicht zurückhalten. Geht ja nicht an, das es einen VEC-Viewer in Basic 2.0 und TSB gibt aber nicht in Basic 7.0. :wink:

    Ich habe das ganze 1:1 bei Arndt geklaut und für den C128 (ohne weitere Optimierung) umgeschrieben (musste mich erstmal in TSB einlesen). Alle Beispiele, die auf Disk passten, habe ich ebenfalls integriert (auch Retrofans Forum64-Schriftzug). Ich muss das ganze bei Gelegenheit auch nochmal durch einen Compiler jagen. :wink: Aber hier anbei erstmal der aktuelle Stand.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Bitte melde dich an, um diesen Anhang zu sehen.

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

  • Ich habe das ganze 1:1 bei Arndt geklaut und für den C128 (ohne weitere Optimierung) umgeschrieben

    :zustimm:

    Arndt

    GoDot C64 Image Processing
    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.
    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.

  • Geht ja nicht an, das es einen VEC-Viewer in Basic 2.0 und TSB gibt aber nicht in Basic 7.0

    Könnte man das Ganze nicht auch über den VDC in doppelter X-Auflösung rendern lassen, wenn man die X-Koordinaten einfach verdoppelt?

    Bitte melde dich an, um diesen Link zu sehen. | Meine Lieblings-Themen im Forum64:

    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. | 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. | Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.

  • Könnte man das Ganze nicht auch über den VDC in doppelter X-Auflösung rendern lassen, wenn man die X-Koordinaten einfach verdoppelt?

    Können, könnte man schon. Man braucht dann aber eine Grafik-Erweiterung, entweder Bitte melde dich an, um diesen Link zu sehen. oder den Bitte melde dich an, um diesen Link zu sehen. Beide haben eine jeweils etwas andere Syntax. Wäre ja auch zu einfach, wenn da etwas kompatibel wäre. :wink: Selbst (T)SB schießt ja schon bei einfachen Dingen quer und verwendet englisches Englisch und nutzt z.B. colour statt color als Befehl. Wirklich schön wäre eine VDC-Umsetzung aber erst, wenn man die Auflösung variabel gestalten könnte, denn der Graphic Booster bietet ja diverse Auflösungen an. Leider kann man das ganze dann auch nicht compilieren und ohne SuperCPU ist das dann nicht wirklich schnell. Trotzdem werde ich mal darüber nachdenken...

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

  • Ich habe das Vektorformat VEC erweitert, damit man mehr Möglichkeiten offen hält, wie z.B. Scaling. Das neue Format heißt VE2 und hat die Dateiendung .ve2. Es sollte zu VEC abwärtskompatibel sein (wenn ich nichts übersehen habe :) ). VE2 ist kompakter als VEC, indem es Koordinaten mit unterschiedlichen Längen unterstützt. Für den C64 machen 2 Byte für die X- und 1 Byte für die Y-Koordinate Sinn. Im Header sind außerdem Informationen zu den min. / max. Koordinatenwerten, zur Zielauflösung und zu den verwendeten Features zu finden.

    Header: 'V' 'E' '2'

    uint minX minimum of all X coordinates

    uint maxX maximum of all X coordinates

    uint minY minimum of all Y coordinates

    uint maxY maximum of all Y coordinates

    uint targetResolutionX target resolution X

    uint targetResolutionY target resolution Y

    byte bytesXCoord number of bytes used by an x coordinate

    byte bytesYCoord number of bytes used by a y coordinate

    byte profileFlags bit vector where each 1 bit means the corresponding graphic object can be present in the file

    00000000 00000001: Dot

    00000000 00000010: Line

    00000000 00000100: Box

    00000000 00001000: Square

    00000000 00010000: Ellipse

    00000000 00100000: Circle

    00000000 01000000: Multi-Dot

    00000000 10000000: Multi-Line

    00000001 00000000: Polygon-Fill


    Example with bytesXCoord=2, bytesYCoord=2:

    Byte | 0 | 1 2 | 3 4 | 5 6 | 7 8 |

    -----------------------------------------------------------------------

    Dot | 0 | x | y | | |

    Line | 1 | x1 | y1 | x2 | y2 |

    Box | 2 | xleft | ytop | xright | ybottom |

    Square | 3 | xleft | ytop | width | |

    Ellipse | 4 | xcenter | ycenter | xradius | yradius |

    Circle | 5 | xcenter | ycenter | radius | |

    Multi-Dot | 10 |#dots| x1 | y1 | x2 | ... |

    Multi-Line | 11 |#dots| x1 | y1 | x2 | ... |

    Polygon-Fill | 12 |#dots| x1 | y1 | x2 | ... |

    End | 99 | | | | |


    Space consumption:

    ------------------

    Graphic object (Dot, Line, ...): 1 byte

    Dot x: bytesXCoord bytes

    y: bytesYCoord bytes

    Line x1: bytesXCoord bytes

    y1: bytesYCoord bytes

    x2: bytesXCoord bytes

    y2: bytesYCoord bytes

    Box xleft: bytesXCoord bytes

    ytop: bytesYCoord bytes

    xright: bytesXCoord bytes

    ybottom: bytesYCoord bytes

    Square xleft: bytesXCoord bytes

    ytop: bytesYCoord bytes

    width: max(bytesXCoord, bytesYCoord) bytes

    Ellipse xcenter: bytesXCoord bytes

    ycenter: bytesYCoord bytes

    xradius: bytesXCoord bytes

    yradius: bytesYCoord bytes

    Circle xcenter: bytesXCoord bytes

    ycenter: bytesYCoord bytes

    radius: max(bytesXCoord, bytesYCoord) bytes

    Multi-Dot: #dots: 1 byte

    xn: bytesXCoord bytes

    yn: bytesYCoord bytes

    Multi-Line: #dots: 1 byte

    xn: bytesXCoord bytes

    yn: bytesYCoord bytes

    Polygon-Fill: #dots: 1 byte

    xn: bytesXCoord bytes

    yn: bytesYCoord bytes

  • Natürlich habe ich auch das Programm DRAWVECTOR erweitert (Version 2.0), damit es das neue Format darstellen kann. Im angehängten D64-Image sind neben dem Programm auch einige VE2-Dateien enthalten. Besonders test.ve2 ist interessant, weil es alle Grafikelemente (Dot, Line, Box, Square, Ellipse, Circle, Multi-Dot, Multi-Line und Polygon-Fill) enthält. Polygon-Fill zeichnet z.Z. zwar das Polygon, füllt es aber nicht aus. Das ist momentan die einzige Einschränkung.

    Künftig soll es noch möglich sein die Grafik zu skalieren und zu verschieben. Auch eine Drehung der Grafik wäre möglich.

    TinySVG kann bereits VE2-Dateien erzeugen, aber der Code ist noch nicht finalisiert. Wenn es soweit ist, werde ich hier darüber informieren.

  • TinySVG v0.25 mit VE2-Unterstützung ist jetzt verfügbar: Bitte melde dich an, um diesen Link zu sehen.

    Quickstart-Konfiguration für den C64:

    • Optionen > Konfiguration > Zentrieren, Größe anpassen, Bézier-Kurven-Annäherung, Bogen-Annäherung und Linienreduktion aktivieren
    • Voreinstellungen > C64
    • Datei > öffnen > SVG-Datei auswählen. Die erzeugte VE2-Datei befindet sich im selben Verzeichnis wie die SVG-Datei.
  • Gerade habe ich mühsam einen halbwegs lauffähigen Prototyp für einen VEC-Viewer auf dem C128-VDC (640x200) erstellt, schon gibt es ein neues Format... :SX/;)

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

  • Gerade habe ich mühsam einen halbwegs lauffähigen Prototyp für einen VEC-Viewer auf dem C128-VDC (640x200) erstellt, schon gibt es ein neues Format... :SX/;)

    Das "alte" VEC-Format gibt es ja immer noch, und ich habe die VEC-Ausgabe von TinySVG sogar noch optimiert (jetzt wird vorzugsweise MULTI-LINE statt LINE verwendet, was Platz und Zeit spart). Und VE2 als Nachfolger von VEC ist nicht sooo viel komplizierter...

  • Man beachte den letzte Smiley: :wink:

    Ich habe aber mit der Formatbeschreibung noch ein Problem. Was ist denn "uint" in diesem Fall? unsigned integer, ja is klar, aber ist das dann immer ein zwei Byte-Wert? Könnten ja auch ein oder drei bytes sein, wenn das Format universeller ausgebaut ist, da Du das ja (für mich unnötig da ein Byte zu sparen) bei den X,Y-Koordinaten flexibel einstellst. Eigentlich verkompliziert es (die Flexibilität bei X,Y) nur die Leseroutine, da hier verscheidene Fälle programmtechnisch unterschieden werden müssen.

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

  • uint ist ein 2-Byte little endian integer. Die Header-Felder für bytesXCoord / bytesYCoord sind nur ein Byte lang (Datentyp byte). In der Praxis werden hier nur die Werte 1 oder 2 vorkommen - zumindest für die 8-Bitter. Wenn beim C64 für die Y-Koordinate nur ein statt zwei Bytes belegt werden müssen, dann bringt das ca. 25% Ersparnis in der Dateigröße und damit auch in der Darstellungsgeschwindigkeit. Ich denke, die kleine Komplexitätserhöhung bei der Leseroutine lässt sich dafür verschmerzen.

  • das Interesse scheint etwas abgeflaut zu sein

    Nein, nicht wirklich. Mich würde z.B. interessieren, wie dein Konverter arbeitet. Lässt du zuerst einen LaPlace-Filter drüberlaufen und scannst dann die verbleibenden Linien? Oder wie gehst du vor?

    Arndt

    GoDot C64 Image Processing
    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.
    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.