Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2013-03-15 13:03:07, 2.4 KB) [[attachment:2013-02-22.function.py]]
- [получить | показать] (2013-03-15 13:01:55, 3.1 KB) [[attachment:2013-03-01.arrow.py]]
- [получить | показать] (2013-03-15 13:00:29, 2.7 KB) [[attachment:2013-03-01.drawtree.py]]
- [получить | показать] (2013-03-15 13:02:44, 2.5 KB) [[attachment:2013-03-01.pong.py]]
- [получить | показать] (2013-03-15 13:01:31, 1.9 KB) [[attachment:label.py]]
Вам нельзя прикреплять файлы к этой странице.