#include #include #include #include #include /* for ioctl() and struct winsize*/ void drawLine (int m, int n, int x, int y, char *cell, int pause) { int dx, dy, dx2, dy2, f, inc, celli=0; char *dir; printf ("\e[%d;%dH", n+1, m+1); dx=x-m; dy=y-n; if (abs(dy) <= abs(dx)) { if (dx<0) { // Draw right to left inc = -1; dx *= -1; } else { // Draw left to right inc = 1; } if (dy<0) { dir="\e[A"; // IV.2 and II2 dy *= -1; } else { // I.1 and III1 dir = "\e[B"; } dx2=dx+dx, dy2=dy+dy; f=dy2-dx; while (printf ("%c", cell[celli++]), m != x) { if (!cell[celli]) celli=0; pause && usleep(pause*1000); m += inc; if (inc == -1) { printf (""); } if (f>0) { f -= dx2; printf (dir); } f = f + dy2; } } else { dx ^= dy; dy ^= dx; dx ^= dy; if (dx<0) { // Draw right to left inc = -1; dx *= -1; } else { // Draw left to right inc = 1; } if (dy<0) { dir="\e[D"; // IV.2 and II2 dy *= -1; } else { // I.1 and III1 dir = "\e[C"; } dx2=dx+dx, dy2=dy+dy; f=dy2-dx; while (printf ("%c", cell[celli++]), n != y) { if (!cell[celli]) celli=0; pause && usleep(pause*1000); n += inc; if (inc == -1) { printf ("\e[A"); } else { printf ("\e[B"); } if (f>0) { f -= dx2; printf (dir); } f = f + dy2; } } } int newrand (void) { static int i[] = {1, -1, 2, -2, 3, -3, 4, -4}; return i[random()%4]; } int main (int argc, char *argv[]) { struct winsize win; int width, height; int d=50, i=0; int m, n, x, y; int mi, ni, xi, yi; srandom(time(0)); ioctl(1, TIOCGWINSZ, &win); width = win.ws_col; height = win.ws_row; if (argc!=2) { printf ("Usage:: qix delay" " Plots animated qix line with delay.\n" " Default value: %d\n", d); } else { d = atoi(argv[1]); } setbuf(stdout, NULL); printf ("\e[0m\e[?25l"); width*=4; height*=4; x=random()%width; y=random()%height; m=random()%width; n=random()%height; mi=newrand(); ni=newrand(); xi=newrand(); yi=newrand(); loop: d && usleep(d*10); if (!(++i%50)) { printf ("\e7\e[0m\e[%dH\n\e8", height); n--; y--; if (!(i%100)) printf ("\e[4%dm", (random()%7)+1); } drawLine (m>>2, n>>2, x>>2, y>>2, " ", 0); m += mi; n += ni; x += xi; y += yi; if (m<0) { m=0; mi=newrand(); } if (m>=width) { m=width; mi=newrand(); } if (n<0) { n=0; ni=newrand(); } if (n>=height) { n=height; ni=newrand(); } if (x<0) { x=0; xi=newrand(); } if (x>=width) { x=width; xi=newrand(); } if (y<0) { y=0; yi=newrand(); } if (y>=height) { y=height; yi=newrand(); } goto loop; return 0; }