home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
ncurses-1.9.9e-src.tgz
/
tar.out
/
fsf
/
ncurses
/
test
/
tclock.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-28
|
3KB
|
178 lines
#include <stdio.h>
#include <float.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <curses.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)
/* 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, char **argv)
{
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=2.0*sradius*sin(sangle);
sdy=sradius*cos(sangle);
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;
while(1)
{
sleep(1);
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=2.0*mradius*sin(mangle);
mdy=mradius*cos(mangle);
hangle=(hours)*(2.0*PI)/12.0;
hdx=2.0*hradius*sin(hangle);
hdy=hradius*cos(hangle);
sangle=(t->tm_sec%60)*(2.0*PI)/60.0;
sdx=2.0*sradius*sin(sangle);
sdy=sradius*cos(sangle);
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();
plot(cx+sdx,cy-sdy,' ');
dline(cx,cy,cx+hdx,cy-hdy,' ');
dline(cx,cy,cx+mdx,cy-mdy,' ');
}
return 0;
}