mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	 994d8539f6
			
		
	
	
		994d8539f6
		
	
	
	
	
		
			
			y coordinate), and change radius of second indicator to compensate Remove redundant setting of sradius
		
			
				
	
	
		
			146 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python
 | |
| #
 | |
| # $Id$
 | |
| #
 | |
| # From tclock.c, Copyright Howard Jones <ha.jones@ic.ac.uk>, September 1994.
 | |
| 
 | |
| from math import *
 | |
| import curses, time
 | |
| 
 | |
| ASPECT = 2.2
 | |
| 
 | |
| def sign(_x):
 | |
|     if _x < 0: return -1
 | |
|     return 1
 | |
| 
 | |
| def A2XY(angle, radius):
 | |
|     return int(round(ASPECT * radius * sin(angle))), int(round(radius * cos(angle)))
 | |
| 
 | |
| def plot(x, y, col):
 | |
|     stdscr.addch(y, x, col)
 | |
| 
 | |
| # draw a diagonal line using Bresenham's algorithm
 | |
| def dline(pair, from_x, from_y, x2, y2, ch):
 | |
|     if curses.has_colors():
 | |
|         stdscr.attrset(curses.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
 | |
| 
 | |
| def main(win):
 | |
|     global stdscr
 | |
|     stdscr = win
 | |
|     
 | |
|     lastbeep = -1
 | |
|     my_bg = curses.COLOR_BLACK
 | |
| 
 | |
|     stdscr.nodelay(1)
 | |
|     stdscr.timeout(0)
 | |
| #    curses.curs_set(0)
 | |
|     if curses.has_colors():
 | |
|         curses.init_pair(1, curses.COLOR_RED, my_bg)
 | |
|         curses.init_pair(2, curses.COLOR_MAGENTA, my_bg)
 | |
|         curses.init_pair(3, curses.COLOR_GREEN, my_bg)
 | |
| 
 | |
|     cx = (curses.COLS - 1) / 2
 | |
|     cy = curses.LINES / 2
 | |
|     ch = min( cy-1, int(cx / ASPECT) - 1) 
 | |
|     mradius = (3 * ch) / 4
 | |
|     hradius = ch / 2
 | |
|     sradius = 5 * ch / 6
 | |
| 
 | |
|     for i in range(0, 12):
 | |
|         sangle = (i + 1) * 2.0 * pi / 12.0
 | |
|         sdx, sdy = A2XY(sangle, sradius)
 | |
| 
 | |
|         stdscr.addstr(cy - sdy, cx + sdx, "%d" % (i + 1))
 | |
| 
 | |
|     stdscr.addstr(0, 0,
 | |
|                   "ASCII Clock by Howard Jones <ha.jones@ic.ac.uk>, 1994")
 | |
| 
 | |
|     sradius = max(sradius-4, 8)
 | |
|     
 | |
|     while 1:
 | |
|         curses.napms(1000)
 | |
| 
 | |
|         tim = time.time()
 | |
|         t = time.localtime(tim)
 | |
| 
 | |
|         hours = t[3] + t[4] / 60.0
 | |
|         if hours > 12.0:
 | |
|             hours -= 12.0
 | |
| 
 | |
|         mangle = t[4] * 2 * pi / 60.0
 | |
|         mdx, mdy = A2XY(mangle, mradius)
 | |
| 
 | |
|         hangle = hours * 2 * pi / 12.0
 | |
|         hdx, hdy = A2XY(hangle, hradius)
 | |
| 
 | |
|         sangle = t[5] * 2 * pi / 60.0
 | |
|         sdx, sdy = A2XY(sangle, sradius)
 | |
| 
 | |
|         dline(3, cx, cy, cx + mdx, cy - mdy, ord('#'))
 | |
| 
 | |
|         stdscr.attrset(curses.A_REVERSE)
 | |
|         dline(2, cx, cy, cx + hdx, cy - hdy, ord('.'))
 | |
|         stdscr.attroff(curses.A_REVERSE)
 | |
| 
 | |
|         if curses.has_colors():
 | |
|             stdscr.attrset(curses.color_pair(1))
 | |
| 
 | |
|         plot(cx + sdx, cy - sdy, ord('O'))
 | |
|         
 | |
|         if curses.has_colors():
 | |
|             stdscr.attrset(curses.color_pair(0))
 | |
| 
 | |
|         stdscr.addstr(curses.LINES - 2, 0, time.ctime(tim))
 | |
|         stdscr.refresh()
 | |
|         if (t[5] % 5) == 0 and t[5] != lastbeep:
 | |
|             lastbeep = t[5]
 | |
|             curses.beep()
 | |
| 
 | |
|         ch = stdscr.getch()
 | |
|         if ch == ord('q'):
 | |
|             return 0
 | |
| 
 | |
|         plot(cx + sdx, cy - sdy, ord(' '))
 | |
|         dline(0, cx, cy, cx + hdx, cy - hdy, ord(' '))
 | |
|         dline(0, cx, cy, cx + mdx, cy - mdy, ord(' '))
 | |
| 
 | |
| curses.wrapper(main)
 |