Прикреплённый файл «2013-11-22-graph.py»
Загрузка 1 #!/usr/bin/env python
2 # coding: utf
3 '''
4 Написать программу рисования графика любой функции (вводится как выражение от переменной x и затем вычисляется с помощью eval())
5
6 Нарисовать ещё и оси координат
7 Реализовать изменения начала и конца отрезка с помощью движения мыши (например, перетаскивание левой кнопкой сдвигает оба конца, а правой — меняет масштаб)
8 '''
9 import pygame
10 from math import *
11 import sys
12
13 def scale(dot,(a1,b1),(a2,b2)):
14 if b1 == a1:
15 print dot,(a1,b1),(a2,b2)
16 return a2
17 return a2+float(dot-a1)*(b2-a2)/(b1-a1)
18
19 def qlength(start, end): return (start[0]-end[0])**2+(start[1]-end[1])**2
20 def apply(f,x): return x,eval(f)
21 def draw_arrow(surface, color, butt, head, width=10.):
22 '''Функция рисования стрелочки без единого синуса :)'''
23 # края стрелочки — диагонали квадратов со стороной butt → head…
24 x1,y1=butt[0]-butt[1]+head[1],butt[1]-head[0]+butt[0]
25 x2,y2=butt[0]-head[1]+butt[1],butt[1]-butt[0]+head[0]
26 # …уменьшенные до длины width (на самом деле синус тут :)
27 l=sqrt(qlength(butt, head)*2)
28 x1=(x1-head[0])*10/l+head[0]
29 y1=(y1-head[1])*10/l+head[1]
30 x2=(x2-head[0])*10/l+head[0]
31 y2=(y2-head[1])*10/l+head[1]
32 pygame.draw.line(surface, color, butt, head)
33 pygame.draw.line(surface, color, (x1,y1), head)
34 pygame.draw.line(surface, color, (x2,y2), head)
35
36 def redraw(A,B,dw,dh):
37 Dots=[apply(f,A+float(i)*(B-A)/(Ndots-1)) for i in xrange(Ndots)]
38 Farea=min([y for x,y in Dots]+[0]),max([y for x,y in Dots]+[0])
39 Aarea=min(A,0),max(B,0)
40 Graph=[(scale(x,Aarea,(dw,W-dw-1)),H-scale(y,Farea,(1+dh,H-dh))) for x,y in Dots]
41 scr.fill((0,0,0))
42 draw_arrow(scr, pygame.Color("goldenrod"),
43 (dw, H-scale(0,Farea,(1+dh,H-dh))),
44 (W-dw-1, H-scale(0,Farea,(1+dh,H-dh))))
45 draw_arrow(scr, pygame.Color("goldenrod"),
46 (scale(0,Aarea,(1+dw,W-dw-1)),H-dh),
47 (scale(0,Aarea,(1+dw,W-dw-1)),dh))
48 pygame.draw.lines(scr, pygame.Color("tan"), False, Graph)
49
50 pygame.init()
51 W,H=780,590
52 dw,dh=20,20 # поля для рисования осей
53 Ndots=200 # Количество вершин ломаной-графика
54
55 scr=pygame.display.set_mode((W,H))
56
57 f,A,B="sin(x)",-5,4
58 Continue,Redraw=True,True
59 while Continue:
60 event=pygame.event.wait()
61 if event.type == pygame.QUIT:
62 Continue=False
63 elif event.type == pygame.MOUSEMOTION:
64 d=scale(event.rel[0],(0,W-2*dw),(A,B))-A
65 if event.buttons[0]:
66 A,B=A-d, B-d
67 Redraw=True
68 elif event.buttons[2]:
69 A,B=A-d, B+d
70 Redraw=True
71 elif event.type == pygame.KEYDOWN:
72 if event.key == 13:
73 f=raw_input("Введите новую фуникцию от x: ")
74 Redraw=True
75 elif event.key == pygame.K_KP_PLUS:
76 Ndots*=2
77 Redraw=True
78 elif event.key == pygame.K_KP_MINUS:
79 if Ndots>8:
80 Ndots/=2
81 Redraw=True
82 else:
83 print event
84 else:
85 print event
86
87 if Redraw:
88 redraw(A,B,dw,dh)
89 Redraw=False
90
91 pygame.display.flip()
Прикреплённые файлы
Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2013-11-29 09:52:42, 2.6 KB) [[attachment:2013-11-22-bowling.py]]
- [получить | показать] (2013-11-29 09:52:31, 3.5 KB) [[attachment:2013-11-22-graph.py]]
- [получить | показать] (2013-11-29 09:53:29, 4.9 KB) [[attachment:ball.gif]]
Вам нельзя прикреплять файлы к этой странице.