Advertisement
beezing

Analog clock - Pythonista

May 2nd, 2014
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.64 KB | None | 0 0
  1. from scene import *
  2. from datetime import datetime
  3. from math import sin, cos, radians
  4.  
  5. font = 'HelveticaNeue-Thin'
  6.    
  7. # scene's text() shorcut
  8. def txt(x,y,t,f=font,s=14):
  9.   text(t,f,s,x,y)
  10.  
  11. # scene's ellipse() shortcut
  12. def circle(cx,cy,d,t=2):
  13.   stroke_weight(t)
  14.   ellipse(cx-d/2,cy-d/2,d,d)
  15.  
  16. # radius by angle in degree clockwise
  17. def rad(cx,cy,a,r):
  18.   x = cx + r*sin(radians(a))
  19.   y = cy + r*cos(radians(a))
  20.   return x,y
  21.  
  22. class clock(Scene):
  23.   def setup(self):
  24.     # settings
  25.     self.quartz = False
  26.    
  27.   def should_rotate(self, orientation):
  28.     return True # support rotation
  29.    
  30.   def draw(self):
  31.     # get current datetime
  32.     n = datetime.now()
  33.    
  34.     # setup clock dimension
  35.     sz = 14 # arc circle size
  36.     s = sz + sz/2 # space between arc
  37.     w = self.size.w - 2*sz # offset
  38.     h = self.size.h - 2*sz
  39.     x = w/2 + sz # origin of the clock
  40.     y = h/2 + sz
  41.     d = h-s*2 if w > h else w-s*2
  42.     r = d/2
  43.     t = '%02d:%02d:%02d'
  44.    
  45.     # setup clock values
  46.     if not self.quartz:
  47.       # milisecond
  48.       msec = n.microsecond / 10000.0
  49.       sec  = (n.second + msec/100) * 6.0
  50.     else:
  51.       sec  = n.second * 6.0
  52.     min  = (n.minute + (1.0*n.second)/60) * 6.0
  53.     hour = n.hour-12 if n.hour > 12 else n.hour
  54.     hour = (hour + (1.0*n.minute)/60) * 30.0
  55.    
  56.     # default style
  57.     background(0.2,0.2,0.2)
  58.     stroke(1,1,1,1)
  59.     fill(0,0,0,0)
  60.    
  61.     # draw clock ticks
  62.     for i in range(0,360,6):
  63.       ax,ay = rad(x,y,i,r)
  64.       circle(ax,ay,1)
  65.     for i in range(0,360,30):
  66.       ax,ay = rad(x,y,i,r)
  67.       circle(ax,ay,4)
  68.        
  69.     # draw clock text
  70.     txt(x,y+1.25*r+s,'ANALOG CLOCK')
  71.     t = t % (n.hour,n.minute,n.second)
  72.     txt(x,y-1.2*r-s,t)
  73.     for i in range(0,360,30):
  74.       ax,ay = rad(x,y,i,r-s)
  75.       if i == 0: i = 360 # avoid 0
  76.       txt(ax,ay,str(i/30))
  77.      
  78.     # draw second hand
  79.     ax,ay = rad(x,y,sec,r)
  80.     circle(ax,ay,sz,2)
  81.     ax,ay = rad(x,y,sec,r-sz/2)
  82.     line(x,y,ax,ay)
  83.     ax,ay = rad(x,y,sec-180,s) # tail
  84.     line(x,y,ax,ay)
  85.    
  86.     # draw minute hand
  87.     ax,ay = rad(x,y,min,r-s)
  88.     circle(ax,ay,1.5*sz,4)
  89.     ax,ay = rad(x,y,min,r-s-sz/2)
  90.     line(x,y,ax,ay)
  91.     ax1,ay1 = rad(x,y,min,r-s+sz/2)
  92.     ax2,ay2 = rad(x,y,min,r-s+sz/2+sz)
  93.     line(ax1,ay1,ax2,ay2) # pointer
  94.    
  95.     # draw hour hand
  96.     ax,ay = rad(x,y,hour,r/2.5)
  97.     circle(ax,ay,2*sz,8)
  98.     ax,ay = rad(x,y,hour,r/2.5-sz/2)
  99.     line(x,y,ax,ay)
  100.     ax1,ay1 = rad(x,y,hour,r/2.5-sz/2+sz)
  101.     ax2,ay2 = rad(x,y,hour,r/2.5-sz/2+2*sz)
  102.     line(ax1,ay1,ax2,ay2) # pointer
  103.    
  104.     # draw center
  105.     fill(.2,.2,.2,1)
  106.     circle(x,y,1.5*sz)
  107.    
  108. run(clock())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement