Kurs: Streifzüge durch die Grafikwelt
C 64
Grafikwelt

Streifzüge durch die Grafikwelt (Teil 2)

Grafik mit dem C 64, dem C 128 oder einem anderen Computer. Auf Bildschirm, Drucker oder Plotter. Unser Grafik-System nimmt Formen an.

Die in dieser und den kommenden Folgen gezeigten Programme sollen möglichst weitgehend unabhängig sein von der Art des verwendeten Grafik-Systems. 0b Sie also einen Commodore 64 mit HiRes-3 oder GBasic (oder…) benutzen und die Ausgabe auf dem Bildschirm, dem Drucker oder einem Plotter stattfinden lassen, ob Sie zu den Glücklichen gehören, die schon einen Commodore C 128 vor sich stehen haben… all das soll möglichst weitgehend erfaßt sein. Nicht immer — gestehe ich ganz freimütig — läßt sich so eine Allgemeingültigkeit erreichen. Besonders in dieser Folge werden die drei größeren Programme noch spezialisiert sein. Die kleineren aber — die fürs Auge — sollen diese Anforderungen schon erfüllen.

Dazu werde ich allgemein verständliche Befehlsworte verwenden (wie zum Beispiel LINIE oder PUNKT etc.) und deren Entsprechung in zwei Grafik-Systemen angeben: In HiRes-3-Syntax und in der Syntax, die mit dem Plotter 1520 verwendet wird. Falls Sie ein anderes System benutzen oder einen C 128 Ihr eigen nennen, dürfte es Ihnen nicht schwerfallen, die Syntax-Anpassungen vorzunehmen. Folgende zehn Befehle sollen zunächst vorgestellt werden (wobei sich später noch der eine oder andere zusätzliche Befehl als nötig herausstellen kann):

INIT

Werde ich immer dann verwenden, wenn die Grafik initialisiert werden soll. Damit wird die Grafik eingeschaltet, eine eventuell Bit-Map eingerichtet und gelöscht und die Farbgebung bestimmt.

START

Soll das Grafiksystem in einen definierten Ausgangszustand bringen.

MITTE

Legt den Koordinatenursprung in die Bildmitte.

PUNKT(X,Y)

Setzt einen Punkt an die Stelle X,Y.

LINIE(XA,YA,XB,YB)

Zieht eine Linie vom Ausgangspunkt XA,YA zum Endpunkt XB,YB.

KREIS(XM,YM,RX,RY)

Zeichnet eine Ellipse (RX ungleich RY) oder einen Kreis (RX = RY) um den Mittelpunkt XM, YM mit den Radien RX und RY.

TEXT(A$,XT,YT)

Schreibt den Text A$ ab der Bildstelle XT,YT.

SHOW

Ein erstelltes Bild wird gezeigt.

NORMAL

Schaltet den Grafik-Modus ab.

GRESET

Führt einen Grafik-System-Reset aus. Danach muß für erneute Benutzung der Grafik wieder neu initialisiert werden.

In der Tabelle 1 sind diese allgemeinen Befehle aufgeführt zusammen mit den Übersetzungen in die Syntax von HiRes-3 und die des Plotters 1520:

Wort HIRES-3-Syntax Plotter-Syntax
INIT POKE53280,0 (Rahmen schwarz)
SYS37498 (HIRES anschalten)
HFL,6,12 (blau auf grau)
OPEN1,6,1 (Plot X,Y)
OPEN2,6,2 (Stiftfarbe)
PRINT #2,0 (schwarz)
CLOSE2
PRINT #1,"M";0,-200
START TRS,0,320,0,200
legt Ursprung nach links unten
x von 0 bis 320
y von 0 bis 200
PRINT #1,"I"
Papiervorschub um 200 Einheiten. Dort auch Koordinatenursprung.
MITTE TRS,-160,160,-100,100
Ursprung in Bildschirmmitte
PRINT #1,"R";240,0
PRINT #1,"I"
Ursprung in Papiermitte.
PUNKT(X,Y) TPK,X,Y PRINT #1,"R";X,Y
PRINT #1,"J";X+2,Y+2
PRINT #1,"R";X,Y
etwas ungenau, weil einzelner Punkt nicht sichtbar. Deshalb sehr kleiner Strich.
LINIE(XA,YA,XB,YB) TLN,XA,YA,XB,YB PRINT #1,"R";XA,YA
PRINT #1,"J";XB,YB
KREIS(XM,YM,RX,RY) TKR,XM,YM,RX,RY,2*Pi Hier braucht man ein kleines Programm:
M=50:D=360*π/(M*180)
DIMT(M):T(0)=2*π
FORI=1TOM:T(I)=T(I-1)+D
PRINT #1,"R";RX*COS(T(I-1))+XM,RY*SIN(T(I-1))+YM
PRINT #1,"J";RX*COS(T(I))+XM,RY*SIN(T(I))+YM
NEXTI
TEXT(A$,XT,YT) TEX,A$,XT,YT OPEN4,6:PRINT #1,"R";XT,YT
PRINT #4,A$:CLOSE4
PRINT #1,"M";240,YT
PRINT #1,"I"
SHOW HAN PRINT #1,"R";0,-200
Papiervorschub um 200 Einheiten
NORMAL HOF CLOSE1
GRESES LOE:AUS OPEN7,6,7:PRINT #7:CLOSE7
Tabelle 1. Die grundlegenden allgemeinen Grafik-Befehle und ihre Übersetzung in HiRes-3- oder Plotter-Syntax

Sehen wir uns das nun an zwei netten Beispielen an. Als erstes das Programm »verschlungene Spiralen«, welches (siehe Bilder 1a, 1b) mehrere Spiralen (nämlich N), die mit einem Startwinkel W aus dem Zentrum heraustreten, zu einer Scheibe mit dem Radius R anordnet.

Bild 1a. Verschlungene Spiralen mH HiRes-3
Bild 1b. Dasselbe mit dem Plotter 1520

Das Programm »Spiralen« (Listing 1) verwendet die allgemeinen Grafik-Befehle. Dieses Listing kann jedoch nicht auf dem C 64 laufen. Aber je nachdem, welchen Computer Sie verwenden, oder welche Basic-Erweiterung, können Sie deren Befehle hier einsetzen. Listing 2 und Listing 3 geben zwei Beispiele.

Probieren Sie nun mal aus — unter Zuhilfenahme der Tabelle 1 — anstelle der allgemeinen Befehle die HiRes-3-Syntax einzusetzen. Dabei sollte dann etwas Ähnliches herauskommen wie Listing 2, HiRes-Spiralen:

Unter Verwendung der Plotter-Syntax entsteht das Programm Plotter-Spiralen (Listing 3).

Sollten Sie ein anderes Grafik-System benutzen, können Sie solch ein Programm auf ähnlich simple Weise übersetzen.

Als zweites Beispiel soll das Programm »Fensterrose« dienen (der Name rührt daher, daß das Ergebnis aussieht, wie die Fensterrosen in alten gotischen Kirchen). Auch hier biete ich Ihnen drei Versionen: »Fensterrose« ist das mit den allgemeinen Grafik-Befehlen (Listing 4), HiRes-Fensterrose ist die HiRes-3-Fassung (Listing 5) und »Plotter-Fensterrose« schließlich die Plotter-Version (Listing 6).

Die Ergebnisse finden Sie als Bilder 2a und 2b:

Bild 2a. Der Matrixdrucker gibt es nur undeutlich wieder: Fensterrose mittels HiRes-3
Bild 2b. Von bestechender Schönheit: Die Fensterrose mit dem Plotter gezeichnet

Die Fensterrose-Programme fragen nach der Anzahl der Stützpunkte auf dem Kreisumfang, dann nach dem gewünschten Radius und schließlich noch nach dem Ort, an den der Text gedruckt werden soll. Wie Sie feststellen werden, ist Fensterrose sehr vielseitig, und auf dem Bildschirm lassen sich in der HiRes-Version Moiree-Muster erzeugen.

1. Eine »Business-Anwendung«

Eines der Themen, auf die wir in den nächsten Folgen zu sprechen kommen werden, ist die sogenannte Präsentationsgrafik, die häufig im kaufmännischen Bereich Verwendung findet. Darunter versteht man zum Beispiel Balkendiagramme oder die vielgeliebten Tortendiagramme. Das hier gezeigte Beispiel arbeitet mit HiRes-3 und unter Umständen einem Drucker. Es bedient sich eines sogenannten Abweichungs-Balkendiagrammes. Von maximal 50 eingegebenen Werten (Umsatzziffern, Gewinne, etc.) stellt es den Mittelwert als horizontale Linie dar und daran dann die positiven oder negativen Abweichungen der einzelnen Eingabebeträge. Außerdem gibt das Programm Auskunft über den Zahlenwert des Mittels und die maximalen Abweichungen. Ein Beispiel für solch ein Diagramm sehen Sie in Bild 3:

Bild 3. Das Abweichungs-Balken-Diagramm

Das Programm »Abweichungen« (Listing 7) erfragt zunächst die Anzahl der Werte, dann jeden Einzelwert. Es ist leicht zu ändern, so daß es die Werte auch von der Diskette oder Kassette nehmen kann. Am Ende der grafischen Darstellung können Sie durch »D« einen Ausdruck auf dem Drucker 1526 (oder kompatible) erzielen, durch »N« eine neue Eingabe starten oder durch »E« das Programm beenden.

2. Ein Plotter-Programm

