Attachment 'drawer2.py'

Download

   1 #!/usr/bin/env python
   2 # -*- coding: UTF-8 -*-
   3 '''
   4   Рисовальщик: программа , котороая читает из файла и отображает 
   5    0. Размер картинки (первая строка файла)
   6       <ширина> <высота>
   7    1. Линии, окружности, прямогуольники с цветом и шириной
   8       color <R,G,B>
   9       width <ширина>
  10       line <начало> <конец>
  11       cicrle <центр> <радиус>
  12       rect <угол1> <угол3>
  13    2. Ломаные и многоугольники
  14       lines <точка1> <точка2> ...
  15       polygon <точка1> <точка2> ...
  16    3. Заливка одноцветной области
  17       fill <откуда>
  18 '''
  19 
  20 from math import *
  21 import sys
  22 
  23 import pygame
  24 pygame.init()
  25 
  26 def int1(s):
  27   'Разбить строку на слова, пребразовать все элементы, кроме первого, в целые'
  28   if s.startswith('#'): return s,[]	# комментарий
  29   l=s.split(' ')
  30   return [l[0].lower()]+[int(e) for e in l[1:]]
  31 
  32 def pairs(s):
  33   'Разбить список на пары'
  34   return [s[i:i+2] for i in range(0,len(s),2)]
  35 
  36 def fillsurface(surf, col, dot, debug = False):
  37   '''Перекрасить все точки surface, непосредственно доступные
  38   от точки dot, в цвет col'''
  39   Col=pygame.Color(*col)
  40   Plane=surf.get_rect()
  41   dif = ((-1,0),(0,1),(1,0),(0,-1))	# соседние точки
  42   surf.lock()
  43   if surf.get_at(dot) != Col:
  44     Fil = surf.get_at(dot)
  45     queue = [dot]			# точки, которые, возможно, надо закрасить
  46     while queue:
  47       d = queue.pop()			# очередная точка-кандидат
  48       if Plane.collidepoint(d) and surf.get_at(d) == Fil:
  49 	surf.set_at(d,Col)
  50 	if debug:			# покажем, как оно закрашивается
  51 	  pygame.display.flip()
  52 	# добавляем в очередь четыре соседние точки
  53 	queue+=[(d[0]+dif[i][0],d[1]+dif[i][1]) for i in xrange(len(dif))]
  54   surf.unlock()
  55 
  56 def fillsurface2(surf, col, dot, debug = False):
  57   '''Перекрасить все точки surface, непосредственно доступные
  58   от точки dot, в цвет col. Просмотр вширь'''
  59   Col=pygame.Color(*col)
  60   Plane=surf.get_rect()
  61   dif = ((-1,0),(0,1),(1,0),(0,-1))	# соседние точки
  62   surf.lock()
  63   if surf.get_at(dot) != Col:
  64     Fil = surf.get_at(dot)
  65     queue2 = [dot]			# точки, которые, возможно, надо закрасить
  66     while queue2:
  67       queue, queue2 = queue2, []
  68       while queue:
  69 	d = queue.pop()			# очередная точка-кандидат
  70 	if Plane.collidepoint(d) and surf.get_at(d) == Fil:
  71 	  surf.set_at(d,Col)
  72 	  if debug:			# покажем, как оно закрашивается
  73 	    pygame.display.flip()
  74 	  # добавляем в очередь четыре соседние точки
  75 	  queue2+=[(d[0]+dif[i][0],d[1]+dif[i][1]) for i in xrange(len(dif))]
  76   surf.unlock()
  77 
  78 def fillsurface(surf, col, dot, debug = False):
  79   '''Перекрасить все точки surface, непосредственно доступные
  80   от точки dot, в цвет col'''
  81   Col=pygame.Color(*col)
  82   Plane=surf.get_rect()
  83   dif = ((-1,0),(0,1),(1,0),(0,-1))	# соседние точки
  84   surf.lock()
  85   if surf.get_at(dot) != Col:
  86     Fil = surf.get_at(dot)
  87     queue = [dot]			# точки, которые, возможно, надо закрасить
  88     while queue:
  89       d = queue.pop()			# очередная точка-кандидат
  90       if Plane.collidepoint(d) and surf.get_at(d) == Fil:
  91 	surf.set_at(d,Col)
  92 	if debug:			# покажем, как оно закрашивается
  93 	  pygame.display.flip()
  94 	# добавляем в очередь четыре соседние точки
  95 	queue+=[(d[0]+dif[i][0],d[1]+dif[i][1]) for i in xrange(len(dif))]
  96   surf.unlock()
  97 
  98 # как ввести имя файла?
  99 f = file(sys.argv[1],"r")
 100 fig = [int1(l) for l in f.readlines()]
 101 print fig
 102 W,H = int(fig[0][0]),int(fig[0][1])
 103 width,color = 1, (255,25,255)
 104 screen = pygame.display.set_mode((W,H))
 105 
 106 for l in fig[1:]:
 107   print l
 108   if not l[0] or l[0].startswith('#'):
 109     pass
 110   elif l[0] == 'width': width = l[1]
 111   elif l[0] == 'color': color = l[1:]
 112   elif l[0] == 'line': pygame.draw.line(screen, color, l[1:3], l[3:5], width)
 113   elif l[0] == 'rect': pygame.draw.rect(screen, color, l[1:5], width)
 114   elif l[0] == 'circle': pygame.draw.circle(screen, color, l[1:3], l[3], width)
 115   elif l[0] == 'lines': pygame.draw.lines(screen, color, False, pairs(l[1:]), width)
 116   elif l[0] == 'poly': pygame.draw.lines(screen, color, True, pairs(l[1:]), width)
 117   elif l[0] == 'fill': fillsurface(screen, color, l[1:3], True)
 118   else: print >> sys.stderr, "Warning: unknown '%s' figure"%l[0]
 119   pygame.display.flip()	# для медленного красивого отображения
 120 
 121 while pygame.event.wait().type != pygame.QUIT:
 122   pass

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.

You are not allowed to attach a file to this page.