Прикреплённый файл «2013-10-25-ill.py»
Загрузка 1 #!/usr/bin/env python
2 # coding: utf
3 '''
4 Иллюстрация к задаче про фигурные числа:
5 1. «Фигурные числа». Ввести число и проверить, можно ли соответствующее количество одинаковых кругов расположить вплотную друг к другу в виде:
6 * квадрата (простой вопрос)
7 * равностороннего треугольника
8 * правильного шестиугольника
9
10 '''
11 from math import *
12 from itertools import *
13 import pygame
14 r,width,dw=10,200,2
15
16 pygame.init()
17 Color=pygame.Color("wheat")
18
19 def drawfig(x,y, color=Color):
20 pygame.draw.circle(Screen, color, (int(x), int(y)), r, 3)
21
22 def hplane(D,A,B):
23 '''Лежит ли точка D в положительной полуплоскости относительно прямой AB?'''
24 return (D[0]-A[0])*(B[1]-A[1])<=(B[0]-A[0])*(D[1]-A[1])
25
26 def hpoly(D, P):
27 '''Лежит ли точка D внутри выпуклого многоугольника P'''
28 return all(hplane(D,A,B) for A,B in zip(P,(P[1:]+P[:1])))
29
30 def squaregrid(baserect, step):
31 '''Квадратная решётка с длиной стороны ячейки step'''
32 for x in takewhile(lambda c: c<baserect.right, count(baserect.left, step)):
33 for y in takewhile(lambda c: c<baserect.bottom, count(baserect.top, step)):
34 yield (x,y)
35
36 def trianlegrid(baserect, step):
37 '''Треугольная решётка с длиной стороны step'''
38 even=0
39 for y in takewhile(lambda c: c<baserect.bottom, count(baserect.top, sqrt(3)*step/2.)):
40 even^=1
41 for x in takewhile(lambda c: c<baserect.right, count(baserect.left+even*step/2., step)):
42 yield (x,y)
43
44 def filterarea(baserect, grid, check, raduis=r):
45 '''В прямоугольнике baserect отметить узлы решётки grid,
46 проходящие проверку check (с учётом радиуса raduis)'''
47 for x, y in grid:
48 if check((x,y),baserect.inflate(-raduis,-raduis)):
49 drawfig(x,y)
50
51 def chksquare(pos, baserect):
52 '''Проверить, лежит ли точка в квадрате'''
53 return baserect.contains(pygame.Rect(pos,(1,1)))
54
55 def chktriangle(pos, br):
56 '''Проверить, лежит ли точка в треугольнике'''
57 bh=br.top+br.h*sqrt(3)/2
58 return hpoly(pos, ((br.centerx,br.top), (br.right,bh), (br.left,bh)))
59
60 def chkhexagon(pos, br):
61 '''Проверить, лежит ли точка в шестиугольнике'''
62 bh=br.h*sqrt(3)/2
63 return hpoly(pos, ( (br.centerx-br.width/4., br.top ),
64 (br.centerx+br.width/4., br.top ),
65 (br.right, br.top+bh/2.),
66 (br.centerx+br.width/4., br.top+bh ),
67 (br.centerx-br.width/4., br.top+bh ),
68 (br.left, br.top+bh/2.)
69 ) )
70
71 figures=((squaregrid,chksquare),(trianlegrid,chktriangle),(trianlegrid,chkhexagon))
72 size=(dw+(width+dw)*len(figures),2*dw+width)
73 Screen=pygame.display.set_mode(size)
74
75 baserect=pygame.Rect(dw,dw,width,width)
76 for grid, chk in figures:
77 filterarea(baserect, grid(baserect,r*2), chk)
78 baserect.move_ip(dw+width,0)
79
80 while pygame.event.wait().type != pygame.QUIT:
81 pygame.display.flip()
Прикреплённые файлы
Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.Вам нельзя прикреплять файлы к этой странице.