Прикреплённый файл «2014-03-07-grafun-sgc.py»

Загрузка

   1 #!/usr/bin/env python
   2 # -*- coding: UTF-8 -*-
   3 '''
   4 Построение графика произвольной функции
   5 в произвольном диапазоне на экране произвольных размеров
   6 Используется PyGame и SGC
   7 '''
   8 
   9 from math import *
  10 import sys, pygame
  11 import sgc
  12 
  13 pygame.init()
  14 W,H=1000,750
  15 root = sgc.surface.Screen((W,H))
  16 screen = root.image
  17 black = pygame.Color("black")
  18 tan = pygame.Color("tan")
  19 red = pygame.Color("tomato")
  20 brown = pygame.Color(64,48,8)
  21 
  22 pen,paper,width=tan,black,2
  23 
  24 def scale(x, X0, X1, Z0, Z1):
  25   'Преобразует координату x в диапазоне [X0, X1] в координату z в диапазоне [Z0, Z1]'
  26   return Z0+(Z1-Z0)*(x-X0)/float(X1-X0)
  27 
  28 def grafun(X0, X1, count, formulae):
  29   'Список длиной count вида [(x, formulae(x)),..], х из диапазона [X0, X1]'
  30   ret=[]
  31   for i in range(count):
  32     x=scale(i, 0, count-1, X0, X1)
  33     y=eval(formulae)
  34     ret.append((x,y))
  35   return ret
  36 
  37 def tfloat2(s):
  38     x,y=s.split(',')
  39     return float(x), float(y)
  40 
  41 def recalc():
  42     global needrecalc, grs, paper
  43     try:
  44         gr = grafun(X0, X1, W, fml)
  45         paper = black
  46     except:
  47         paper = brown
  48         return
  49     Fx=zip(*gr)[1]	# список [ gr[0][1], gre[1][1], gr[2][1], ... ]
  50     Min, Max = min(Fx), max(Fx)
  51     grs = [(x,scale(gr[x][1], Min, Max, 0, H)) for x in xrange(W)]
  52     needrecalc = False
  53 
  54 def redraw():
  55     screen.fill(paper)
  56     pygame.draw.lines(screen, pen, False, grs, width)
  57 
  58 needrecalc = True
  59 fml = "sin(x)"
  60 X0, X1 = -4.,4.
  61 
  62 i_fml = sgc.InputBox(label=u"функция от x", default=fml, label_side = "bottom")
  63 i_fml.config(pos=(3,4))
  64 i_fml.add(order=0)
  65 
  66 ticks = 30
  67 clock = pygame.time.Clock()
  68 again = True
  69 
  70 while again:
  71     time = clock.tick(ticks)
  72     for event in pygame.event.get():
  73         if event.type == pygame.QUIT:
  74             again = False
  75         sgc.event(event)
  76         if event.type == sgc.locals.GUI:
  77             if event.widget is i_fml:
  78                 if event.gui_type == "enter":
  79                     fml = event.text
  80                     needrecalc = True
  81     if needrecalc:
  82         recalc()
  83     redraw()
  84     sgc.update(time)
  85     pygame.display.flip()

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

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

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