diff options
author | peter <peter@FreeBSD.org> | 1999-08-24 01:06:48 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1999-08-24 01:06:48 +0000 |
commit | bacd15cb1fff2dee94d390e0f84c147cd82ea148 (patch) | |
tree | ad214c5b2c8142ad6dc6d2ce3a9c83e6317d7f77 /contrib/ncurses/test/tclock.c | |
download | FreeBSD-src-bacd15cb1fff2dee94d390e0f84c147cd82ea148.zip FreeBSD-src-bacd15cb1fff2dee94d390e0f84c147cd82ea148.tar.gz |
Import unmodified (but trimmed) ncurses 5.0 prerelease 990821.
This contains the full eti (panel, form, menu) extensions.
bmake glue to follow.
Obtained from: ftp://ftp.clark.net/pub/dickey/ncurses
Diffstat (limited to 'contrib/ncurses/test/tclock.c')
-rw-r--r-- | contrib/ncurses/test/tclock.c | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/contrib/ncurses/test/tclock.c b/contrib/ncurses/test/tclock.c new file mode 100644 index 0000000..bccce31 --- /dev/null +++ b/contrib/ncurses/test/tclock.c @@ -0,0 +1,184 @@ +#include "test.priv.h" + +#include <float.h> +#include <math.h> +#include <time.h> + +/* + tclock - analog/digital clock for curses. + If it gives you joy, then + (a) I'm glad + (b) you need to get out more :-) + + This program is copyright Howard Jones, September 1994 + (ha.jones@ic.ac.uk). It may be freely distributed as + long as this copyright message remains intact, and any + modifications are clearly marked as such. [In fact, if + you modify it, I wouldn't mind the modifications back, + especially if they add any nice features. A good one + would be a precalc table for the 60 hand positions, so + that the floating point stuff can be ditched. As I said, + it was a 20 hackup minute job.] + + COMING SOON: tfishtank. Be the envy of your mac-owning + colleagues. +*/ + +/* To compile: cc -o tclock tclock.c -lcurses -lm */ + +#ifndef PI +#define PI 3.141592654 +#endif + +#define sign(_x) (_x<0?-1:1) + +#define ASPECT 2.2 +#define ROUND(value) ((int)((value) + 0.5)) + +#define A2X(angle,radius) ROUND(ASPECT * radius * sin(angle)) +#define A2Y(angle,radius) ROUND(radius * cos(angle)) + +/* Plot a point */ +static void +plot(int x,int y,char col) +{ + mvaddch(y,x,(chtype)col); +} + + +/* Draw a diagonal(arbitrary) line using Bresenham's alogrithm. */ +static void +dline(int from_x, int from_y, int x2, int y2, char ch) +{ + int dx,dy; + int ax,ay; + int sx,sy; + int x,y; + int d; + + dx=x2-from_x; + dy=y2-from_y; + + ax=abs(dx*2); + ay=abs(dy*2); + + sx=sign(dx); + sy=sign(dy); + + x=from_x; + y=from_y; + + if(ax>ay) + { + d=ay-(ax/2); + + while(1) + { + plot(x,y,ch); + if(x==x2) return; + + if(d>=0) + { + y+=sy; + d-=ax; + } + x+=sx; + d+=ay; + } + } + else + { + d=ax-(ay/2); + + while(1) + { + plot(x,y,ch); + if(y==y2) return; + + if(d>=0) + { + x+=sx; + d-=ay; + } + y+=sy; + d+=ax; + } + } +} + +int +main( + int argc GCC_UNUSED, + char *argv[] GCC_UNUSED) +{ + int i,cx,cy; + double mradius, hradius, mangle, hangle; + double sangle, sradius, hours; + int hdx, hdy; + int mdx, mdy; + int sdx, sdy; + time_t tim; + struct tm *t; + char szChar[10]; + + initscr(); + noecho(); + + cx=39; + cy=12; + mradius=9; + hradius=6; + sradius=8; + + for(i=0;i<12;i++) + { + sangle=(i+1)*(2.0*PI)/12.0; + sradius=10; + sdx = A2X(sangle, sradius); + sdy = A2Y(sangle, sradius); + sprintf(szChar,"%d",i+1); + + mvaddstr((int)(cy-sdy),(int)(cx+sdx),szChar); + } + + mvaddstr(0,0,"ASCII Clock by Howard Jones (ha.jones@ic.ac.uk),1994"); + + sradius=8; + for(;;) + { + napms(1000); + + tim = time(0); + t = localtime(&tim); + + hours = (t->tm_hour + (t->tm_min/60.0)); + if(hours>12.0) hours -= 12.0; + + mangle = ((t->tm_min) * (2 * PI)/60.0); + mdx = A2X(mangle, mradius); + mdy = A2Y(mangle, mradius); + + hangle = ((hours) * (2.0 * PI)/12.0); + hdx = A2X(hangle, hradius); + hdy = A2Y(hangle, hradius); + + sangle = ((t->tm_sec) * (2.0 * PI)/60.0); + sdx = A2X(sangle, sradius); + sdy = A2Y(sangle, sradius); + + plot(cx+sdx,cy-sdy,'O'); + dline(cx,cy,cx+hdx,cy-hdy,'.'); + dline(cx,cy,cx+mdx,cy-mdy,'#'); + + mvaddstr(23,0,ctime(&tim)); + refresh(); + if ((t->tm_sec % 5) == 0) beep(); + + plot(cx+sdx,cy-sdy,' '); + dline(cx,cy,cx+hdx,cy-hdy,' '); + dline(cx,cy,cx+mdx,cy-mdy,' '); + + } + + return 0; +} |