www.pudn.com > CG2Programs.rar > lineChart.c
/* lineChart, Chapter 3, p. 136 */ /* EXAMPLE STARTS HERE */ #include#include "graphics.h" #define WINDOW_WIDTH 600 #define WINDOW_HEIGHT 500 /* Amount of space to leave on each side of the chart */ #define MARGIN_WIDTH 0.05 * WINDOW_WIDTH #define N_DATA 12 typedef enum { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec } Months; char * monthNames[N_DATA] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; int readData (char * inFile, float * data) { int fileError = FALSE; FILE * fp; Months month; if ((fp = fopen (inFile, "r")) == NULL) fileError = TRUE; else { for (month = Jan; month <= Dec; month++) fscanf (fp, "%f", &data[month]); fclose (fp); } return (fileError); } void lineChart (float * data) { wcPt2 dataPos[N_DATA], labelPos; Months m; float mWidth = (WINDOW_WIDTH - 2 * MARGIN_WIDTH) / N_DATA; int chartBottom = 0.1 * WINDOW_HEIGHT; int offset = 0.05 * WINDOW_HEIGHT; /* Space between data and labels */ int labelLength = 24; /* Assuming fixed-width 8-pixel characters */ labelPos.y = chartBottom; for (m = Jan; m <= Dec; m++) { /* Calculate x and y positions for data markers */ dataPos[m].x = MARGIN_WIDTH + m * mWidth + 0.5 * mWidth; dataPos[m].y = chartBottom + offset + data[m]; /* Shift the label to the left by one-half its length */ labelPos.x = dataPos[m].x - 0.5 * labelLength; pText (labelPos, monthNames[m]); } pPolyline (N_DATA, dataPos); pPolymarker (N_DATA, dataPos); } void main (int argc, char ** argv) { float data[N_DATA]; int dataError = FALSE; long windowID; if (argc < 2) { fprintf (stderr, "Usage: %s dataFileName\n", argv[0]); exit (); } dataError = readData (argv[1], data); if (dataError) { fprintf (stderr, "%s error. Can't read file %s\n", argv[1]); exit (); } windowID = openGraphics (*argv, WINDOW_WIDTH, WINDOW_HEIGHT); setBackground (WHITE); setColor (BLACK); lineChart (data); sleep (10); closeGraphics (windowID); } /* EXAMPLE ENDS HERE */