Attachment 'fig.py'

Download

   1 #!/usr/bin/env python
   2 # coding: utf
   3 '''
   4     Фигура задаётся как набор ломаных, представляющих собой последовательность координат точек, например
   5 
   6     1,1;1,10;10,10;10,1;1,1 2,2;9,12;12,9;2,2
   7 
   8     Абсцисса отделяется от ординаты запятой, координаты разделяются точкой с запятой, ломаные — пробелом.
   9         Ввести произвольную фигуру и нарисовать её
  10 
  11         + в следующей строке ввести тройку вида угол_поворота,масштаб и нарисовать эту фигуру с поворотом и в ином масштабе
  12 
  13         /!\ ввести несколько троек и нарисовать фигуры рядом 
  14 
  15 
  16 '''
  17 
  18 from math import *
  19 from turtle import *
  20 
  21 def scale(A0,B0,A1,B1,x):
  22     return float(x-A0)/(B0-A0)*(B1-A1)+A1
  23 
  24 def rotate(M,O,A):
  25     X=(M[0]-O[0])*cos(A)-(M[1]-O[1])*sin(A)+O[0]
  26     Y=(M[1]-O[1])*cos(A)+(M[0]-O[0])*sin(A)+O[1]
  27     return X,Y
  28 
  29 def rotoscale(dots,m,M,alpha):
  30     # списки абсцисс и ординат
  31     X,Y = zip(*dots)
  32     mx,Mx,my,My=min(X),max(X),min(Y),max(Y)
  33     # перенос+масштабирование всех точек
  34     ds = [(scale(mx,Mx,m[0],M[0],x),scale(my,My,m[1],M[1],y)) for x,y in dots]
  35     center = (m[0]+M[0])/2.,(m[1]+M[1])/2.
  36     # поворот всех точек относительно центра целевого прямоугольника
  37     return [rotate(d,center,alpha) for d in ds]
  38 
  39 def rotoscales(lines,m,M,alpha):
  40     return [rotoscale(lin,m,M,alpha) for lin in lines]
  41 
  42 def draw(lines,col="black"):
  43     up()
  44     for line in lines:
  45         goto(*line[0])
  46         down()
  47         color(col)
  48         for x,y in line[1:]:
  49             goto(x,y)
  50         up()
  51 
  52 reset()
  53 lines=[[map(int,coord.split(",")) for coord in line.split(";")] for line in raw_input().split()]
  54 
  55 xlines,ylines=zip(*sum(lines,[]))
  56 mx,Mx,my,My=min(xlines),max(xlines),min(ylines),max(ylines)
  57 w,h=Mx-mx,My-my
  58 
  59 draw(lines)
  60 
  61 AS=raw_input()
  62 while AS:
  63     a,s=map(float,AS.split(","))
  64     W,H=w*s,h*s
  65     ll=rotoscales(lines,(mx*W/w,my*H/h),(Mx*W/w,My*H/h),a)
  66     draw(ll)
  67     AS=raw_input()
  68 
  69 exitonclick()

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.

You are not allowed to attach a file to this page.