#include /* * Obfuscated version is simpler but can't display labels. */ char graphtab[] = " ..,.;:j'::;';!|._:,;;;j/;;;jjjj.,-,r;==gg':SS///+:\\\\\\r\\:=;;??]]:;;;>2>\\F;O;7?]7;;;;?2>b;;;;??]#'\\\\\\`\\\\\\''<5\"\"Vq;\\\\\\`=\\\\''55\"?ggILLLD\\bfF[[[P?#M|||||#+#T[FFP?PM'" ; #define BITROWS 96 #define BITCOLS 160 #define SCREENROWS 23 /* one less so doesn't scroll off screen */ #define SCREENCOLS 79 /* one less so doesn't scroll off screen */ char framebuffer[BITROWS][BITCOLS]; char screen[SCREENROWS][SCREENCOLS]; #define BITSET(r, c) framebuffer[r][c] = 1; #define BITCLR(r, c) framebuffer[r][c] = 0; double f(); double atof(); /* row and column boundaries in frame buffer */ int minr= 10; int maxr= 80; int minc= 20; int maxc=150; /* x and y boundaries in formula */ double maxy= 500; double miny=-500; double maxx= 10; double minx= -20; double three, two, one, zero; /* coefficients */ double xbase, ybase; main(argc, argv) char **argv; { double x, y; char labbuf[100]; if (argc < 5) { printf("Usage: %s cube square linear constant\n", argv[0]); exit(1); } /* Arguments are four coefficients to polynomial */ three = atof(argv[1]); two = atof(argv[2]); one = atof(argv[3]); zero = atof(argv[4]); gbox(minr,maxr,minc-2,maxc+2); plotinit(); for (x=minx; x<=maxx; x += .05) { fplot(x, f(x)); } bitshow(); hlabel(minr-4, (maxc+minc)/2 - 10, "A Cubic Function"); sprintf(labbuf, "y=%gx^3+%gx^2+%gx+%g", three, two, one, zero); vlabel(12, 5, labbuf); hlabel(maxr+4, (maxc+minc)/2, "x"); sprintf(labbuf, "%g", minx); hlabel(maxr+4, minc, labbuf); sprintf(labbuf, "%g", maxx); hlabel(maxr+4, maxc-strlen(labbuf)*2, labbuf); sprintf(labbuf, "%g", miny); vlabel(minr+4, minc-4, labbuf); sprintf(labbuf, "%g", maxy); vlabel(maxr-strlen(labbuf)*4, minc-4, labbuf); /* bigshow(20, 55, 0, 70); */ srefresh(); } double f(x) double x; { double y; y = three*x*x*x + two*x*x + one*x + zero; return y; } fplot(x, y) double x, y; { int r, c; r = (maxy - y) * ybase + minr; c = (x - minx) * xbase + minc; if (r >= minr && r <= maxr && c >= minc && c <= maxc) BITSET(r, c); } hlabel(r, c, lab) int r, c; char *lab; { r = r/4; c = c/2; while (*lab) screen[r][c++] = *lab++; } vlabel(r, c, lab) int r, c; char *lab; { r = r/4; c = c/2; while (*lab && r