clock.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:5k
开发平台:

MultiPlatform

  1. #include <LEDA/window.h>
  2. #include <time.h>
  3. #include <math.h>
  4. const char* month[] =
  5. { "Januar",
  6.   "Februar",
  7.   "Maerz",
  8.   "April",
  9.   "Mai",
  10.   "Juni",
  11.   "Juli",
  12.   "August",
  13.   "September",
  14.   "Oktober",
  15.   "November",
  16.   "Dezember"
  17.  };
  18. float radius;
  19. float mx,my;
  20. int   h;
  21. int   m;
  22. int   s;
  23. string  datum;
  24. window* Wp;
  25. color face_color   = white;
  26. color text_color   = black;
  27. color min_color    = white;
  28. color hour_color   = white;
  29. bool  seconds      = false;
  30. list<point> make_hand(float rad, float l1, float l2,float pos)
  31. { circle c(mx,my,rad);
  32.   float  phi = 2*LEDA_PI*pos/60;
  33.   point  p(mx+l1*sin(phi),my+l1*cos(phi));
  34.   double l = c.left_tangent(p).direction();
  35.   double r = c.right_tangent(p).direction();
  36.   list<point> L;
  37.   L.append(p);
  38.   L.append(p.translate(l,l2));
  39.   L.append(p.translate(r,l2));
  40.   return L;
  41. }
  42. void hour_hand(float pos,int mode)
  43.   float  length = 0.65 * radius;
  44.   color      bg = (hour_color == black) ? white : black;
  45.   list<point> P = make_hand(radius/11,length,1.3*length,pos);
  46.   if (mode==0) // erase
  47.     { Wp->draw_filled_polygon(P,face_color);
  48.       Wp->draw_polygon(P,face_color);
  49.      }
  50.   else         // draw
  51.     { Wp->draw_filled_polygon(P,hour_color);
  52.       Wp->draw_polygon(P,bg);
  53.      }
  54. }
  55. void min_hand(float pos,int mode)
  56.   float  length = 0.95*radius;
  57.   color      bg = (min_color == black) ? white : black;
  58.   list<point> P = make_hand(radius/13,length,1.20*length,pos);
  59.   if (mode==0) // erase
  60.     { Wp->draw_filled_polygon(P,face_color);
  61.       Wp->draw_polygon(P,face_color);
  62.      }
  63.   else         // draw
  64.     { Wp->draw_filled_polygon(P,min_color);
  65.       Wp->draw_polygon(P,bg);
  66.       Wp->draw_disc(mx,my,radius/35,bg);
  67.      }
  68. }
  69. void sec_hand(float pos)
  70.   float  length = 0.95*radius;
  71.   color      bg = (min_color == black) ? white : black;
  72.   list<point> P = make_hand(radius/60,length,1.15*length,pos);
  73.   Wp->set_mode(xor_mode);
  74.   Wp->draw_filled_polygon(P,orange);
  75.   Wp->set_mode(src_mode);
  76.   Wp->draw_disc(mx,my,radius/35,bg);
  77. }
  78. void draw_clock()
  79.   int i;
  80.   float x,y;
  81.   mx = (Wp->xmax()-Wp->xmin())/2;
  82.   my = (Wp->ymax()-Wp->ymin())/2;
  83.   radius = (mx < my) ? 0.9*mx : 0.9*my;
  84.   Wp->clear();
  85.   Wp->draw_disc(mx,my,1.1*radius,face_color);
  86.   Wp->draw_circle(mx,my,1.1*radius,black);
  87.   for(i = 1; i<=12; i++)
  88.   { x = mx + radius*sin(2*LEDA_PI*i/12);
  89.     y = my + radius*cos(2*LEDA_PI*i/12);
  90.     Wp->draw_disc(x,y,radius/30,text_color);
  91.    }
  92.   long clock; 
  93.   time(&clock);
  94.   tm* T = localtime(&clock);
  95.   s = T->tm_sec;
  96.   m = T->tm_min;
  97.   h = T->tm_hour;
  98.   datum = string("%d. %s 19%0d",T->tm_mday,month[T->tm_mon], T->tm_year%100);
  99.   Wp->set_frame_label(datum);
  100.   hour_hand(5*(h+m/60.0),1);
  101.   min_hand(m,1);
  102.   if (seconds) sec_hand(s);
  103. }
  104. void move_hands(int hour, int min, int sec)
  105.   if (seconds && sec != s) sec_hand(s);
  106.   if (min != m || hour != h)
  107.   { min_hand(m,0);
  108.     hour_hand(5*(h+m/60.0),0);
  109.     hour_hand(5*(hour+min/60.0),1);
  110.     min_hand(min,1);
  111.    }
  112.   if (seconds && sec != s) sec_hand(sec);
  113.   s = sec;
  114.   m = min;
  115.   h = hour;
  116.  }
  117. void sync_time()
  118. { long clock; 
  119.   time(&clock);
  120.   tm* T = localtime(&clock); 
  121.   while (T->tm_sec > 50)
  122.   { wait(1);
  123.     time(&clock);
  124.     T = localtime(&clock); 
  125.    } 
  126.   move_hands(T->tm_hour,T->tm_min,T->tm_sec);
  127.   if (h+m+s == 0) 
  128.   { datum = string("%d. %s 19%0d",T->tm_mday,month[T->tm_mon], T->tm_year%100);
  129.     Wp->set_frame_label(datum);
  130.    }
  131.  }
  132. void demo()
  133. { for(int h = 0; h < 12; h++)
  134.      for(int m = 0; m < 60; m++)
  135.        for(int s = 0; s < 60; s++)
  136.           move_hands(h,m,s);
  137.  }
  138. #if defined(__MSDOS__)
  139. int wait_a_second()
  140. { long clock; 
  141.   time(&clock);
  142.   long clock1 = clock; 
  143.   while (clock1 == clock && Wp->get_button() == 0) time(&clock1);
  144.   return (clock1 == clock);
  145. }
  146. #else
  147. int wait_a_second()
  148. { wait(0.95);
  149.   return Wp->get_button();
  150. }
  151. #endif
  152. main(int argc, char** argv)
  153. {  
  154.   int height = 2*window::screen_height()/3;
  155.   int width  = height;
  156.   int xpos   = 0;
  157.   int ypos   = 0;
  158.   if (argc > 1)
  159.   { if (argc == 3)
  160.       { width  = atoi(argv[1]);
  161.         height = atoi(argv[2]);
  162.        }
  163.     else
  164.       if (argc == 5)
  165.         { width  = atoi(argv[1]);
  166.           height = atoi(argv[2]);
  167.           xpos   = atoi(argv[3]);
  168.           ypos   = atoi(argv[4]);
  169.          }
  170.       else 
  171.         { cout << "usage: clock [ width height [ xpos ypos ]]n";
  172.           exit(1);
  173.          }
  174.    }
  175.   window W(width,height,window::center,window::center);
  176.   Wp = &W;
  177.   W.set_show_coordinates(false);
  178.   W.set_redraw(draw_clock);
  179.   if (!W.mono())
  180.   { face_color   = green2;
  181.     text_color   = yellow;
  182.     min_color    = red;
  183.     hour_color   = blue2;
  184.    }
  185.   panel P("clock panel");
  186.   P.bool_item("seconds", seconds);
  187.   P.color_item("face   color", face_color);
  188.   P.color_item("hour   color", hour_color);
  189.   P.color_item("minute color", min_color);
  190.   P.color_item("text   color", text_color);
  191.   P.button("ok");
  192.   P.button("quit");
  193.   draw_clock();
  194.   for(;;)
  195.   { if (wait_a_second())
  196.     { if(P.open() == 1) break;
  197.       draw_clock();
  198.       continue;
  199.      }
  200.     move_hands(h,m,s+1);
  201.     if (s == 59) sync_time();
  202.    }
  203.  return 0;
  204. }