home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / tcpp / examples / planets.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-10  |  4.3 KB  |  167 lines

  1. /* PLANETS.C - Beispiel aus Kapitel 4 der
  2.    Einführung */
  3.  
  4. #include <graphics.h>  /* für Funktionen der
  5.                           Grafik-Bibliothek */
  6. #include <stdlib.h>    /* für exit() */
  7. #include <stdio.h>
  8. #include <conio.h>
  9.  
  10. /* initialisiert die Grafik */
  11. int set_graph(void);
  12.  
  13. /* Skaleneinteilung am Bildschirm */            
  14. void calc_coords(void);
  15.  
  16. /* zum Zeichnen und Ausfüllen der Planeten */
  17. void draw_planets(void);
  18.  
  19. /* zeichnet einen Planeten */
  20. void draw_planet(float x_pos, float radius,
  21.                  int color, int fill_style);
  22.  
  23. /* zeigt Text auf dem Bildschirm und
  24.    wartet auf einen Tastendruck */
  25. void get_key(void);
  26.  
  27.  
  28. /* Globale Variablen -- werden von
  29.    calc_coords() initialisiert */
  30. int max_x, max_y; /* Maximum der x- und
  31.                      y-Koordinaten */
  32. int y_org;        /* y-Koordinate für alle
  33.                      Zeichnungen */
  34. int au1;          /* Eine astronomische Einheit in
  35.                      Pixels (innere Planeten) */
  36. int au2;          /* Eine astronomische Einheit in
  37.                      Pixels (äußere Planeten) */
  38. int erad;         /* Erdradius in Pixels */
  39.  
  40. int main()
  41. {
  42.    /* Herausfinden, ob die Bedingungen erfüllt
  43.       sind und Ende, falls nicht EGA oder VGA */
  44.    if (set_graph() != 1)
  45.    {
  46.       printf("Dieses Programm erfordert EGA "
  47.              "oder VGA\n");
  48.       exit(0);
  49.    }
  50.  
  51.    calc_coords();  /* Skaleneinteilung entsprechend
  52.                       der Grafikkarte */
  53.    draw_planets(); /* Sonne bis Uranus (kein Raum
  54.                       für weitere) */
  55.    get_key();      /* Meldung zeigen und auf
  56.                       Tastendruck warten */
  57.    closegraph();   /* Das Grafiksystem
  58.                       schließen */
  59.  
  60.    return 0;
  61. }
  62.  
  63. int set_graph(void)
  64. {
  65.    int graphdriver = DETECT,
  66.        graphmode, error_code;
  67.  
  68.    /* Grafiksystem initialisieren; Basis ist
  69.       EGA oder VGA; die BGI-Dateien werden im
  70.       Directory ..\\BGI des aktuellen
  71.       Laufwerks erwartet */
  72.    initgraph(&graphdriver, &graphmode, "..\\bgi");
  73.    error_code = graphresult();
  74.  
  75.    /* Keine grafikfähige Hardware gefunden */
  76.    if (error_code != grOk)     
  77.       return(-1);
  78.  
  79.    /* weder EGA noch VGA */
  80.    if ((graphdriver != EGA) && (graphdriver != VGA))
  81.    {
  82.       closegraph();
  83.       return 0;
  84.    }
  85.  
  86.    /* Grafik ist OK, also "true" zurückgegeben */
  87.    return(1);                   
  88. }
  89.  
  90. void calc_coords(void)
  91. {
  92.    /* Globale Variablen für die Zeichnung
  93.       initialisieren */
  94.    max_x = getmaxx();    /* max. x-Koordinate */
  95.    max_y = getmaxy();    /* max. y-Koordinate */
  96.    y_org = max_y / 2;    /* Y-Koordinate für alle
  97.                             Objekte */
  98.    erad = max_x  / 200;  /* Erdradius in Pixels */
  99.    au1 = erad * 20;      /* Maßstab für die inneren
  100.                             Planeten */
  101.    au2 = erad * 10;      /* Maßstab für die äußeren
  102.                             Planeten */
  103. }
  104.  
  105. void draw_planets()
  106. {
  107.    /* Jeder Aufruf definiert die x-Koordinate in
  108.       AU («astronomical unit»), Radius und Farbe */
  109.  
  110.    /* Sonne */
  111.    draw_planet(-90, 100,
  112.                EGA_YELLOW, EMPTY_FILL);
  113.  
  114.    /* Merkur */
  115.    draw_planet(0.4 * au1, 0.4 * erad,
  116.                EGA_BROWN, LTBKSLASH_FILL);
  117.  
  118.    /* Venus */
  119.    draw_planet(0.7 * au1, 1.0 * erad,
  120.                EGA_WHITE, SOLID_FILL);
  121.  
  122.    /* Erde */
  123.    draw_planet(1.0 * au1, 1.0 * erad,
  124.                EGA_LIGHTBLUE, SOLID_FILL);
  125.  
  126.    /* Mars */
  127.    draw_planet(1.5 * au1, 0.4 * erad,
  128.                EGA_LIGHTRED, CLOSE_DOT_FILL);
  129.  
  130.    /* Jupiter */
  131.    draw_planet(5.2 * au2, 11.2 * erad,
  132.                EGA_WHITE, LINE_FILL);
  133.  
  134.    /* Saturn */
  135.    draw_planet(9.5 * au2, 9.4 * erad,
  136.                EGA_LIGHTGREEN, LINE_FILL);
  137.  
  138.    /* Uranus */
  139.    draw_planet(19.2 * au2, 4.2 * erad,
  140.                EGA_GREEN, LINE_FILL);
  141. }
  142.  
  143. void draw_planet(float x_pos, float radius,
  144.                  int color, int fill_style)
  145. {
  146.    /* setzt die Farbe, in der gezeichnet wird */
  147.    setcolor (color);
  148.  
  149.    /* zeichnet den Kreis */
  150.    circle(x_pos, y_org, radius);
  151.  
  152.    /* setzt das Füllmuster */
  153.    setfillstyle(fill_style, color);
  154.  
  155.    /* füllt den Kreis */
  156.    floodfill(x_pos, y_org, color);
  157. }
  158.  
  159. void get_key(void)
  160. {
  161.    /* gibt eine Meldung aus und wartet
  162.       auf einen Tastendruck */
  163.    outtextxy(50, max_y - 20,
  164.              "Um zu beenden, eine Taste drücken");
  165.    getch();
  166. }
  167.