Grafik und Mathematik sind nicht voneinander zu trennen. Eine häufige Anwendung ist die Untersuchung von 2D-Funktionen durch die grafische Darstellung. Die Zeiten der mühselig berechneten Wertetabellen und der Kurvendiskussion sind zwar noch nicht ganz vorbei (es gibt halt doch noch einige exotische Funktionen, die dem Computer widerstehen), für die weitaus meisten Anwendungen ist aber das hier vorgestellte Programm »Funktionenplot« (Listing 8) leistungsfähig genug. Es bedarf dazu eines Plotters 1520. Zunächst wird vorgestellt, welche Funktion sich derzeit im Programm befindet. Man hat nun die Möglichkeit, eine neue Funktion einzuspeisen. Danach bestimmt man selbst, wie das Koordinatensystem aussehen soll (bei einer Ausdehnung von mehr als 25 Einheiten in X-Richtung wird keine Skalierung mehr vorgenommen) und man bestimmt, in welchem Teil des Systems die Funktion darzustellen ist. Ein Beispiel für die entstehenden Plots zeigt Bild 4.

Bild 4. Ein Beispiel zur Arbeit des Plotter-Programmes zur Darstellung von Funktionen

Es gibt noch eine Menge Raffinessen, die in diesem Beispielprogramm fehlen. Aber die Untersuchung von Funktionen wird uns ebenfalls eine der kommenden Grafik-Folgen beschäftigen. Dort sollen dann auch alle Feinheiten zur Sprache kommen.

3. Ein 3D-Programm

Das letzte Beispielprogramm ist die HiRes-3-Version unseres 3D-Funktionenprogrammes aus den früheren Folgen. Dort war es — weil es in Basic geschrieben war — schon eine arge Geduldprobe, auf ein komplettes Bild zu warten. Nun geht es etwas schneller. Dafür finden wir allerdings eine Möglichkeit vorerst nicht mehr vor: Die verdeckten Linien werden nicht mehr ausgeblendet. Die Ursache dafür ist die Verwendung des FUNKT-Befehles aus Hi-Res-3. In späteren Grafik-Folgen wird uns aber die 3D-Programmierung noch eine Weile fesseln und dort sollen dann auch die »hidden line«- und »hidden surface«-Programmtechniken behandelt werden.

Auch hier wird Ihnen zu Beginn die im Programm gerade enthaltene 3D-Funktion gezeigt und Sie haben die Möglichkeit, statt dessen eine andere einzusetzen. Dann werden Eingaben zum Koordinatensystem verlangt:

Die maximal und minimal zulässigen Werte für die Z-Achse sind bestimmt durch die Bildschirmdarstellung und die Angaben für die beiden anderen Achsen. Sie werden vor der Z-Werte-Eingabe ausgedruckt. Danach hat man die Möglichkeit, Parameter für die Zeichnung der 3D-Funktion einzugeben. Abgefragt werden die Zeichen- und die Hintergrundfarbe, die Schrittweite in Z-Richtung und der Bereich in X- (aber auch in Z-) Richtung von XA bis XE (und von ZA bis ZE), in dem die Funktion zu zeichnen ist. Wenn das Bild fertig ist, wird oben noch die Funktionsgleichung ausgedruckt. Mit einem Tastendruck gelangt man dann in ein Menü, welches mit »E« die Beendigung des Programmes, mit »G« das Zurückschalten auf den Grafik-Bildschirm (ein Tastendruck führt dann wieder ins Menü), mit »N« den Neubeginn des Programmes und mit »D« den Ausdruck auf dem Drucker 1526 (und kompatible) erlaubt. Ein Beispiel für einen 1526-Ausdruck zeigt Bild 5:

Bild 5. HiRes-3 zeichnet 3D-Funktionen

Das Programm ist als 3D-Programm hier abgedruckt (Listing 9). Es erfordert das vorherige Laden von HiRes-3 (mit den Text-Befehlen).

(Heimo Ponnath/gk)

Literatur:

[1] Theo Pavlidis: Algorithms for Graphics and Image Processing, Berlin-Heidelberg 1982: Springer-Verlag, ISBN 3-540-11338-X

