Прикреплённый файл «drawer2.py»
Загрузка 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
Прикреплённые файлы
Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2011-09-26 11:35:20, 1.8 KB) [[attachment:drawer.py]]
- [получить | показать] (2011-09-26 11:35:20, 5.0 KB) [[attachment:drawer2.py]]
- [получить | показать] (2011-09-26 11:35:20, 0.2 KB) [[attachment:figure]]
Вам нельзя прикреплять файлы к этой странице.