Buchempfehlung
MySQL kurz & gut
MySQL kurz & gut
Das preiswerte Taschen- buch stellt MySQL-rele- vante Inhalte systematisch und knapp dar, sodass es sich optimal zum Nach- schlagen beim Pro- grammieren eignet. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Mathematik

Balken- und Kreisdiagramme

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.MitgliedLothar Schirm 08.09.2007

In Ergaenzung zur Darstellung von Funktionen im Koordinatensystem wird hier die Erzeugung von Balken- und Kreisdiagrammen dargestellt.

DECLARE SUB OutText(x AS SINGLE, y AS SINGLE, Text AS STRING, _
                    Ausrichtung AS STRING)
DECLARE SUB Balkendiagramm(x() AS STRING, y() AS SINGLE, n AS INTEGER, _
                           ymin AS SINGLE, ymax AS SINGLE, ny AS INTEGER, _
                           hor AS STRING, vert AS STRING, Text AS STRING, _
                           Farbe AS INTEGER)
DECLARE SUB Kreisdiagramm(x() AS STRING, y() AS SINGLE, n AS INTEGER, _
                          Text AS STRING)


'------------------------ Kleines Beispielprogramm ----------------------------

DIM AS STRING x(7)
DIM AS SINGLE y(7)
DIM AS INTEGER i

SCREEN 0
CLS
PRINT "Testprogramm fuer Kreis- und Balkendiagramme"
PRINT
PRINT "Folgende Tabelle wird graphisch ausgewertet:"
PRINT
PRINT "Umsaetze 2000 - 2007"
PRINT "Jahr", "Mio EUR"
FOR i = 0 TO 7
  x(i) = STR(2000 + i)
  y(i) = 30 + 50 * RND(i)
  PRINT x(i), y(i)
NEXT i
PRINT
PRINT "Weiter: Beliebige Taste"
GETKEY

SCREEN 12
COLOR 0, 15
CLS

Balkendiagramm(x(), y(), 7, 0, 100, 10, "Jahr", "Mio EUR", _
               "Umsaetze 2000 - 2007", 4)
LOCATE 29, 30
PRINT "Weiter: Beliebige Taste"
GETKEY

CLS 0
Kreisdiagramm(x(), y(), 7, "Umsaetze 2000 - 2007")
LOCATE 29, 30
PRINT "Beenden: Beliebige Taste"
GETKEY

'-------------------------------- Beispielprogramm Ende -----------------------


SUB OutText(x AS SINGLE, y AS SINGLE, Text AS STRING, Ausrichtung AS STRING)
' Gibt einen Text an pixelgenauen Koordinaten aus
' - x, y = (Sicht)koordinaten
' - Text = auszugebender Text
' - Ausrichtung = Position des Textes bezueglich (x, y):
'   "l": linksbuendig (d.h. Text rechts von (x, y)
'   "r": rechtsbuendig (d.h. Text links von (x, y)
'   "z": zentriert.

  DIM AS INTEGER xp, yp

  'Umwandlung in Pixelkoordinaten:
  xp = PMAP(x, 0)
  yp = PMAP(y, 1) - 8

  'Text plazieren:
  SELECT CASE LCASE(Ausrichtung)
  CASE "l": DRAW STRING (xp, yp), Text
  CASE "r": DRAW STRING (xp - 8 * LEN(Text), yp), Text
  CASE "z": DRAW STRING (xp - 8 * LEN(Text) / 2, yp), Text
  END SELECT

END SUB


SUB Balkendiagramm(x() AS STRING, y() AS SINGLE, n AS INTEGER, ymin AS SINGLE, _
                   ymax AS SINGLE, ny AS INTEGER, hor AS STRING, _
                   vert AS STRING, Text AS STRING, Farbe AS INTEGER)
  '- x(0) bis x(n) = Benennung der Balken
  '- y(0) bis y(n) = Wert der Balken
  '- n + 1         = Anzahl der Balken
  '- ymin, ymax    = Abmessung vertikale Achse (ymin muss <= 0 sein!)
  '- ny            = Anzahl der Achsenabschnitte auf der vertikalen Achse
  '- hor           = Beschriftung horizontale Achse
  '- vert          = Beschriftung vertikale Achse (max 13 Zeichen)
  '- Text          = Bildunterschrift
  '- Farbe         = Farbe

  DIM AS SINGLE Balkenpos(n), xmin, xmax, ay, y0, Breite
  DIM AS INTEGER xlo, ylo, xru, yru, i

  VIEW
  WINDOW SCREEN

  'Pixelkoordinaten des Darstellungsfeldes: xlo = xlinksoben usw.
  xlo = 8 * 15  'Textspalte 15
  ylo = 16 * 2  'Textzeile 2
  xru = 8 * 75  'Textspalte 75
  yru = 16 * 22 'Textzeile 22

  'Beschriftung vertikale Achse:
  OutText(xlo, ylo, STR(ymax) + SPACE(1), "r")
  OutText(xlo, yru, STR(ymin) + SPACE(1), "r")
  OutText(xlo, (ylo + yru) / 2, vert + SPACE(1), "r")

  'Beschriftung horizontale Achse:
  FOR i = 0 TO n
    OutText(xlo + (xru - xlo) * (i + 0.5) / (n + 1), yru + 16, STR(x(i)), "z")
  NEXT i
  OutText((xlo + xru) / 2, yru + 32, hor, "z")

  'Bildunterschrift:
  OutText((xlo + xru) / 2, yru + 48, Text, "z")

  'Fenster fuer Graphik in Sichtkoordinaten definieren:
  VIEW (xlo, ylo)-(xru, yru)
  xmin = 0: xmax = 100
  WINDOW (xmin, ymin)-(xmax, ymax)

  'Rahmen zeichnen:
  LINE (xmin, ymin)-(0.995 * xmax, 0.995 * ymax), , B

  'Teilung vertikale Achse:
  ay = 0.995 * (ymax - ymin) / ny
  FOR i = 0 TO ny
    y0 = ymin + i * ay
    LINE (xmin, y0)-(xmax, y0)
  NEXT i

  'Balken zeichnen:
  Breite = 0.8 * (xmax - xmin) / (n + 1)
  FOR i = 0 TO n
    Balkenpos(i) = xmin + (i + 0.1) * (xmax - xmin) / (n + 1)
    LINE(Balkenpos(i), 0) - (Balkenpos(i) + Breite, y(i)), Farbe, BF
  NEXT i

END SUB


SUB Kreisdiagramm(x() AS STRING, y() AS SINGLE, n AS INTEGER, Text AS STRING)
  '- x(0) bis x(n) = Bezeichnung der Kreissegmente
  '- y(0) bis y(n) = Wert der Kreissegmente
  '- n + 1         = Anzahl der Kreissegmente
  '- Text          = Bildunterschrift

  DIM AS SINGLE alpha(n), r, sum, xp, yp, beta
  DIM AS INTEGER i, x0, y0
  CONST pi = 3.141593

  VIEW
  WINDOW SCREEN

  'Diagramm berechnen und segmentweise zeichnen (alpha(0) bis alpha(n) sind
  'die zu y(0) bis y(n) zugehoerigen Winkel im Kreis:
  x0 = 320
  y0 = 200
  r = 160
  sum = 0
  FOR i = 0 TO n
    sum = sum + y(i)
  NEXT i
  alpha(0) = 2 * pi * y(0) / sum
  FOR i = 1 TO n
    alpha(i) = 2 * pi * y(i) / sum + alpha(i - 1)
  NEXT i

  CIRCLE (x0, y0), r,, 0, -alpha(0)
  FOR i = 1 TO n
    CIRCLE (x0, y0), r,, alpha(i - 1), -alpha(i)
  NEXT i

  'Diagramm-Segmente faerben und beschriften:
  FOR i = 0 TO n
    IF i = 0 THEN beta = alpha(0) / 2 ELSE beta = (alpha(i) + alpha(i - 1)) / 2
    xp = x0 + 0.5 * r * COS(beta)
    yp = y0 - 0.5 * r * SIN(beta)
    PAINT (xp, yp), i MOD 15, LOWORD(COLOR)
    xp = x0 + 1.1 * r * COS(beta)
    yp = y0 - 1.1 * r * SIN(beta)
    IF alpha(i) > pi/2 AND alpha(i) < 3*pi/2 THEN
      OutText(xp, yp, x(i) + ": " + STR(y(i)), "r")
    ELSE
      OutText(xp, yp, x(i) + ": " + STR(y(i)), "l")
    END IF
  NEXT i

  'Bildunterschrift:
  LOCATE 25, (80 - LEN(Text)) / 2
  PRINT Text

END SUB

Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 07.09.2007 von MitgliedLothar Schirm angelegt.
  • Die aktuellste Version wurde am 08.09.2007 von MitgliedLothar Schirm gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen