Прикреплённый файл «grap_6.py»
Загрузка 1 #!/usr/bin/env python
2 # -*- coding: UTF-8 -*-
3 '''
4 Проект "Построение графика", версия 7 (эпоха 2)
5 Построение графика произвольной функции
6 в произвольном диапазоне на текстовом экране произвольных размеров
7 с произвольным количеством точек ломаной
8 дополнительно изобразить оси координат и предусмотреть ситуацию, когда
9 график функции их не пересекает
10 Используется PyGame
11 '''
12
13 from math import *
14 import sys, pygame
15
16 pen,paper=(200,250,100),(0,0,0)
17
18 def definput(prompt, *default):
19 '''Вводит строку. Если она непустая, возвращает eval(строка).
20 Если ввод пуст, а в default -- ровно одна строка, возвращает эту строку.
21 Иначе возвращает default'''
22 print "%s %s:"%(prompt, default),
23 s = sys.stdin.readline().strip()
24 if s:
25 if len(default)==1 and type(default[0]) == str:
26 return s
27 else:
28 return eval(s)
29 if len(default)==1:
30 return default[0]
31 else:
32 return default
33
34 def scale(x, X0, X1, Z0, Z1):
35 'Преобразует координату x в диапазоне [X0, X1] в координату z в диапазоне [Z0, Z1]'
36 return Z0+(Z1-Z0)*(x-X0)/float(X1-X0)
37
38 def round(x):
39 'Округлить x до ближайшего целого'
40 return int(floor(x+0.5))
41
42 def sign(x): return x > 0 and 1 or x < 0 and -1 or 0
43
44 def fun(x, eq):
45 'Вычисляет python-выражение eq с параметром x'
46 return eval(eq)
47
48 def grafun(X0, X1, count, formulae):
49 'Список длиной count вида [(x, formulae(x)),..], х из диапазона [X0, X1]'
50 ret=[]
51 for i in range(count):
52 x=scale(i, 0, count-1, X0, X1)
53 y=fun(x, formulae)
54 ret.append((x,y))
55 return ret
56
57 def dot(scr, M, color=pen):
58 'Поставить точку M (по умолчанию "*") на виртуальный экран scr'
59 W,H=scr.get_size()
60 scr.fill(color, ((M[0],H-M[1]),(1,1)))
61
62 def ddot(scr, M, color=pen):
63 '''Нарисовать на экране screen точку M
64 с масштабированием прямоугольника (X0,Y0)-(X1,Y1) во весь экран'''
65 W,H=scr.get_size()
66 dot(screen, (scale(M[0], X0, X1, 0, W-1), scale(M[1], Y0, Y1, 0, H-1)), color)
67
68 def line(scr, M1, M2, color=pen):
69 '''Нарисовать отрезок от точки M1 до M2 на экране scr'''
70 x1,y1,x2,y2 = (int(i) for i in M1+M2)
71 x,y,w,h = x1,y1,x2-x1,y2-y1
72 d = ((sign(w),sign(h)), fabs(w)>fabs(h) and (sign(w), 0) or (0,sign(h)))
73 #dot(scr,x,y,color)
74 while x != x2 or y != y2:
75 i = rough(x2, y2, w, h, x, y, d[0]) > rough(x2, y2, w, h, x, y, d[1]) and 1 or 0
76 x,y = x + d[i][0], y + d[i][1]
77 dot(scr,(x,y),color)
78
79 def dline(scr, M1, M2, color=pen):
80 '''Нарисовать на экране screen отрезок от точки графика M1 до M2
81 с масштабированием прямоугольника (X0,Y0)-(X1,Y1) во весь экран'''
82 W,H=scr.get_size()
83 line(screen, (round(scale(M1[0], X0, X1, 0, W-1)),
84 round(scale(M1[1], Y0, Y1, 0, H-1))),
85 (round(scale(M2[0], X0, X1, 0, W-1)),
86 round(scale(M2[1], Y0, Y1, 0, H-1))),
87 color)
88 def rough(X,Y,W,H,x,y,d):
89 '''Определяет, насколько вектор (W,H) параллелен вектору (x+d[0],y+d[1])-(X,Y)'''
90 return fabs(H*(X-(x+d[0]))-W*(Y-(y+d[1])))
91
92
93 fml = definput("Функция в виде формулы от x", "sin(x)")
94 X0, X1 = definput("Начало и конец диапазона", -4., 4.)
95 W, H = definput("Ширина и высота экрана", 800, 600)
96 N = definput("Количество точек ломаной",200)
97 X0, X1 = float(X0), float(X1)
98
99 pygame.init()
100 screen = pygame.display.set_mode((W,H))
101
102 gr=grafun(X0, X1, N, fml)
103 dots=gr+[[0.0, 0.0]]
104 Y0, Y1 = min([e[1] for e in dots]), max([e[1] for e in dots])
105
106 screen.fill(paper)
107 for i in range(len(gr)-1):
108 dline(screen, gr[i], gr[i+1], pen)
109 dline(screen, (X0, 0.0), (X1, 0.0), (200,200,200))
110 dline(screen, (X1, 0.0), (X1-(X1-X0)/50, (Y0-Y1)/50), (200,200,200))
111 dline(screen, (X1, 0.0), (X1-(X1-X0)/50, (Y1-Y0)/50), (200,200,200))
112 dline(screen, (0.0, Y0), (0.0, Y1), (200,200,200))
113 dline(screen, (0.0, Y1), ((X1-X0)/50, Y1-(Y1-Y0)/50), (200,200,200))
114 dline(screen, (0.0, Y1), ((X0-X1)/50, Y1-(Y1-Y0)/50), (200,200,200))
115
116 # обновление окна
117 pygame.display.flip()
118
119 while True:
120 if pygame.event.wait():
121 for event in pygame.event.get():
122 if event.type == pygame.QUIT: sys.exit()
123 print event
Прикреплённые файлы
Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2011-09-26 11:35:27, 1.6 KB) [[attachment:Oval.seg]]
- [получить | показать] (2011-09-26 11:35:27, 2.4 KB) [[attachment:PyGameState_Editor.dia]]
- [получить | показать] (2011-09-26 11:35:27, 2.8 KB) [[attachment:PyGameState_Ellipse.dia]]
- [получить | показать] (2011-09-26 11:35:27, 2.8 KB) [[attachment:PyGameState_Figure.dia]]
- [получить | показать] (2011-09-26 11:35:27, 1.5 KB) [[attachment:PyGameState_Input.dia]]
- [получить | показать] (2011-09-26 11:35:27, 0.4 KB) [[attachment:grap_0.py]]
- [получить | показать] (2011-09-26 11:35:27, 1.4 KB) [[attachment:grap_1-1.py]]
- [получить | показать] (2011-09-26 11:35:27, 1.1 KB) [[attachment:grap_1.py]]
- [получить | показать] (2011-09-26 11:35:27, 1.8 KB) [[attachment:grap_2.py]]
- [получить | показать] (2011-09-26 11:35:27, 2.4 KB) [[attachment:grap_3.py]]
- [получить | показать] (2011-09-26 11:35:27, 2.6 KB) [[attachment:grap_4.py]]
- [получить | показать] (2011-09-26 11:35:27, 2.0 KB) [[attachment:grap_5-0.py]]
- [получить | показать] (2011-09-26 11:35:27, 4.8 KB) [[attachment:grap_5-1.py]]
- [получить | показать] (2011-09-26 11:35:27, 3.6 KB) [[attachment:grap_5.py]]
- [получить | показать] (2011-09-26 11:35:27, 3.5 KB) [[attachment:grap_6-0.py]]
- [получить | показать] (2011-09-26 11:35:27, 4.7 KB) [[attachment:grap_6.py]]
- [получить | показать] (2011-09-26 11:35:27, 9.7 KB) [[attachment:grap_7.py]]
- [получить | показать] (2011-09-26 11:35:27, 0.8 KB) [[attachment:pygame_0.py]]
- [получить | показать] (2011-09-26 11:35:27, 2.2 KB) [[attachment:pygame_1-1.py]]
- [получить | показать] (2011-09-26 11:35:27, 1.9 KB) [[attachment:pygame_1.py]]
- [получить | показать] (2011-09-26 11:35:27, 2.5 KB) [[attachment:pygame_2-0.py]]
- [получить | показать] (2011-09-26 11:35:27, 1.3 KB) [[attachment:pygame_2-1-0.py]]
- [получить | показать] (2011-09-26 11:35:27, 5.6 KB) [[attachment:pygame_2-1.py]]
Вам нельзя прикреплять файлы к этой странице.