← ST-Computer 01 / 1986

Kuchen- & SĂ€ulengrafik Y 1.0

Grafik

Grafische Darstellungsformen

Da normale Zahlentabellen meist unanschaulich und schwer zu verarbeiten sind, gibt es die Möglichkeit, sie grafisch umzusetzen. So kann man z. B. die Werte im normalen zweidimensionalen Koordinatensystem darstellen, wie es bei mathematischen Funktionen ĂŒblich ist. Im Gegensatz zu reinen Zahlenwerten kann man anhand eines solchen Diagrammes das VerhĂ€ltnis der Werte zueinander wesentlich besser erfassen. Ein weiterer Vorteil dieser Darstellungsart liegt im sofortigen Erkennen von SteigungsverĂ€nderungen. Dies ist zum Beispiel bei der Auswertung von Meßergebnissen wichtig oder bei der Analyse von Verkaufszahlen.

Eine optisch ansprechendere Darstellungsweise erhÀlt man mit dem Balkendiagramm. Hierbei hat man die Möglichkeit, die Werte durch verschiedene Farben oder Schraffuren zu unterscheiden oder Gemeinsamkeiten hervorzuheben.

Eine erweiterte Form dieser Grafikart ist die SĂ€ulengrafik. Der Unterschied zur Balkengrafik liegt darin, daß hier eine RĂ€umlichkeit durch die dreidimensionale Darstellung erzeugt wird. Hiermit können auch mehrspaltige SĂ€ulenreihen erstellt werden wie es bei hochwertigen Programmpaketen (z.B. OPEN ACCESS) realisiert ist.

Auch die Kuchengrafik ist eine oft verwendete Form der grafischen Darstellung. Sie liefert ĂŒbersichtliche und vor allem kompakte Bilder und wird gerne zur prozentualen Darstellung benutzt. Doch nun noch einige Worte zum Programm selbst. Das Programm „Kuchen- & SĂ€ulengrafik“ gibt die eingegebenen Werte als SĂ€ulen- und Kuchengrafik und als Diagramm aus. Bei der Eingabe ist zu beachten, daß das Programm momentan nur 18 Werte annimmt und dann automatisch mit der Berechnung beginnt; dies kann natĂŒrlich geĂ€ndert werden. Die Eingabe kann man jederzeit mit „ ★ “ beenden. Das Programm stellt dann das Gesamtbild zusammen. Es werden dabei alle Grafikarten, jedoch ohne Werte, dargestellt. ZusĂ€tzlich erscheint das MenĂŒ, mit dem man nun jede beliebige Grafik auf den gesamten Bildschirm vergrĂ¶ĂŸern kann. Zu dieser VergrĂ¶ĂŸerung werden auch die Werte ausgegeben. Zwischen den Grafiken und der Gesamtdarstellung kann nun beliebig umgeschaltet werden. Dazu wird nur der entsprechende Anfangsbuchstabe gedrĂŒckt.

Bei dieser Eingabe werden Groß- und Kleinbuchstaben vom Programm abgefragt, da der INPUT$-Befehl eine Unterscheidung zwischen Groß- und Kleinschrift macht und somit bei versehentlichem DrĂŒcken der CAPSLOCK Taste nicht mehr reagiert.

Das Unterprogramm zum Zeichnen der SĂ€ulen ist etwas kompliziert geworden. Dies liegt an der gewĂ€hlten Darstellungsweise, bei der sich die SĂ€ulen zum Teil ĂŒberschneiden. Es ist deshalb notwendig, die unter der NebensĂ€ule liegenden Linien wegfallen zu lassen. Da es viele verschiedene Überlagerungssituationen gibt, ist es notwendig jede Linie getrennt zu untersuchen. Dies erklĂ€rt die hohe Anzahl an Abfragen und Variablen fĂŒr die SĂ€ulengrafikroutine.

Wenn die eingegebnen Werte kleine ’KuchenstĂŒcke’ erzeugen sollen, wird man feststellen mĂŒssen, daß diese StĂŒcke im Kuchen einfach fehlen. Das Basic schafft es nicht TeilstĂŒcke mit kleiner BogenlĂ€nge darzustellen. Dies hat den unschönen Effekt, daß der Außenkreis nicht immer geschlossen ist, sondern eventuell LĂŒcken aufweist. In diesem Programm wurde deshalb zusĂ€tzlich ein Kreis gezogen. Eine einwandfreie Kuchenroutine mĂŒĂŸte man sich allerdings selbst erstellen.

Beim Unterprogramm „Beschriftung“ fĂ€llt auf, daß der GOTOXY-Befehl nur jeden zweiten Bildschirmpunkt anspringen kann. FĂŒr eine genaue Beschriftung der Diagramme wurde deshalb der SPC-Befehl benutzt. Da dieser jedoch die Bildschirmzeile bis zum Positionierungspunkt löscht, muß man die Werte von rechts nach links schreiben.

Beim Eingeben des Programms mĂŒssen die Zeilennummern nicht, wie im Listing angegeben, abgetippt werden. Sie können beliebig gewĂ€hlt werden, weil das Programm keine SprĂŒnge zu Zeilennummern enthĂ€lt. Zum besseren VerstĂ€ndnis des Listings wurde ausschließlich mit Labels gearbeitet, die im Klartext ausdrĂŒcken wohin der Sprung erfolgt. Somit entfĂ€llt ein umstĂ€ndliches Suchen nach Sinn und Auswirkung des Sprunges. Das Programm ist so angelegt, daß es leicht den eigenen Anforderungen angepaßt werden kann. Das Listing besitzt eine ĂŒbersichtliche TOP-DOWN-Struktur, von der aus die verschiedenen Unterprogramme aufgerufen werden. Als Unterprogramme sind die Zeichenroutinen fĂŒr die verschiedenen Grafiken und die Beschriftungen angelegt. Fast alle in diesen Routinen verwendeten Koordinaten sind als Parameter definiert und somit leicht abzuĂ€ndern. Die Parameter werden vor dem Aufruf des jeweiligen Unterprogramms definiert.

Programmdokumentation

   
100- 170 Bildschirm vorbereiten, Dimensionierung
170- 300 Eingabe der Werte
270 Bilden der Summe der Eingabewerte fĂŒr Kuchengrafik
280 Ermitteln des grĂ¶ĂŸten Elements der Eingabewerte
320 Beginn des Hauptprogramms
340 Faktor fĂŒr Ausdehnung in x-Richtung
350 Faktor fĂŒr Ausdehnung in y-Richtung
380- 430 Definieren der Variablen und Aufruf der Unterprogramme
450 Berechnen der Ausdehnungsfaktoren fĂŒr die VergrĂ¶ĂŸerung
460- 600 HauptmenĂŒ
620- 720 Definieren der Variablen und Aufruf des jeweiligen Unterprogramms
770- 860 Programmende oder Neustart
1000-1370 Unterprogramm: Balkengrafik
1020 Zeichnen der x-Achse
1040-1120 Berechnen der LINE-Koordinaten
1130-1150 Ziehen der Linien 1-3
1160-1320 Berechnen und Ziehen der 4.-7. Linie (z. T. verdeckte Linien)
1330 COLOR fĂŒr FILL-Befehl
1340 AusfĂŒllen der Vorderseite der SĂ€ule
1360 COLOR-Befehl auf 'normal’ setzen (!)
1500-1580 Unterprogramm zum Beschriften von Balkengrafik und Diagramm
1510-1520 Y-Achse beschriften
1530-1570 Position berechnen und X-Achse beschriften
2000-2140 Unterprogramm: Diagramm
2010-2050 Achsen und Einteilungslinien ziehen
2060-2120 Koordinaten berechnen und Linien ziehen
3000-3100 Unterprogramm: Kuchengrafik
3010 Kreis ziehen
3020 Kreisbogenfaktor berechnen
3040-3050 Anfangs- und Endwinkel des Kreissektors berechnen
3060-3070 Kreissektor zeichnen und ausfĂŒllen
3090 COLOR-Befehl zurĂŒcksetzen (!)
3500-3570 Unterprogramm zum Kennzeichnen der Kreissektoren
3520 COLOR-Befehl setzen
3530 Beschriftungskreise zeichnen und ausfĂŒllen
3540 Position berechnen und beschriften