1 rem**********************************
2 rem*                                *
3 rem*     verschlungene spiralen     *
4 rem* version m. allgemeinen befehlen*
5 rem*                                *
6 rem*  heimo ponnath  hamburg  1985  *
7 rem*                                *
8 rem**********************************
9 rem ***** eingaben ******************
10 poke53280,0:poke53281,0:poke646,5:printchr$(147)
15 input"anzahl spiralen";n:input"textstart xt,yt";xt,yt
20 input"radius,startwinkel";r,a1
22 init
25 start
30 mitte
35 gosub100:kreis(0,0,r,r)
40 a$="verschlungene spiralen"
45 text(a$,xt,yt)
50 show
55 poke198,0:wait198,1
60 normal
65 greset
70 end
100 rem****** unterprogramm zeichnen ***
102 nn=n*100:ra=r/nn:dimt(nn):a=a1
105 forj=1ton:a=a+2*~/n
110 t=a:th=2*~/100:t(0)=t
115 fori=1tonn:t(i)=t(i-1)+th:rr=ra*i
120 linie((rr-ra)*cos(t(i-1)),(rr-ra)*sin(t(i-1)),rr*cos(t(i)),rr*sin(t(i)))
125 nexti
130 nextj
135 return
Listing 1. Spiralen. Das Spiralen-Programm mit den allgemeinen Grafik-Befehlen
1 rem**********************************
2 rem*                                *
3 rem*     verschlungene spiralen     *
4 rem*   version fuer h i r e s - 3   *
5 rem*                                *
6 rem*  heimo ponnath  hamburg  1985  *
7 rem*                                *
8 rem**********************************
9 rem ***** eingaben ******************
10 poke53280,0:poke53281,0:poke646,5:printchr$(147)
15 input"anzahl spiralen";n:input"textstart xt,yt";xt,yt
20 input"radius,startwinkel";r,a1
22 rem**** init ****
23 sys37498:hfl,6,12
25 rem**** start ****
26 trs,0,320,0,200
30 rem**** mitte ****
32 trs,-160,160,-100,100
35 gosub100:tkr,0,0,r,r,2*~
40 a$="verschlungene spiralen"
42 rem**** text ****
45 tex,a$,yt,xt
50 rem**** show (hier unnoetig)****
55 poke198,0:wait198,1
60 rem**** normal ****
62 hof
65 rem**** greset ****
67 loe:aus
70 end
100 rem****** unterprogramm zeichnen ***
102 nn=n*100:ra=r/nn:dimt(nn):a=a1
105 forj=1ton:a=a+2*~/n
110 t=a:th=2*~/100:t(0)=t
115 fori=1tonn:t(i)=t(i-1)+th:rr=ra*i
120 tln,(rr-ra)*cos(t(i-1)),(rr-ra)*sin(t(i-1)),rr*cos(t(i)),rr*sin(t(i))
125 nexti
130 nextj
135 return
Listing 2. HiRes-Spiralen. Die Übersetzung in die Syntax von HiRes-3
1 rem**********************************
2 rem*                                *
3 rem*     verschlungene spiralen     *
4 rem*   version fuer plotter 1520    *
5 rem*                                *
6 rem*  heimo ponnath  hamburg  1985  *
7 rem*                                *
8 rem**********************************
9 rem ***** eingaben ******************
10 poke53280,0:poke53281,0:poke646,5:printchr$(147)
15 input"anzahl spiralen";n:input"textstart xt,yt";xt,yt
20 input"radius,startwinkel";r,a1
22 rem**** init ****
23 open1,6,1:open2,6,2:print#2,0:close2
25 rem**** start ****
26 print#1,"m",0,-200:print#1,"i"
30 rem**** mitte ****
32 print#1,"r",240,0:print#1,"i":gosub100
33 rem **** kreis ******
35 m=50:d=360*~/(m*180):dimk(m):k(0)=2*~
36 fori=1tom:k(i)=k(i-1)+d:print#1,"r",r*cos(k(i-1)),r*sin(k(i-1))
37 print#1,"j",r*cos(k(i)),r*sin(k(i)):nexti:print#1,"h"
40 a$="verschlungene spiralen"
42 rem**** text ****
43 open4,6:print#1,"r",xt,yt:print#4,a$:close4
45 print#1,"m",240,-yt:print#1,"i"
50 rem**** show ****
52 print#1,"r",0,-200:print#1,"i"
55 poke198,0:wait198,1
60 rem**** normal ****
62 print#1,"h":close1
65 rem**** werte ausdrucken *****
70 open3,6,3:print#3,0:open4,6:print#4:print#4," n","  xt","  yt","  r","  w"
75 print#4,n,xt,yt,r,a1:print#3,1:print#4:close4:close3
80 rem**** greset ****
85 open7,6,7:print#7:close7
90 end
100 rem****** unterprogramm zeichnen ***
102 nn=n*100:ra=r/nn:dimt(nn):a=a1
105 forj=1ton:a=a+2*~/n
110 t=a:th=2*~/100:t(0)=t
115 fori=1tonn:t(i)=t(i-1)+th:rr=ra*i
120 print#1,"r",(rr-ra)*cos(t(i-1)),(rr-ra)*sin(t(i-1))
122 print#1,"j",rr*cos(t(i)),rr*sin(t(i))
125 nexti
130 nextj
135 return
Listing 3. Plotter-Spiralen. Das Spiralen-Programm mit der Plotter-Syntax
1 rem ********************************
2 rem *                              *
3 rem *         fensterrose          *
4 rem * version m. allgem. befehlen  *
5 rem *                              *
6 rem *  heimo ponnath hamburg 1985  *
7 rem *                              *
8 rem ********************************
9 rem **** eingaben *****
10 poke53280,0:poke53281,0:poke646,5:printchr$(147)
15 input"anzahl stuetzpunkte";n
20 input"radius";r:input"textort xt,yt";xt,yt
25 init
35 start
45 mitte
60 d=2*~/n:dimx(n),y(n)
65 kreis(0,0,r,r)
80 gosub200
90 a$="fensterrose"
100 text(a$,xt,yt)
105 show
120 poke198,0:wait198,1
125 normal
135 greset
160 end
200 rem ****** up zeichnen **********
210 fori=1ton:t=t+d:x(i)=r*cos(t):y(i)=r*sin(t):nexti
220 s=n-1
230 fori=1tos:z=i+1
240 forj=zton
245 linie(x(i),y(i),x(j),y(j))
250 nextj:nexti:return
Listing 4. Fensterrose. Ein gotisches Rundfenster, programmiert mit allgemeinen Grafik-Befehlen
1 rem ********************************
2 rem *                              *
3 rem *         fensterrose          *
4 rem *   version fuer h i r e s 3   *
5 rem *                              *
6 rem *  heimo ponnath hamburg 1985  *
7 rem *                              *
8 rem ********************************
9 rem **** eingaben *****
10 poke53280,0:poke53281,0:poke646,5:printchr$(147)
15 input"anzahl stuetzpunkte";n
20 input"radius";r:input"textort xt,yt";xt,yt
25 rem **** init *****
30 sys37498:hfl,6,12
35 rem **** start *****
40 trs,0,320,0,200
45 rem **** mitte *****
50 trs,-160,160,-100,100
55 rem*******
60 d=2*~/n:dimx(n),y(n)
65 rem **** kreis *****
70 tkr,0,0,r,r,2*~
75 rem*******
80 gosub200
90 a$="fensterrose"
95 rem **** text *****
100 tex,a$,yt,xt
105 rem **** show (hier unnoetig) *****
115 rem******
120 poke198,0:wait198,1
125 rem **** normal *****
130 hof
135 rem **** greset *****
150 loe:aus
160 end
200 rem ****** up zeichnen **********
210 fori=1ton:t=t+d:x(i)=r*cos(t):y(i)=r*sin(t):nexti
220 s=n-1
230 fori=1tos:z=i+1
240 forj=zton
242 rem **** linie *****
245 tln,x(i),y(i),x(j),y(j)
247 rem********
250 nextj:nexti:return
Listing 5. Hires-Fensterrose. Fensterrose, übersetzt in die HiRes-3-Syntax
1 rem ********************************
2 rem *                              *
3 rem *         fensterrose          *
4 rem *  version fuer  plotter 1520  *
5 rem *                              *
6 rem *  heimo ponnath hamburg 1985  *
7 rem *                              *
8 rem ********************************
9 rem **** eingaben *****
10 poke53280,0:poke53281,0:poke646,5:printchr$(147)
15 input"anzahl stuetzpunkte";n
20 input"radius";r:input"textort xt,yt";xt,yt
25 rem **** init *****
30 open1,6,1:open2,6,2:print#2,1:close2
35 rem **** start *****
40 print#1,"m",0,-200:print#1,"i"
45 rem **** mitte *****
50 print#1,"r",240,0:print#1,"i"
55 rem*******
60 d=2*~/n:dimx(n),y(n)
65 rem **** kreis *****
70 m=50:dd=360*~/(m*180):dimt(m):t(0)=2*~
72 fori=1tom:t(i)=t(i-1)+dd:print#1,"r",r*cos(t(i-1)),r*sin(t(i-1))
74 print#1,"j",r*cos(t(i)),r*sin(t(i)):nexti
75 rem*******
80 gosub200
90 a$="fensterrose"
95 rem **** text *****
100 open4,6:print#1,"r",xt,yt:print#4,a$:close4:print#1,"m",240,-yt:print#1,"i"
105 rem **** show *****
110 print#1,"r",0,-200
115 rem******
120 poke198,0:wait198,1
125 rem **** normal *****
130 open3,6,3:print#3,0:open4,6:print#4:print#4," n","   r","    xt","    yt"
132 print#4,n,r,xt,yt:print#3,1:print#4:close3:close4:close1
135 rem **** greset *****
150 open7,6,7:print#7:close7
160 end
200 rem ****** up zeichnen **********
210 fori=1ton:t=t+d:x(i)=r*cos(t):y(i)=r*sin(t):nexti
220 s=n-1
230 fori=1tos:z=i+1
240 forj=zton
242 rem **** linie *****
245 print#1,"r",x(i),y(i):print#1,"j",x(j),y(j)
247 rem********
250 nextj:nexti:return
Listing 6. Plotter-Fensterrose. Die Übersetzung in die Plotter-Sprache
1 rem *********************************
2 rem *                               *
3 rem *   abweichungsbalkendiagramm   *
4 rem *        mittels hires-3        *
5 rem *                               *
6 rem *  heimo ponnath  hamburg 1985  *
7 rem *                               *
8 rem * hires-3 muss im speicher sein *
9 rem *********************************
10 rem
15 rem ++++++++ initialisieren ++++++++
20 rem
25 poke52,112:poke56,112:sys37498:goto65
30 rem
35 rem ++++++ up cursor setzen ++++++++
40 rem
45 poke211,sp:poke214,zl:sys58640:return
50 rem
55 rem +++++    eingabeteil     +++++++
60 rem
65 printchr$(147):sys34647:poke646,14:zl=10:sp=5:gosub45
70 print"balkendiagramm welches den":zl=12:gosub45
75 print"mittelwert und die abweichungen":zl=14:gosub45
80 print"grafisch darstellt.":pau,5:printchr$(147):zl=10:sp=7:gosub45
85 print"wieviele werte (max=50) ";:inputn
90 dimw(n),a(n):printchr$(147)
95 ma=0:mi=0
100 fori=1ton:print"wert nummer "i"=";:inputw(i):s=s+w(i):nexti
105 rem
110 rem + berechnung der abweichungen +
120 rem
125 m=s/n:fori=1ton:a(i)=w(i)-m:ifa(i)>mathenma=a(i)
130 ifa(i)<mithenmi=a(i)
135 nexti
140 rem
145 rem ++++ bildschirmaufteilung +++++
150 rem
155 q=ma+abs(mi):q1=.06*q:q2=.2*q:m1=ma+q1:m2=mi-q2
160 dx=int(320/n):trs,-5,319,m2,m1
165 rem
170 rem ++++++     zeichnen      ++++++
175 rem
180 hfl,14,6:tln,-1,0,319,0:sys35256:x=0
185 fori=1ton:ifa(i)>0then:tre,x,a(i),x+dx,0:goto195
190 tbk,x,0,x+dx,a(i)
195 x=x+dx:nexti
200 zl=0:sp=5:gosub45:print"abweichungs-balkendiagramm"
205 zl=21:sp=1:gosub45:print"mittelwert = "m:zl=22:gosub45
210 print"+ max "ma,"- max "mi
215 zl=23:gosub45:print"e = ende","n = neu","d = drucken"
220 rem
225 rem +++++ menue-auswertung ++++++++
230 rem
235 geta$:ifa$<>"e"anda$<>"n"anda$<>"d"then235
240 rem
245 rem ----- option neue werte -------
250 rem
255 ifa$="n"thensys35377:hof:run
260 rem
265 rem ----- option drucken ----------
270 rem
275 ifa$="d"thengosub310:hof:printchr$(147):goto215
280 rem
285 rem ----- option programmende -----
290 rem
295 sys35377:hof:end
300 rem
305 rem ----- option  drucken up ------
310 rem
315 sys35377:open1,4,10:print#1:close1:open1,4
320 print#1,"abweichungs-balkendiagramm":sys34865
325 print#1,"groesste ueberschreitung = "ma
330 print#1,"groesste unterschreitung = "mi
335 print#1,"mittelwert = "m:print#1:close1:return
340 rem
345 rem *******  das  wars !  *********
Listing 7. Abweichungen. Ermittelt und zeichnet den Durchschnitt und die Abweichungen davon: Das Programm Abweichungen
1 rem *********************************
2 rem *                               *
3 rem * plotten beliebiger funktionen *
4 rem * mit dem printer/plotter  1520 *
5 rem *                               *
6 rem *  heimo ponnath  hamburg 1985  *
7 rem *                               *
8 rem *********************************
9 goto 25
10 rem ++++++++ up cursor setzen ++++++
15 poke211,sp:poke214,z:sys58640:return
20 rem ++++++++ hauptprogramm teil 1 ++
25 printchr$(147):z=10:sp=1:gosub15
30 print"im programm befindet sich die funktion:"
35 k=1:gosub90:k=0:print:print"y= "f$:z=18:gosub15
40 printchr$(18)"a"chr$(146)"lte oder "chr$(18)"n"chr$(146)"eue funktion ?"
45 geta$:ifa$<>"a"anda$<>"n"then45
50 ifa$="a"then85
55 rem ++ neue funktion ins programm ++
60 z=20:sp=3:gosub15:print"neue funktion:":input"y= ";f$:poke646,6
65 printchr$(147)chr$(17)chr$(17)"90f$="chr$(34)f$chr$(34)
70 print"95deffna(x)="f$:print"run85":printchr$(19);
75 poke631,13:poke632,13:poke633,13:poke198,3:end
80 rem ++++++++ hauptprogramm teil 2 ++
85 printchr$(147):poke646,14
90 f$="x^2/2"
95 deffna(x)=x^2/2
100 ifk=1thenreturn
105 rem ++++ variable und funktionen ++
110 deffnt(x)=int(479/(xo-xu)*x)
115 x=0:z=0:sp=0:xu=-1:xo=5:yu=-1:yo=5:ym=6:xa=xu:xe=xo
120 x1=0:x2=0:y1=0:y2=0:d=150:dy=.1:i=10:m=10:dx=.2
125 a$=""
130 rem +++ plotterkanaele oeffnen ++++
135 open1,6,1:open4,6:open2,6,2:open3,6,3:print#2,3
140 rem +++++ parametereingaben +++++++
145 z=0:sp=0:gosub15:print"funktion y="f$
150 z=2:gosub15:print"(falls sie mit unstetigkeiten rechnen,"
155 print"dann vermeiden sie es, die polstellen"
160 print"als parameter (xu,xo,evtl.xa oder xe) "
165 print"zu verwenden. d sollte dann klein sein."
170 z=7:sp=10:gosub15:print"xu und xo ="
175 z=14:sp=10:gosub15:print"yu und yo ="
180 z=16:sp=0:gosub15:print"spez. zeichenbereich gewuenscht(j/n)?"
182 z=22:sp=10:gosub15:print"schrittweite (d=ca.150)"
185 z=7:sp=25:gosub15:inputxu,xo
190 ym=int(998*(xo-xu)/479):z=9:sp=3:gosub15:print"yu minimum = ",-ym/2
195 z=10:sp=3:gosub15:print"yo maximum = ",ym/2:z=11:sp=0:gosub15
200 print"(die summe aus ByuB und yo darf "ym:print" nicht ueberschreiten!)
205 z=14:sp=25:gosub15:inputyu,yo:if(yo-yu)>ymthen205
210 z=16:sp=36:gosub15:inputa$:ifa$<>"j"anda$<>"n"then210
215 ifa$="n"thenxa=xu:xe=xo:goto232
220 z=18:sp=3:gosub15:print"(xa > xu und xe < xo !"
225 z=20:sp=10:gosub15:print"xa und xe =":sp=25:gosub15:inputxa,xe
230 ifxa<xu orxe>xothen225
232 z=22:sp=32:gosub15:inputd
235 rem +++ plotten anfangswerte ++++++
240 print#1,"h":print#1,"m",fnt(-xu),-fnt(yo):print#1,"i"
245 x1=fnt(xu)+1:x2=fnt(xo)-1:y1=fnt(yo)-1:y2=fnt(yu)+1
250 rem +++ plotten koordinatensystem +
255 print#1,"r",0,y1:print#1,"j",0,y2:print#1,"r",x2,0:print#1,"j",x1,0
260 rem +++ plotten skalierung ++++++++
265 dy=(xo-xu)/47
270 fori=xu+1toxo-1:m=int(i):print#1,"r",fnt(m),fnt(0)
275 print#1,"j",fnt(m),fnt(-dy)
280 nexti
285 fori=yu+1toyo-1:m=int(i):print#1,"r",fnt(0),fnt(m)
290 print#1,"j",fnt(dy),fnt(m)
295 nexti:print#2,0
300 rem *** plotten funktion ++++++++++
305 iffnt(fna(xa))>y1thenprint#1,"r",fnt(xa),y1:goto320
310 iffnt(fna(xa))<y2thenprint#1,"r",fnt(xa),y2:goto320
315 print#1,"r",fnt(xa),fnt(fna(xa))
320 forx=xatoxestep(xo-xu)/d
325 iffnt(fna(x))>y1thenprint#1,"r",fnt(x),y1:goto340
330 iffnt(fna(x))<y2thenprint#1,"r",fnt(x),y2:goto340
335 print#1,"j",fnt(x),fnt(fna(x))
340 nextx
345 if(xo-xu)>25then405
350 rem +++ plotten einheitenzahlen +++
355 print#2,3:print#3,0:dx=(xo-xu)/28
360 fori=xu+1toxo-1:m=int(i):print#1,"m",fnt(-xu),-fnt(yo):print#1,"i"
365 print#1,"r",fnt(m),fnt(-dx):ifm=0then375
370 print#4,m;
375 nexti
380 fori=yu+1toyo-1:m=int(i):print#1,"m",fnt(-xu),-fnt(yo):print#1,"i"
385 print#1,"r",fnt(dx),fnt(m):ifm=0then395
390 print#4,m;
395 nexti
400 rem +++ plotten funktionsname +++++
405 print#2,2
410 print#1,"m",fnt(-xu),-fnt(yo):print#1,"i":print#1,"r",x1,y2
415 print#1,"j",x2,y2:print#1,"j",x2,y1:print#1,"j",x1,y1:print#1,"j",x1,y2
420 print#4:print#4:print#2,1:print#3,1:print#4,"y = "f$:print#4:print#2,0
425 rem +++ plotterkanaele schliessen +
430 close1:close2:close3:close4
435 end
Listing 8. Funktionenplot. Erspart die Wertetabelle: Das Programm Funktionenplot
1 rem *********************************
2 rem *                               *
3 rem *   3d-grafik mittels hires-3   *
4 rem *                               *
5 rem *  heimo ponnath  hamburg 1985  *
6 rem *                               *
7 rem * hires-3 muss im speicher sein *
8 rem *********************************
9 rem
10 rem ++ initialisieren der grafik ++
15 rem
20 poke52,112:poke56,112:sys37498:goto60
25 rem
30 rem ++ up  cursor setzen ++++++++++
35 rem
40 poke211,sp:poke214,zl:sys58640:return
45 rem
50 rem +++ eingabe der 3d-funktion ++++
55 rem
60 printchr$(147):sys34647:poke646,14:zl=5:sp=5:gosub40
65 print"funktion im programm:"
70 k=1:gosub180:k=0
75 print:printtab(3)"y="f$:print
80 printtab(5)chr$(18)"a"chr$(146)"lte oder "chr$(18)"n"chr$(146)"eue funktion?
85 geta$:ifa$<>"a"anda$<>"n"then85
90 ifa$="a"then140
95 printchr$(147):sp=3:zl=12:gosub40:input"y=";f$:poke646,6
100 printchr$(147)chr$(17)chr$(17)"180f$="chr$(34)f$chr$(34)
105 print"190deffna(x)="f$
110 print"run140":printchr$(19);
115 poke631,13:poke632,13:poke633,13:poke198,3:end
120 rem
125 rem +++ neubeginn des programmes ++
130 rem +++    falls neue funktion   ++
135 rem
140 printchr$(147):poke646,14
145 rem
150 rem +++ funktionen und variable +++
155 rem
160 x=0:z=0:sp=0:zl=0:xu=0:xo=0:yu=0:yo=0:z3=0:z4=0:z5=0:z6=0:zu=0:zo=0
165 z1=0:z2=0:f1=1:f2=6:a=1:xa=0:xe=0:za=0:ze=0:dz=1:xt=0:xh=0:yt=0:yh=0:zz=1
170 rem
175 a$=""
180 f$="sin(x)*sin(z)"
185 rem
190 deffna(x)=sin(x)*sin(z)
195 deffnz(z)=z/(2*sqr(2))
200 ifk=1thenreturn
205 rem
210 rem ++ eingabe koordinatensystem ++
215 rem
220 sp=1:zl=3:gosub40
225 printchr$(18)"unser system    :"chr$(146):sp=7:zl=5:gosub40
230 input"xu,xo=";xu,xo:zl=6:gosub40:input"yu,yo=";yu,yo:sp=9:zl=8:gosub40
235 z3=2*xo*sqr(2):z4=2*yo*sqr(2):ifz3<z4thenprint"zo maximal="z3:goto245
240 print"zo maximal="z4
245 sp=9:zl=10:gosub40
250 z5=2*xu*sqr(2):z6=2*yu*sqr(2):ifz5>z6thenprint"zu minimal="z5:goto260
255 print"zu minimal="z6
260 sp=7:zl=12:gosub40:input"zu,zo=";zu,zo:z1=fnz(zo):z2=fnz(zu)
265 ifz1>xoorz1>yothen235
270 ifz2<xuorz2<yuthen235
275 rem
280 rem +++ eingabe zeichenparameter ++
285 rem
290 zl=14:sp=1:gosub40:printchr$(18)"unsere zeichnung:"chr$(146)
295 zl=16:sp=3:gosub40:input"zeichen- und hintergrundfarbe=";f1,f2
300 zl=18:sp=7:gosub40:input"schrittweite von z=";a
305 zl=20:gosub40:input"x-bereich xa,xe=";xa,xe
310 zl=21:gosub40:input"z-bereich za,ze=";za,ze
315 rem
320 rem +++       zeichnen        +++
325 rem
330 dz=a/2:xt=xu:xh=xo:yt=yu:yh=yo
335 hfl,f1,f2:trs,xu,xo,yu,yo
336 goto 375
340 rem
345 rem ----- koordinatenkreuz ------
350 rem
355 tln,xu,0,xo,0:tln,0,yu,0,yo:tln,z2,z2,z1,z1
356 return
360 rem
365 rem -----    z-schleife    ------
370 rem
375 forz=zatozestepdz:zz=fnz(dz):xt=xt-zz:xh=xh-zz:yt=yt-zz:yh=yh-zz
380 trs,xt,xh,yt,yh
385 funkt,a,xa,xe
390 nextz
391 zz=fnz (-zu):xt=xu-zz:xh=xo-zz:yt=yu-zz:yh=yo-zz:trs,xt,xh,yt,yh: go­sub 355
395 tex,"y="+f$,0,3
400 rem
405 rem ----- zeichnung fertig ------
410 rem
415 geta$:ifa$=""then415
420 hof
425 rem
430 rem +++++     menue        ++++++
435 rem
440 zl=23:sp=1:gosub40
445 printchr$(18)"e"chr$(146)"nde    "chr$(18)"g"chr$(146)"rafik"
450 zl=23:sp=18:gosub40
455 printchr$(18)"n"chr$(146)"eu     "chr$(18)"d"chr$(146)"rucken"
460 geta$:ifa$<>"e"anda$<>"g"anda$<>"n"anda$<>"d"then460
465 rem
470 rem -------- option grafik -------
475 rem
480 ifa$="g"then:han:poke198,0:wait198,1:hof:goto460
485 rem
490 rem -------- option drucken ------
495 rem
500 ifa$="d"then:han:open1,4,10:print#1:close1:sys34865:hof
505 ifa$="d"thenopen1,4:print#1:print#1,"xu="xu,"xo="xo,"yu="yu,"yo="yo
510 ifa$="d"thenprint#1,"zu="zu,"zo="zo,"a="a
515 ifa$="d"thenprint#1,"xa="xa,"xe="xe,"za="za,"ze="ze:print#1:close1:goto460
520 rem
525 rem --- option neue zeichnung ----
530 rem
535 ifa$="n"thenrun
540 rem
545 rem ---  option programmende  ----
550 rem
555 end
560 rem ********* das wars ! **********
Listing 9. 3D-Programm. Schnell geworden: Das 3D-Programm aus der Grafik-Serie mit HiRes-3.
Kurs: Streifzüge durch die Grafikwelt
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →