Von allen Seiten betrachtet
Um dreidimensionale Körper von allen Seiten betrachten zu können, benötigen Sie den C 64, Simons Basic, einen Drucker und dieses Programm.
Das Programm soll einmal dreidimensionale Körper auf dem Bildschirm darstellen und zum anderen die hervorragende Grafikfähigkeit des C 64 demonstrieren.
Bei der Darstellungsart entschied ich mich für die normale Axonometrie. Sie ist einerseits leicht in eine für den C 64 verständliche Syntax zu packen und weist zum anderen einen räumlichen Effekt auf.
So entstand dann bald die erste Version von »Simons-Axo«. Allerdings war ich mit dieser Version noch nicht zufrieden. So tüftelte ich noch einige Routinen aus, die dem Programm erst den richtigen Schliff geben.
Nun fügten sich an die einfache Zeichenroutine noch weitere, die das Abspeichern der Körperdaten als sequentielle Datei auf Diskette, das Drehen des Körpers um die drei Koordinatenachsen (in beliebiger Variation), das Verschieben des Körpers, das Einzeichnen der Koordinatenachsen mit ihren Bezeichnungen und das Ausdrucken des Hires-Bildschirmes auf einen angeschlossenen Drucker ermöglichen.
Das Programm beginnt in der Zeile 10, wo der Bildschirm gelöscht und ebenso wie der Rahmen auf schwarz gesetzt wird. In den folgenden Zeilen gibt das Programm eine kurze Anleitung und wartet mit der Fortführung in Zeile 95, bis Sie eine beliebige Taste gedrückt haben.
In der Zeile 100 werden die Felder PT (Eckpunktkoordinaten, mit denen laufend gearbeitet wird) und PA (Eckpunktkoordinaten des Ausgangszustandes) mit 100,3 dimensioniert. Das bedeutet, daß Sie Körper mit bis zu 100 Eckpunkten eingeben können. Das Array ZP, ebenfalls mit 100 dimensioniert, gibt die Verbindungsvorschrift (Reihenfolge, in der die Punkte miteinander verbunden werden) an.
In Zeile 105—120 erfolgt eine Abfrage, ob die Körperdaten von der Diskette eingelesen werden sollen (Einleseroutine ab 1000) oder, ob Sie diese »von Hand« eingeben wollen. Sie können hier mit ’J’ oder ’N’ antworten, jede andere Antwort wird ignoriert.
Ab Zeile 125 steht die eigentliche Eingaberoutine, in der Sie mittels INPUT um die einzelnen Eckpunktkoordinaten gebeten werden. Diese werden den Feldern PT und PA zugeordnet. In dieser Eingabeschleife fungierten PX, PY und PZ als Zwischenvariablen und A als Zähler. Die Eingabe können Sie jeweils mit »Ende« abschließen. Hierbei empfiehlt es sich, den oben genannten Term einzufügen, da das Programm ja drei Variablen verlangt und sonst nur noch nachfragt, bis es alle drei hat. Mit »£« können Sie die vorige Eckpunkteingabe nocheinmal korrigieren (deswegen habe ich PX$ anstelle von PX verwendet).
Von 200 bis 270 wird die Verbindungsvorschrift eingelesen. Hier geben Sie zuerst den Startpunkt ein und dann jeweils einen weiteren Eckpunkt. Die Nummern dieser Eckpunkte werden nacheinander in ZP(B) abgelegt. In der Zeichenroutine werden die Eckpunkte dann in dieser Reihenfolge durch Linien verbunden, wodurch der Körper gezeichnet wird. Auch hier können Sie mit der »£«-Taste Korrekturen ausführen. In dieser Schleife dient B als Zähler und A$ als Zwischenspeicher. A1 enthält die Nummer des zuvor eingegebenen Eckpunktes (für die Korrektur notwendig).
In 300 bis 360 können Sie das Koordinatenkreuz festlegen, indem Sie die Winkel zwischen der z- und y-Achse (AL) und z- und x-Achse (BT) eingeben. Das Programm ist für jeweils 120° voreingestellt, Sie können diese Vorschläge aber einfach überschreiben.
ACHTUNG: Sie wählen hier die Winkel zwischen den projezierten Koordinatenachsen. Die Winkel zwischen den realen Achsen im Raum sind natürlich immer je 90°!
Durch geeignete Wahl dieser Winkel können Sie den Sichtwinkel, unter dem Sie den dargestellten Körper betrachten, ändern. Sind beide Winkel 90°, so blicken Sie frontal von vorne auf den Körper, sind beide kleiner als 90°, so sehen Sie von unten her auf Körper und bei Winkeln über 90° von oben her.
Die nächsten Zeilen, von 400 bis 490 stellen die Zeichenroutine dar. Hier wird zunächst in Zeile 405 in den Hires-Modus umgeschaltet und die Zeichenfarbe grün bei schwarzem Hintergrund gewählt. In 410 bis 420 werden die Zeichenkoordinaten (zweidimensional) des Anfangspunktes, welcher durch ZP 0 gegeben ist, errechnet und in XA und YA abgelegt. In der nachfolgenden Schleife werden nach dem gleichen Schema die Endpunktkoordinaten für den LlNE-Befehl des Simons Basic berechnet und die Linie gezeichnet. In Zeile 450 wird der Endpunkt nun zum Anfangspunkt für die nächste Linie definiert. Die Variable B dient hier als Zähler, während A als Index verwendet wird. Wenn alle Punkte miteinander verbunden sind, so wie es die Verbindungsvorschrift ZP(B) angibt, wird die Schleife beendet und das Programm prüft, ob das Flag für das Einzeichnen der Koordinatenachsen, KO auf 1 (zeichnen) gesetzt ist. Ist dies der Fall, so wird nach 1410 verzweigt.
In 480 und 485 wird in der linken oberen Ecke die Fertig-Meldung ausgegeben und in die Endlosschleife in 490 gesprungen, die nach Drücken der F1-Taste beziehungsweise RETURN verlassen wird.
Nun sind wir im Hauptmenü, welches uns zehn Möglichkeiten bietet. Die Abfrage erfogt in 585 mittels GET. In 590 steht die Sprungtabelle auf die einzelnen Routinen. Wenn Sie 0 eingegeben haben, wird das Programm nun in 595 abgebrochen. Mit GOTO XXXX oder CONT können Sie wieder einsteigen, ohne daß Sie die Daten verlieren.
In den Zeilen 600 bis 790 steht nun die Routine, die erlaubt, die erstellte Figur in beliebiger Variation um die Koordinatenachsen zu drehen. Doch zuerst gelangen Sie wieder in ein Menü, in dem Sie die momentane Drehung auswählen müssen. Der Drehwinkel ist in Grad einzugeben. Ist dieser positiv, wird die Figur gegen den Uhrzeigersinn um die gewählte Achse gedreht. Bei einem negativen Winkel erfolgt die Drehung im Uhrzeigersinn. Die Drehroutine ist in drei Abschitte unterteilt, je nach Drehachse, wobei alle drei mit den Polarkoordinaten arbeiten. Diese werden in den Zeilen 660 bis 670, 710 bis 720 sowie 760 und 766 berechnet. EO ist der Winkel und R der Radius. Zu EO wird nun einfach der Drehwinkel addiert und die neuen kartesischen Koordinaten berechnet. In diesen Schleifen dient X als Zähler, während EP die Anzahl der Eckpunkte angibt. In Zeile 790 wird wieder auf die Grafik zurückgeschaltet und in die Zeichenroutine nach 400 gesprungen. Nun kann man am Bildschirm wieder das Entstehen des Körpers in gedrehter Lage beobachten.
Die kurze Ausgangszustand-Routine in 800 bis 850 kopiert einfach die Anfangsdaten der Eckpunkte, die ja im PA-Feld festgehalten sind, in das Arbeitsfeld PT. Hier dienen X und Y wieder als Zähler. Danach wird die Zeichenroutine aufgerufen.
In den Zeilen 1000 bis 1097 steht die Einleseroutine, die die Körperdaten (Eckpunkte und Verbindungsvorschrift) von der Diskette, wo sie als sequentielle Datei stehen müssen, einliest und sie den entsprechenden Feldern zuordnet. Dem abgefragten Dateinamen, der auch den Joker enthalten kann, wird gleich »,S,R« angehängt und dann die Datei geöffnet, nachdem der Fehlerkanal geöffnet wurde (1010). Nun werden EP (Anzahl der Eckpunkte) und SP (letzte Nummer der Verbindungsvorschrift), die beiden wichtigen Steuervariablen, eingelesen. Danach werden zunächst die Felder PT und PA gefüllt und schließlich noch die Verbindungsvorschrift eingelesen und dem ZP-Feld zugeordnet. Zwischendurch wird in die Fehlerkanalroutine verzweigt, die sich in den Zeilen 1250 bis 1290 befindet und das Programm stoppt, wenn es zu einem Diskettenfehler kommt. Dann wird die komplette Fehlermeldung, die in den Variablen F1, F1$, F2 und F3 festgehalten ist, ausgegeben. Nun hat man die Möglichkeit (meistens, wenn man den Dateinamen falsch eingegeben hat) in die Zeile, in der der Fehler entstanden ist, zurückzukehren, indem man mit RETURN bestätigt, oder das Programm abzubrechen, indem man die SPACE-Taste betätigt.
Ab Zeile 1100 finden Sie die Schreibroutine. Diese funktioniert im wesentlichen genauso wie die Einleseroutine mit dem Unterschied, daß die momentanen Körperdaten auf Diskette gespeichert werden.
Ab Zeile 1300 bis 1360 befindet sich die Verschieberoutine, die das Verschieben der erstellten Figur um einen Vektor, der in Zeile 1320 abgefragt wird (wieder mit drei Koordinaten) ermöglicht. Mit dieser und der Drehroutine ist es möglich, einen Körper zuerst in einer einfachen Lage zu erstellen und dann in eine komplizierte Lage zu drehen und zu schieben. Nach der Neuberechnung des PT-Felder wird wieder zur Zeichenroutine verzweigt.
Das Zeichnen der Koordinatenachsen, ab Zeile 1400 stellt die vorletzte Routine dar. In Zeile 1405 wird zunächst getestet, ob das Flag KO schon auf 1 gesetzt ist. Ist dies der Fall, so werden die bereits gezeichneten Achsen gelöscht, indem der Zeichentypusvariable TY der Wert Null zugeordnet wird. War KO jedoch Null, so werden beide auf 1 gesetzt, als Zeichen dafür, daß die Achsen gezeichnet werden sollen. In den nächsten Zeilen werden den Variablen XS und YS die Endpunkte der Koordinatenachsen übergeben, während X1 und Y1 die Koordinaten zur Ausgabe der Bezeichnungen mit dem CHAR-Befehl darstellen. Es werden nun die Achsen nacheinander berechnet und dann gezeichnet und bezeichnet. Anschließend wird wieder auf den Grafikbildschirm umgeschaltet und nach 480 verzweigt, wo die Fertig-Meldung wieder ausgegeben wird.
In den Zeilen 1500 bis 1535 steht die letzte und gleichzeitig die einfachste Routine, das Ausgeben des Bildschirminhaltes auf einen angeschlossenen Drucker mit dem COPY-Befehl.
Vor der Hardcopy wird jedoch D$ mit »HARDCOPY« Meldung ausgegeben. Wer diese Meldung als störend empfindet, da sie auch auf dem Drucker ausgegeben wird, kann sie auch weglassen, indem er einfach die Zeilen 1515 und 1510 wegläßt. Ist die Hardcopy fertig, wird wieder nach 480 verzweigt und die Fertig-Meldung ausgegeben.
(Peter Steger/rg)