Прикреплённый файл «2013-11-01-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,dw=10,8
  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 widths=(200,120,70)
  72 figures=((squaregrid,chksquare),(trianlegrid,chktriangle),(trianlegrid,chkhexagon))
  73 width=max(widths)
  74 size=(dw+(width+dw)*len(figures),(len(widths)+2)*dw+sum(widths))
  75 Screen=pygame.display.set_mode(size)
  76 
  77 baserect=pygame.Rect(dw,dw,widths[0],widths[0])
  78 for width in widths:
  79     baserect.width=baserect.height=width
  80     print baserect
  81     for grid, chk in figures:
  82         filterarea(baserect, grid(baserect,r*2), chk)
  83         baserect.move_ip(dw+width,0)
  84     baserect.left=dw
  85     baserect.move_ip(0,width+dw)
  86 
  87 while pygame.event.wait().type != pygame.QUIT:
  88     pygame.display.flip()

Прикреплённые файлы

Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.

Вам нельзя прикреплять файлы к этой странице.