Прикреплённый файл «2013-03-01.arrow.py»

Загрузка

   1 #!/usr/bin/env python
   2 # coding: utf
   3 '''
   4 Написать функцию рисования стрелки, ведущей из точку (x,y) в точку (x1,y1),
   5 с учётом, что в каждой точке изображена вершина графа — круг радиусом R
   6 — и стрелка, которая в неё ведёт, должна только касаться периметра. 
   7 '''
   8 
   9 import pygame
  10 from math import *
  11 
  12 # Склад стрелок
  13 Arrows={}
  14 
  15 def length(m,M):
  16     '''Расстояние от m до M'''
  17     return sqrt((m[0]-M[0])**2+(m[1]-M[1])**2)
  18 
  19 def getarrow(size=9, color=(0,0,0), back=(255,255,255)):
  20     '''Ищет стрелку размера size и цвета color на складе,
  21     если такой нет — добавляет её туда с прозрачным цветом фона back'''
  22     if (color[:3],size) not in Arrows:
  23         Arrows[color[:3],size]=pygame.Surface((size,size))
  24         Arrows[color[:3],size].fill(back)
  25         pygame.draw.polygon(Arrows[color[:3],size], color, ((size-1,0),(0,size/2),(size-1,size-1),(size/2,size/2)))
  26         Arrows[color[:3],size].set_colorkey(back)
  27     return Arrows[color[:3],size]
  28 
  29 def arrow0(scr,m,M,R,color=(0,0,0),size=9):
  30     '''Рисует стрелку размера size цвета color из m в M с отсупом в R от M'''
  31     ar=getarrow(size,color)
  32     L=length(m,M)
  33     l=L-R-size/2
  34     # TODO l ≤ 0
  35     N=m[0]+(M[0]-m[0])*l/L,m[1]+(M[1]-m[1])*l/L
  36     arr=pygame.transform.rotate(ar,degrees(atan2(M[1]-m[1],m[0]-M[0])))
  37     pygame.draw.line(scr,color,m,N)
  38     scr.blit(arr,arr.get_rect(center=N))
  39 
  40 def arrow(scr,m,M,R,color=(0,0,0),size=9):
  41     '''Рисует стрелку размера size цвета color из m в M с отсупом в R от M и m'''
  42     ar=getarrow(size,color)
  43     L=length(m,M)
  44     l=L-2*R-size/2
  45     # TODO l ≤ 0
  46     n=m[0]+(M[0]-m[0])*R/L,m[1]+(M[1]-m[1])*R/L
  47     N=m[0]+(M[0]-m[0])*(R+l)/L,m[1]+(M[1]-m[1])*(R+l)/L
  48     arr=pygame.transform.rotate(ar,degrees(atan2(M[1]-n[1],n[0]-M[0])))
  49     pygame.draw.line(scr,color,n,N)
  50     scr.blit(arr,arr.get_rect(center=N))
  51 
  52 if __name__ == "__main__":
  53     import random
  54     pygame.init()
  55     Size=(800,600)
  56     scr=pygame.display.set_mode(Size)
  57     R=10
  58     Back=(255,255,255)
  59     M=(Size[0]/2,Size[1]/2)
  60     Ins,Outs=[],[]
  61     CanExit,NeedRedraw=False,True
  62     while not CanExit:
  63         ev=pygame.event.wait()
  64         if ev.type == pygame.QUIT:
  65             CanExit=True
  66         elif ev.type == pygame.MOUSEBUTTONUP:
  67             if ev.button == 1:
  68                 Outs.append(ev.pos)
  69                 NeedRedraw=True
  70             elif ev.button == 3:
  71                 Ins.append(ev.pos)
  72                 NeedRedraw=True
  73         if NeedRedraw:
  74             scr.fill(Back)
  75             pygame.draw.circle(scr, pygame.Color("red"), M, R, 1)
  76             for m in Ins:
  77                 pygame.draw.circle(scr, pygame.Color("green"), m, R, 1)
  78                 arrow(scr, m, M, R)
  79             for m in Outs:
  80                 pygame.draw.circle(scr, pygame.Color("blue"), m, R, 1)
  81                 arrow(scr, M, m, R)
  82             NeedRedraw=False
  83         pygame.display.flip()

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

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

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