Прикреплённый файл «2013-02-22.function.py»
Загрузка 1 #!/usr/bin/env python
2 # coding: utf
3 '''
4 Написать программу, рисующую какой-нибудь график
5 '''
6
7 from math import *
8 import pygame
9
10 SFun="sin(x)"
11 A,B=-1,4
12 NDots=200
13 SSize=(800,600)
14 Border=(6,3)
15
16 def scale(x,d,D):
17 '''Преобразует число m из диапазона d в диапазон D'''
18 return D[0]+(float(x)-d[0])*(D[1]-D[0])/(d[1]-d[0])
19
20 def scaledot(m,v,V):
21 '''Преобразует координаты точки m в прямоугольнике v
22 в координаты в прямоугольнике V.'''
23 return [scale(x,d,D) for x,d,D in zip(m,zip(*v),zip(*V))]
24
25 # Выполнять функцию, хранящуюся в строке SFun
26 def fun(x, s=SFun): return eval(SFun)
27
28 def calculate(A,B,SFun,Rect):
29 '''Вычисльить график функции SFun от точки A до точки B.
30 График встроить в прямоугольник Rect'''
31 # Вычислим абсциссы точек
32 abss=[scale(i,(0,NDots),(A,B)) for i in xrange(NDots+1)]
33 # Вычислим ординаты точек
34 ords=[fun(x) for x in abss]
35 # Вычислим область значений функции
36 Min,Max=min(ords),max(ords)
37 # Границы графика — номинальные и на экране
38 v,V=((A,Min), (B,Max)), (Rect.bottomright, Rect.topleft)
39 return [scaledot(m, v, V) for m in zip(abss,ords)]
40
41 pygame.init()
42 screen=pygame.display.set_mode(SSize)
43
44 CanExit,NeedRecalc=False,True
45 while not CanExit:
46 ev=pygame.event.wait()
47 if ev.type == pygame.QUIT:
48 CanExit=True
49 elif ev.type == pygame.KEYDOWN:
50 if ev.key == 27:
51 CanExit=True
52 elif ev.key == 13:
53 SFun=raw_input("Введите функцию от x: ")
54 NeedRecalc=True
55 elif ev.type == pygame.MOUSEMOTION:
56 if ev.buttons[0]:
57 d=scale(ev.rel[0],(0,SSize[0]),(0,B-A))
58 A+=d
59 B+=d
60 NeedRecalc=True
61 elif ev.buttons[2]:
62 d=scale(-ev.rel[0],(0,SSize[0]),(0,B-A))
63 A-=d
64 B+=d
65 NeedRecalc=True
66 if NeedRecalc:
67 Frame=pygame.Rect(Border,(SSize[0]-2*Border[0],SSize[1]-2*Border[1]))
68 Graph=calculate(A,B,SFun,Frame)
69 NeedRecalc=False
70 screen.fill(pygame.Color("Black"))
71 pygame.draw.lines(screen, pygame.Color("white"), False, Graph)
72 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]]
Вам нельзя прикреплять файлы к этой странице.