字符时钟的C程序 妈阿,有这么牛的呢,我孤陋寡闻了

http://www.chinaunix.net/bbsjh/4/7363.html

 

/*
 * =====================================================================================
 *
 *       Filename:  tclock.c
 *
 *    Description: 
 *
 *        Version:  1.0
 *        Created:  02/03/2011 09:24:38 AM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  YOUR NAME (),
 *        Company: 
 *
 * =====================================================================================
 */
/* 文件名:tclock.c  */


#include "test.priv.h"

#include <math.h>
#include <time.h>


/* 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 pair, 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;

   if (has_colors())
attrset(COLOR_PAIR(pair));

   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;
   int ch;
   int lastbeep = -1;
   time_t tim;
   struct tm *t;
   char szChar[10];
   int my_bg = COLOR_BLACK;

   initscr();
   noecho();
   cbreak();
   nodelay(stdscr, TRUE);
   curs_set(0);

   if (has_colors()) {
start_color();
#if HAVE_USE_DEFAULT_COLORS
if (use_default_colors() == OK)
   my_bg = -1;
#endif
init_pair(1, COLOR_RED, my_bg);
init_pair(2, COLOR_MAGENTA, my_bg);
init_pair(3, COLOR_GREEN, my_bg);
   }
#ifdef KEY_RESIZE
   keypad(stdscr, TRUE);
 restart:
#endif
   cx = (COLS - 1) / 2;/* 39 */
   cy = LINES / 2;/* 12 */
   ch = (cx > cy) ? cy : cx;/* usually cy */
   mradius = (3 * cy) / 4;/* 9 */
   hradius = cy / 2;/* 6 */
   sradius = (2 * cy) / 3;/* 8 */

   for (i = 0; i < 12; i++) {
sangle = (i + 1) * (2.0 * PI) / 12.0;
sradius = (5 * cy) / 6;/* 10 */
sdx = A2X(sangle, sradius);
sdy = A2Y(sangle, sradius);
sprintf(szChar, "%d", i + 1);

mvaddstr(cy - sdy, cx + sdx, szChar);
   }

   mvaddstr(0, 25, "SCO OpenServer 5下的字符时钟");

   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);

dline(3, cx, cy, cx + mdx, cy - mdy, '#');

attrset(A_REVERSE);
dline(2, cx, cy, cx + hdx, cy - hdy, '.');
attroff(A_REVERSE);

if (has_colors())
   attrset(COLOR_PAIR(1));

plot(cx + sdx, cy - sdy, 'O');

if (has_colors())
   attrset(COLOR_PAIR(0));

mvaddstr(LINES - 2, 0, ctime(&tim));
refresh();
if ((t->tm_sec % 5) == 0
&& t->tm_sec != lastbeep) {
   lastbeep = t->tm_sec;
   beep();
}

if ((ch = getch()) != ERR) {
#ifdef KEY_RESIZE
   if (ch == KEY_RESIZE) {
erase();
goto restart;
   }
#endif
   break;
}

plot(cx + sdx, cy - sdy, ' ');
dline(0, cx, cy, cx + hdx, cy - hdy, ' ');
dline(0, cx, cy, cx + mdx, cy - mdy, ' ');

   }

   curs_set(1);
   endwin();
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值