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

Загрузка

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

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

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

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