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

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