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 |
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.


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:


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:

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.

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:
- XU = unterer X-Achsenwert
- XO = oberer — " —
- YU und YO = dasselbe für die Y-Achse
- ZU und ZO = dasselbe für die Z-Achse.
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:

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
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
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
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
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
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
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 ! *********
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
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: gosub 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 ! **********