Прикреплённый файл «grap_5.py»

Загрузка

   1 #!/usr/bin/env python
   2 # -*- coding: UTF-8 -*-
   3 '''
   4 Проект "Построение графика", версия 5 (эпоха 2)
   5 Построение графика произвольной функции
   6 в произвольном диапазоне на текстовом экране произвольных размеров
   7 с произвольным количеством точек ломаной
   8 '''
   9 
  10 from math import *
  11 import sys
  12 
  13 def definput(prompt, *default):
  14   '''Вводит строку. Если она непустая, возвращает eval(строка).
  15      Если ввод пуст, а в default -- ровно одна строка, возвращает эту строку.
  16      Иначе возвращает default'''
  17   print "%s %s:"%(prompt, default),
  18   s = sys.stdin.readline().strip()
  19   if s:
  20     if len(default)==1 and type(default[0]) == str:
  21       return s
  22     else:
  23       return eval(s)
  24   if len(default)==1:
  25     return default[0]
  26   else:
  27     return default
  28 
  29 def scale(x, X0, X1, Z0, Z1):
  30   'Преобразует координату x в диапазоне [X0, X1] в координату z в диапазоне [Z0, Z1]'
  31   return Z0+(Z1-Z0)*(x-X0)/float(X1-X0)
  32 
  33 def round(x):
  34   'Округлить x до ближайшего целого'
  35   return int(floor(x+0.5))
  36 
  37 def sign(x): return x > 0 and 1 or x < 0 and -1 or 0
  38 
  39 def fun(x, eq):
  40   'Вычисляет python-выражение eq с параметром x'
  41   return eval(eq)
  42 
  43 def grafun(X0, X1, count, formulae):
  44   'Список длиной count вида [(x, formulae(x)),..], х из диапазона [X0, X1]'
  45   ret=[]
  46   for i in range(count):
  47     x=scale(i, 0, count-1, X0, X1)
  48     y=fun(x, formulae)
  49     ret.append((x,y))
  50   return ret
  51 
  52 def dot(scr, x, y, char="*"):
  53   'Поставить точку (по умолчанию "*") на виртуальный экран scr'
  54   scr[round(y)][round(x)]=char
  55 
  56 def rough(X,Y,W,H,x,y,d):
  57   '''Определяет, насколько вектор (W,H) параллелен вектору (x+d[0],y+d[1])-(X,Y)'''
  58   return fabs(H*(X-(x+d[0]))-W*(Y-(y+d[1])))
  59 
  60 def line(scr, M1, M2, char="*"):
  61   '''Нарисовать отрезок от точки M1 до M2 на экране scr'''
  62   x1,y1,x2,y2 = (int(i) for i in M1+M2)
  63   x,y,w,h = x1,y1,x2-x1,y2-y1
  64   d = ((sign(w),sign(h)), fabs(w)>fabs(h) and (sign(w), 0) or (0,sign(h)))
  65   #dot(scr,x,y,char)
  66   while x != x2 or y != y2:
  67     i = rough(x2, y2, w, h, x, y, d[0]) > rough(x2, y2, w, h, x, y, d[1]) and 1 or 0
  68     x,y = x + d[i][0], y + d[i][1]
  69     dot(scr,x,y,char)
  70 
  71 def printscreen(scr):
  72   'Выводит виртуальный экран scr на текстовый экран'
  73   print ""
  74   for l in range(len(scr)-1,-1,-1):
  75     print "".join(scr[l])
  76 
  77 fml = definput("Функция в виде формулы от x", "sin(x)")
  78 X0, X1 = definput("Начало и конец диапазона", -4., 4.)
  79 W, H = definput("Ширина и высота экрана", 80, 30)
  80 N = definput("Количество точек ломаной",40)
  81 X0, X1 = float(X0), float(X1)
  82 print fml, X0, X1, W, H, N
  83 screen=[[" "]*(W+1) for i in range(H+1)]  # "виртуальный экран WxH"
  84 
  85 # Построим график
  86 gr=grafun(X0, X1, N, fml)
  87 # Найдём минимум и максимум функции в этих точках
  88 Y0, Y1 = min([e[1] for e in gr]), max([e[1] for e in gr])
  89 # нарисуем график
  90 for i in range(len(gr)-1):
  91   line(screen, (round(scale(gr[i][0],  X0, X1, 0, W-1)),
  92 		round(scale(gr[i][1],  Y0, Y1, 0, H-1))),
  93 	       (round(scale(gr[i+1][0],X0, X1, 0, W-1)),
  94 		round(scale(gr[i+1][1],Y0, Y1, 0, H-1))),
  95 		"*")
  96 # выведем получившееся
  97 printscreen(screen)

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

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

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