Прикреплённый файл «2013-02-08.drawgraph-dumb.py»

Загрузка

   1 #!/usr/bin/env python
   2 # coding: utf
   3 '''
   4 Рисование произвольного графа.
   5 Это, вообще говоря, страшно сложная задача.
   6 Поэтому потерпим такой внешний вид, какой получится :)
   7 
   8 Граф вводится в виде списка вершин.
   9 '''
  10 
  11 import turtle
  12 from math import *
  13 
  14 def line(M1,M2):
  15     '''Нарисовать стрелку из M1 в M2'''
  16     turtle.up()
  17     turtle.goto(*M1)
  18     turtle.down()
  19     turtle.goto(*M2)
  20 
  21 def arrow(M1,M2):
  22     '''Нарисовать стрелку из M1 в M2'''
  23     line(M1,M2)
  24     w=turtle.distance(M1)
  25     # Тупой вариант стрелки.
  26     # Правильнее было бы определить угол и нарисовать две линии
  27     for i in xrange(1,20):
  28         turtle.width(i/2)
  29         x=M2[0]-(M2[0]-M1[0])*i/w
  30         y=M2[1]-(M2[1]-M1[1])*i/w
  31         turtle.goto(x,y)
  32         turtle.width(1)
  33 
  34 def coord(n,addx=10,addy=10):
  35     '''Выдать координату вершины n'''
  36     W,H=turtle.screensize()
  37     W-=2*addx
  38     H-=2*addy
  39     # Это плохие, негодные координаты: стрелки сливаются
  40     return addx+n%(Raw+1)*W/Raw-W/2, addy+n/(Raw+1)*H/(Raw-1)-H/2
  41 
  42 def drawpeaks(peaks):
  43     turtle.up()
  44     turtle.pencolor("red")
  45     for p in peaks:
  46         turtle.goto(coord(p))
  47         turtle.write(str(p),font=("Arial",12,"normal"))
  48 
  49 def drawgraph(Graph, fun=line):
  50     for a,b in Graph:
  51         fun(coord(a),coord(b))
  52 
  53 turtle.setup(width=0.80, height=0.80)
  54 turtle.screensize(turtle.window_width()*0.9,turtle.window_height()*0.9)
  55 
  56 Graph=input()
  57 ins=set((l[0] for l in Graph))
  58 outs=set((l[1] for l in Graph))
  59 peaks=ins|outs
  60 N=max(peaks)
  61 Raw=int(sqrt(N))
  62 print turtle.screensize(),N,Raw,Raw*(Raw+1)
  63 
  64 turtle.tracer(0)
  65 turtle.hideturtle()
  66 drawgraph(Graph, arrow)
  67 drawpeaks(peaks)
  68 
  69 turtle.mainloop()

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

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

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