Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.

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