VARIABLENLISTE

   
wo Feld fĂŒr Eingabewerte
E$ allgemeiner Eingabestring
A allgemeine Schleifenvariable
NR Anzahl der Eingabewerte
SU Summe aller Eingabewerte
YM grĂ¶ĂŸter y-Wert
XY Abstand zum nÀchsten Wert (x-Achse)
YA VergrĂ¶ĂŸerungsfaktor y-Achse
BX1.BX2.BY1 Koordinaten fĂŒr x,y-Achse
XB Abstand der SĂ€ulen (!)
XB/2 Breite der SĂ€ule
YB Faktor fĂŒr Lage der z-Achse
X1,X2,X3,X4 Koordinaten fĂŒr Balken
Y1,Y2,Y3,Y4,Y5 (siehe Zeichnung)
DX1 ,DX2,D Y1 ,DYY Koordinaten fĂŒr x,y-Achse
XI,Y 1,X2,Y2 Koordinaten fĂŒr LINE-Befehl
CX1,CY1,R1 Koordinaten fĂŒr Kreismittelpunkt und Radius
W1 Kreisbogenfaktor
WA,WE Anfangs- und Endwinkel
100 ’ GRAFIK V 1.0 110 ’ by mark 120 ’ 130 programmstart : 140 CLEAR:DIM W(30) 150 A$=" M = MENUE B = BALKEN K = KUCHEN D - DIAGRAMM" 160 A$=A$+" --> ENDE" 170 COLOR 1,0,1: FULLW 2: CLEARW 2 : CLOSEW 3 180 GOTOXY 10,0:PRINT "GRAPHISCHE DARSTELLUNG" 190 GOTOXY 5,2: PRINT"... bitte die Werte eingeben ! ENDE = :*:" 200 GOTOXY 0,5:NR=0 210 ’------------------------------------------ 220 eingabe : 230 WHILE E$<>"*" AND NR <18 240 NR=NR +1 250 PRINT " WERT ("NR ")= ";: INPUT E$ 260 W(NR)=ABS( VAL(E$)) 270 SU=SU+W(NR) 280 IF YM< W(NR) THEN YM=W(NR) 290 WEND 300 IF E$="*" THEN NR=NR-1 310 ’------------------------------------------ 320 gesamtgrafik : 330 CLEARW 2 340 XA= INT (240/NR) 350 YA=100/YM 370 GOTOXY 5,1: PRINT"G R A F I K V 1.0" 380 BX1= 5:BX2=300:BY1=180 390 GOSUB balkengrafik 400 DX1=10:DX2=280:DY1=320:DYY=200 410 GOSUB diagramm 420 CX1 = 480:CY1 = 100: R1=80 430 GOSUB kuchengrafik 440 ’ ausdehnung 450 XA=2*XA:YA=1.8*YA 460 ’ menue 470 GOTOXY 25,13: PRINT "MENUE" 480 GOTOXY 25,15: PRINT "BALKENGRAFIK" 490 GOTOXY 25,16: PRINT "KUCHENGRAFIK" 500 GOTOXY 25,17: PRINT "DIAGRAMM" 510 GOTOXY 25,18: PRINT " ENDE" 520 ’----------------------------------------------- 530 menue : 540 E$=INPUT$(1) 550 IF E$="M" OR E$="m" THEN GOTO gesamtgrafik 560 IF E$="B" OR E$="b" THEN GOTO b 570 IF E$="K" OR E$="k" THEN GOTO k 580 IF E$="D" OR E$="d" THEN GOTO d 590 IF E$="E" OR E$="e" THEN GOTO ende 600 GOTO menue 610 ’ 620 b: BX1=10:BX2=640:BY1=250 630 CLEARW 2 640 GOSUB balkengrafik : GOSUB beschriftung : GOTO auswahl 650 ' 660 k: CX1=200:CY1=155:R1=150 670 CLEARW 2 680 GOSUB kuchengrafik :GOSUB kuchenbeschriftung :GOTO auswahl 690 ' 700 d: DX1=20:DX2=560:DY1=250:DYY=10 710 CLEARW 2 720 GOSUB diagramm : GOSUB beschriftung 730 ' 740 auswahl : 750 GOTOXY 0,18: PRINT A$ : GOTO menue 760 ' 770 ende : 780 GOTOXY 5,5:PRINT"NEUE DATEN" 790 GOTOXY 5,7:PRINT" ------> ENDE" 800 ' 810 menue1 : 820 E$=INPUT*il) 830 IF E$="N" OR E$="n" TUEN GOTO programmstart 840 IF E$="E" OR E$="e" THEN END 850 GOTO menue1 860 END 870 ’ -------------------------- 1000 balkengrafik : 1010 COLOR 1,1,1,0,1 1020 LINEF BX1,BY1,BX2,BY1 1030 FOR A=NR TO 1 STEP 1 1040 XB=XA: YB=4 1050 X1=A*XA 1060 X2=X1-XB/2 1070 X3=X1+XB 1080 X4=X1+XB/2 1090 Y1=BY1-W(A)*YA 1100 Y2=BY1-XA/YB 1110 Y3=Y1-XA/YB 1120 Y5=BY1-XB/(YBK2) 1130 LINEF X1,BY1,X1,Y1 : REM 1 1140 LINEF X2,BY1,X2,Y1 : REM 2 1150 LINEF X1,Y1,X2,Y1 : REM 3 1160 Y6=Y5-W(A)*YA: X44=X4 1170 IF W(A)*YA>=W( A+1 )*YA-XB/8 THEN X44=X3: Y6=Y3 1180 LINEF X1,Y1,X44,Y6 : REM 4 1190 LINEF X2,Y1,X2+XB,Y3 : REM 5 1200 IF Y3>BY1-W(A+1)*YA THEN GOTO noline 1210 X5=X4+4*(BY1-W(A+1)*YA-Y3) 1220 IF X5>X3 THEN X5=X3 1230 LINEF X4,Y3,X5,Y3 : REM 6 1240 noline: IF(A=NR) THEN X4=X3:Y5=Y2:GOTO line7 1250 Y5=BY1-XB/(YB*2) 1260 IF Y5<BY1-W(A+1)*YA THEN Y5=Y2: X4=X3 1270 line7: LINEF X1,BY1,X4,Y5 : REM 7 1280 IF (A=NR) THEN Y4=Y2 : GOTO lineS 1290 Y4=(BY1-(W(A+1)*YA))-XB/(YB*2) 1300 IF (Y4 >Y2) THEN Y4 = Y2 1310 IF (Y4<Y3) THEN Y4=Y3 1320 line8: LINEF X3,Y3,X3,Y4 : REM 8 1330 COLOR 1,1,1,A,2 1340 FILL X2+(X1-X2)/2,BY1-(BY1-Y1)/2,1 1350 NEXT A 1360 COLOR 1,0,1,0,1 1370 RETURN 1380 ’----------------------------------------- 1500 beschriftung : 1510 GOTOXY 0,3: PRINT YM 1520 GOTOXY 0,9: PRINT YM/2 1530 FOR A=NR TO 1 STEP 1 1540 X=(A*XA-XB/2)/8 1550 IF A MOD 2 =0 THEN Y=16 ELSE Y=15 1560 GOTOXY 0,Y :PRINT SPC(X) W(A) 1570 NEXT A 1580 RETURN 1590 ’ ------------------------------------------ 2000 diagramm : 2010 LINEF DX1,DY1,DX2,DY1 2020 LINEF DX2,DY1,DX2,DYY 2030 LINEF DX1,DY1,DX1,DYY 2040 LINEF DX1,DY1-YM*YA,DX2,DY1-YM*YA 2050 LINEF DX1,DY1-(YM/2)*YA,DX2,DY1-(YM/2)*YA 2060 FOR A=1 TO NR-1 2070 X1=(A*XA)-XA/4 2080 Y1=DY1-W(A)*YA 2090 X2= ((A+1)*XA)-XA/4 2100 Y2=DY1-W(A+1)*YA 2110 LINEF X1,Y1,X2,Y2 2120 NEXT A 2130 COLOR 1,0,1 2140 RETURN 2150 ’----------------------------------------- 3000 kuchengrafik: 3010 CIRCLE CX1,CY1,R1 3020 W1=3600/SU : WE=0 3030 FOR A=1 TO NR 3040 WA=WE 3050 WE=WE+W(A)*W1 3060 COLOR 1,1,1,A,2 3070 PCIRCLE CX1,CY1,RI,WA,WE 3080 NEXT A 3090 COLOR 1,0,1 3100 RETURN 3110 ' ---------------------------------- 3500 kuchenbeschriftung : 3510 FOR A=1 TO NR 3520 COLOR 1,1,1,A,2 3530 CIRCLE 500,A*(340/20)-5,8 : FILL 500,A*340/20-5 3540 GOTOXY 30,A-1: PRINT W(A) 3550 NEXT A 3560 COLOR 1,0,1 3570 RETURN 3580 ’ ---------------------------------------------