Hallo Besucher, der Thread wurde 6,4k mal aufgerufen und enthält 24 Antworten

letzter Beitrag von Hexworx am

Grafik von "drüben" (DDR)

  • Wie bereits im Basic-Würfelthread angekündigt, kommt hier der Thread zu den Grafikprogrammen aus dem Buch "Spiel + Spass mit dem Computer". Die zweite Auflage erschien 1989 im Urania Verlag, iSBN ist 3-332-00118-2


    Inhaltlich dreht es sich um die verschiedenen privaten Einsatzmöglichkeiten des Computers: einfache Spiele (sowohl Geschicklichkeit, Labyrinth, "Denkspiele"), Grafikspielereien und was sonst so anfällt - Tippprogramm für Lottozahlen, Expertenprogramm bei Fahrzeugproblemen, Testbildgeneratoren.


    Als kleinen Vorgeschmack schon mal ein Scan aus dem Buchanfang, er lässt sowohl das Niveau der Programme gut erahnen und sagt auch schon etwas zu den technischen Randbedingungen des Zielsystems. Der KC85/3 hatte nämlich ne Auflösung von 320x256 Bildpunkten - was man beim Portieren mit im Hinterkopf behalten muss. Und nebenbei lässt der Autor noch paar Zahlen für's Benchmarking gucken ;)


    Die späteren Listings werde ich abtippen...

  • Ich hab' mal die Kreisroutine 1:1 auf dem x128 laufen lassen (Zentrum Y-Achse angepasst):

    Code
    1. 5 graphic1,1
    2. 10 ti$="000000"
    3. 20 fori=0.01to2*.step.01:draw1,160+80*cos(i),100+80*sin(i):nexti
    4. 30 print ti,ti$
    5. 50 graphic0

    Ergebnis:
    3170 000052


    Also 52 Sekunden, damit 7 Sekunden langsamer als der KC (wenn die Werte im Buch stimmen)

  • Bevor es an das 3D-Programm geht, noch eine kleine grafische Spielerei aus dem Buch: n-Ecke.


    Ich hab' zusätzlich zum Listing auch nochmal die Seiten mit den Screenshots eingescannt - sonst fragt man sich, was die komisch zerstückelten Printbefehle am Anfang sollen (frage ich mich dennoch an der einen oder anderen Stelle).


    Was mich interessiert: mit dem Basic von Commodore hat das je recht wenig zu tun. Wie sieht's aber mit dem CPC aus - gibt es da Ähnlichkeiten?


  • Ja, das ist wohl die grundlegendste Methode, um einen Kreis auf den Bildschirm zu bringen. Gleichwohl gibt's da ein paar kleine Details, die man beachten sollte.


    Ich hab' darum das Programm nochmal aufgedröselt. Ihr seht mir bitte nach, daß ich erneut auf GBASIC zurückgreife, aber hier soll es ja nicht darum gehen, wie man überhaupt Grafik auf den Bildschirm bringt, sondern wie's weitergeht, wenn man es kann:

    SIN() und COS() arbeiten auch auf dem C64 im Bogenmaß, d.h. ein Vollwinkel entspricht 2pi. Die Schrittweite für die Winkel sollte man mit 1/R wählen. Hier spielt unter anderem die Rolle, daß für kleine Winkel SIN(x) ~= x gilt. Damit läuft die Kreiszeichnung gerade an den waagerechten und senkrechten Tangenten am Kreis sehr günstig mit 1 Pixel/Schritt, es werden also immer genau richtig viele Punkte gezeichnet. Wählt man die Winkeländerung statt 1/R größer, so bleiben Lücken, wählt man sie kleiner, so werden unnötig mehr Punkte gezeichnet.


    In Zeile 17 wird R*SIN(I) abgezogen. Ich trage damit dem linkshändigen Koordinatensystem Rechnung. Unbedingt nötig ist es hier allerdings nicht, da der Kreis ja symmetrisch ist. Mit der Addition von 0.5 und INT() rundet das Programm dann auf die nächste ganzzahlige Pixelkoordinate.


    Korrekterweise gehören vor dem DRAW-Befehl noch Abfragen, ob die berechneten X- und Y-Koordinaten im Bereich sind.


    Das ist natürlich nicht die einzige Methode, um (auch in BASIC) einen Kreis auf den Bildschirm zu bringen. ;)

  • Danke für den Hinweis zur optimalen Schrittweite...


    Kreise und KC85/x, wobei x>1 ;) Der folgende Kreiszeichner zeigt/illustriert wie Kreise am KC gezeichnet werden (dort via Circle-Befehl deutlich flotter) - dazu bedarf es gerade mal der Werte für einen achtel Kreis (und ich frage mich, ob diese Art der Kreiszeichnung ein Alleinstellungsmerkmal des KCs ist, oder sich noch bei nem anderen 8Bitter wiederfindet). Ist Basic V7.0, aber 3.5 müsste auch gehen:

  • Das ist durchaus eine gängige Optimierung, wenn die Grafik-Hardware quadratische Pixel hat. Man kann aber noch einen draufsetzen, und anstelle von SIN/COS den Pythagoras hernehmen. Dann werden sogar nur noch die "allernötigsten" Pixel gezeichnet, und speziell in den 45°-Winkeln kommt es nicht mehr zu den flackrigen Ausbeulungen:


    Im Anhang ist das als "KREIS 2" drin.


    Als nächstes wär' dann wohl Bresenham dran. ;)

  • Wieso nicht, wenn man schon mal dabei ist... als Basis hab ich Mikes Routine genommen und den Bresenham aus Wikipedia (Listing in C) reingebastelt... Bin beim Umstellen der While-Schleife nach For prompt in die Falle reingetreten, das der Zielbereich nur einmal festgelegt wird und danach steht, deshalb hier die For-Schleife mit nachfolgender Abbruchbedingung.


    Und in einer ruhigen Minute werde ich versuchen, dass zu verstehen ;)


    Nachtrag: Zeilen 25 und 26 vereinfacht+in Anhang nachgezogen

  • Hier das Projektionsprogramm aus dem Buch - 3 verschiedene vordefinierte Objekte, 1 selbst definierbares Objekt, 4 verschiedene Darstellungsarten. Bin schon dabei, das nach Commodore Basic zu portieren, größtes Manko: die fehlenden 55 Pixel in y-Richtung

  • Ah, schöne Sache.


    Eigentlich reichen die X,Y,Z-Koordinaten in den DATA-Zeilen aus, um da was mit anzustellen.


    Die Auflösung ist eigentlich fast egal - im Zweifelsfall parametriert man die ganz am Anfang des Programms.


    Also, lassen wir da mal das Fett raus. Bis später. ;)



    Edit: also, so viel hab' ich schon mal raus: die X,Y-Ebene ist die Horizontebene, die Z-Achse zeigt nach oben, X nach links, Y nach hinten.

  • Läuft. :)


    Ich habe mal als erstes das "Gebäude" umgesetzt. Hier zunächst die Version für den VC-20 - die startet automatisch von dem *.d64, wenn man es mit mind. +8K Erweiterung auf das VICE-Window wirft:


    Die Eingaben sind mit Vorgaben versehen, zur Erklärung:


    - Augenhöhe ist die Höhe des Beobachters. Im gleichen Maße wird das Objekt nach unten gesenkt (Zeilen 30-32). Hier hat der Wert 90 den Effekt, daß sich der Beobachter jetzt auf Dachhöhe befindet.


    - Azimut ist der Winkel in Horizontebene Richtung Beobachter. Die Vorgabe setzt ihn um 60° nach links - im Gegenzug wird das Objekt dazu um 60° nach rechts gedreht (Zeilen 33-35).


    - Polarwinkel ist die nachfolgende Verkippung um die horizontale Achse. Durch den Wert -30° schaut der Beobachter von leicht schräg oben auf das Objekt.


    - Entfernung ist dann eben der Abstand des Beobachters vom Ursprung des Objekts nachdem alle vorherigen Transformationen angewendet wurden.


    Man schaut von vorne wohl auf einen Schornstein oder ein Treppenhaus, "hinten" ragt vlt. eine Hundehütte heraus:


    vc20.png


    Zur Anpassung an verschiedene Bildschirmauflösungen und Pixel-Aspekt-Verhältnis kann man die Zeilen 10 und 11 anpassen. XS und YS stehen für die tatsächlich Auflösung in Pixeln. XB und YB sind etwas spezieller: ihr Verhältnis soll das Breite- (XB) zu Höhe- (YB) Verhältnis des sichtbaren Bildschirms wiederspiegeln. Da beim VC-20 (160x192) die Pixel etwas breiter als hoch sind, kommt bei der Division von Bildbreite durch -höhe etwa der Wert 1,389 heraus. PRINT .8/.576 liefert diesen Wert auch.


    Auf dem Diskimage befindet sich auch "CAD4A", welches ab BASIC 3.5 läuft. Unter Annahme von quadratischen Pixeln hab' ich dort XB=.96 und YB=.6 (mit XS=320 und YS=200) gesetzt. Hier die Ausgabe auf dem C128:


  • Ich vermute, die Hundehütte ist der Eingang und das andere das Treppenhaus oder eine Reihe Balkone. Jaja, der Fantasie sind keine Grenzen gesetzt :D


    Anbei meine quick'n'(very)dirty-1:1 Conversion zum c128... hat noch viele Ecken, Kanten und Überflüssiges (deshalb auch nicht als Listing). Offenbar gibt's selbst beim V7 noch keinen Befehl für Text auf Hires-Bildschirm - oder ich hab' ihn noch nicht gefunden (gibt es wirklich keinen????). Dunkel hab' ich in Erinnerung, dass ich früher Text im Graphicmodus ausgegeben hatte , könnte aber auch bei Simons Basic gewesen sein.


    Größte Hürde aktuell: nach dem Zeichnen der Grafik kommt ein Inputbefehl, ob die aktuelle Grafik weiterbearbeitet werden soll - der wird nicht angezeigt. Also ist blind entweder j oder n einzugeben.

  • Zitat von Eloy_Dorian

    Nur aus Interesse: beim VC-20 Listing sind die Befehle @ON aber nicht aus dem Basic v2 Befehlssatz.

    Das ist die von mir geschriebene BASIC-Erweiterung MINIGRAFIK. Die ist auf dem Diskimage mit dabei, zusammen mit einem Boot-Loader, der die Erweiterung lädt und initialisiert und dann direkt zum Nutzprogramm "durchstartet".


    Zitat von Tale-X

    Offenbar gibt's selbst beim V7 noch keinen Befehl für Text auf Hires-Bildschirm - oder ich hab' ihn noch nicht gefunden (gibt es wirklich keinen????).

    CHAR kann das. :)

  • Beim ersten Anlauf hatte Char irgendwie Murks auf dem Grafikbildschirm gezeichnet...


    Das Programm habe ich jetzt halbwegs umgemodelt wobei ich den Bereich für selbstentworfene Modelle noch nicht getestet habe. Ich bin nur bei dem Umgang mit den Modelldaten unschlüssig, da sie zum Teil in der vertikalen Dimension einen Tick zu groß sind. Hab keine Lust die Data-Werte umzurechnen (zumal die anderen Werte dann krumm werden) und beim Vergrößerungsfaktor von 1 intern ne Verkleinerung durchzuführen ist auch irgendwie falsch. Und ich merke an einigen Ecken, dass die Benutzerführung noch Feinschliff verträgt -z. B. fehlt im ersten Menü der Punkt "Beenden" und die Auswertung der Ja/Nein-Abfragen ist abenteuerlich (mal wird auf j geprüft, mal auf n, aber nie auf beides).


    Ach ja, ein Abtippfehler hatte sich bei mir eingeschlichen, der in der Zentralprojektion für verkorkste Darstellung sorgt. Hier die Korrektur (ich hatte versehentlich X4 statt X5 geschrieben):

    Code
    1. 1050 LET Y6=Y5*COS(BZ)-X5*SIN(BZ)


    Und hier nun das Programm für Commodore Basic. Die Fragezeichen bei Input nerven...: