home *** CD-ROM | disk | FTP | other *** search
- /* PLANETS.C - Beispiel aus Kapitel 4 der
- Einführung */
-
- #include <graphics.h> /* für Funktionen der
- Grafik-Bibliothek */
- #include <stdlib.h> /* für exit() */
- #include <stdio.h>
- #include <conio.h>
-
- /* initialisiert die Grafik */
- int set_graph(void);
-
- /* Skaleneinteilung am Bildschirm */
- void calc_coords(void);
-
- /* zum Zeichnen und Ausfüllen der Planeten */
- void draw_planets(void);
-
- /* zeichnet einen Planeten */
- void draw_planet(float x_pos, float radius,
- int color, int fill_style);
-
- /* zeigt Text auf dem Bildschirm und
- wartet auf einen Tastendruck */
- void get_key(void);
-
-
- /* Globale Variablen -- werden von
- calc_coords() initialisiert */
- int max_x, max_y; /* Maximum der x- und
- y-Koordinaten */
- int y_org; /* y-Koordinate für alle
- Zeichnungen */
- int au1; /* Eine astronomische Einheit in
- Pixels (innere Planeten) */
- int au2; /* Eine astronomische Einheit in
- Pixels (äußere Planeten) */
- int erad; /* Erdradius in Pixels */
-
- int main()
- {
- /* Herausfinden, ob die Bedingungen erfüllt
- sind und Ende, falls nicht EGA oder VGA */
- if (set_graph() != 1)
- {
- printf("Dieses Programm erfordert EGA "
- "oder VGA\n");
- exit(0);
- }
-
- calc_coords(); /* Skaleneinteilung entsprechend
- der Grafikkarte */
- draw_planets(); /* Sonne bis Uranus (kein Raum
- für weitere) */
- get_key(); /* Meldung zeigen und auf
- Tastendruck warten */
- closegraph(); /* Das Grafiksystem
- schließen */
-
- return 0;
- }
-
- int set_graph(void)
- {
- int graphdriver = DETECT,
- graphmode, error_code;
-
- /* Grafiksystem initialisieren; Basis ist
- EGA oder VGA; die BGI-Dateien werden im
- Directory ..\\BGI des aktuellen
- Laufwerks erwartet */
- initgraph(&graphdriver, &graphmode, "..\\bgi");
- error_code = graphresult();
-
- /* Keine grafikfähige Hardware gefunden */
- if (error_code != grOk)
- return(-1);
-
- /* weder EGA noch VGA */
- if ((graphdriver != EGA) && (graphdriver != VGA))
- {
- closegraph();
- return 0;
- }
-
- /* Grafik ist OK, also "true" zurückgegeben */
- return(1);
- }
-
- void calc_coords(void)
- {
- /* Globale Variablen für die Zeichnung
- initialisieren */
- max_x = getmaxx(); /* max. x-Koordinate */
- max_y = getmaxy(); /* max. y-Koordinate */
- y_org = max_y / 2; /* Y-Koordinate für alle
- Objekte */
- erad = max_x / 200; /* Erdradius in Pixels */
- au1 = erad * 20; /* Maßstab für die inneren
- Planeten */
- au2 = erad * 10; /* Maßstab für die äußeren
- Planeten */
- }
-
- void draw_planets()
- {
- /* Jeder Aufruf definiert die x-Koordinate in
- AU («astronomical unit»), Radius und Farbe */
-
- /* Sonne */
- draw_planet(-90, 100,
- EGA_YELLOW, EMPTY_FILL);
-
- /* Merkur */
- draw_planet(0.4 * au1, 0.4 * erad,
- EGA_BROWN, LTBKSLASH_FILL);
-
- /* Venus */
- draw_planet(0.7 * au1, 1.0 * erad,
- EGA_WHITE, SOLID_FILL);
-
- /* Erde */
- draw_planet(1.0 * au1, 1.0 * erad,
- EGA_LIGHTBLUE, SOLID_FILL);
-
- /* Mars */
- draw_planet(1.5 * au1, 0.4 * erad,
- EGA_LIGHTRED, CLOSE_DOT_FILL);
-
- /* Jupiter */
- draw_planet(5.2 * au2, 11.2 * erad,
- EGA_WHITE, LINE_FILL);
-
- /* Saturn */
- draw_planet(9.5 * au2, 9.4 * erad,
- EGA_LIGHTGREEN, LINE_FILL);
-
- /* Uranus */
- draw_planet(19.2 * au2, 4.2 * erad,
- EGA_GREEN, LINE_FILL);
- }
-
- void draw_planet(float x_pos, float radius,
- int color, int fill_style)
- {
- /* setzt die Farbe, in der gezeichnet wird */
- setcolor (color);
-
- /* zeichnet den Kreis */
- circle(x_pos, y_org, radius);
-
- /* setzt das Füllmuster */
- setfillstyle(fill_style, color);
-
- /* füllt den Kreis */
- floodfill(x_pos, y_org, color);
- }
-
- void get_key(void)
- {
- /* gibt eine Meldung aus und wartet
- auf einen Tastendruck */
- outtextxy(50, max_y - 20,
- "Um zu beenden, eine Taste drücken");
- getch();
- }