Среда программирования:
Brackets build 1.14.2-17770
Статья по теме:
Программа, отрисовывающая фрактал Висекка, написанная на Python.
В первом поле ввода - задаем ширину для отрисовки.
По нажатии на кнопку "Расчитать" отрисуется фрактал, образованный с удалением угловых
квадратов, если нажат соответствующий checkbutton, с удержанием угловых квадратов - иначе.
Код программы:
from tkinter import * from tkinter import messagebox import colorsys class Application(Frame): def __init__(self,master=None): super().__init__(master) self.grid() self.create_widgets() self.master.title("Фрактал Висекка") self.master.geometry(f"1100x480+50+50") self.master.resizable(False, False) def create_widgets(self): left_frame = Frame(root, width=640, height=480, pady=5).grid(row=0,column=0,sticky="wens") right_frame = Frame(root,width=460, height=480, padx=5, pady=5) right_frame.grid(row=0,column=1,sticky="wens") # холст для вывода фрактала self.canvas = Canvas(left_frame,width=640,height=480) self.canvas.grid(row=0, column=0,sticky="wens", pady=5, padx=5) # ввод ширины поля для отрисовки фрактала Label(right_frame,text="Ширина прорисовки",font=('Arial',10)).grid( row=0, column=0,sticky="w", pady=5, padx=5) self.enteredValue = IntVar() Entry(right_frame,textvariable = self.enteredValue,width=15,font=('Arial',10)).grid( row=0,column=1,sticky="w",padx=5,pady=5) # выбор вида построения self.CheckVar= IntVar() R1 = Checkbutton(right_frame, text = "C удалением угловых квадратов", variable = self.CheckVar, onvalue = 1, offvalue = 0).grid(row=1,column=0,sticky="we",padx=5,pady=5,columnspan=2) # кнопка для вывода Button(right_frame,text="Расчитать",font=('Arial',10),command=lambda: self.calc()).grid( row=2,column=0,columnspan=2, stick="we",padx=5,pady=5) # метод вызывающий отрисовку фрактала def calc(self): # очищаем холст перед отрисовкой self.canvas.delete("all") self.L = self.enteredValue.get() # вызываем метод vicsek - передаем центр холста, ширину прорисовки и глубину просчета от 1 до 5 # если выбрано построение с удалением угловых коэфиициентов вызываем vicsek2, если с сохранением - vicsek1 if self.CheckVar.get()==1: self.vicsek2(320,240,self.L,5) else: self.vicsek1(320,240,self.L,5) def vicsek1(self,x,y,length,n): if n==0: self.draw_cross(x,y,length) return # Рассчитываем центры для ветвей self.vicsek1(x,y,length/3,n-1) self.vicsek1(x+length/3,y,length/3,n-1) self.vicsek1(x-length/3,y,length/3,n-1) self.vicsek1(x,y+length/3,length/3,n-1) self.vicsek1(x,y-length/3,length/3,n-1) def vicsek2(self,x,y,length,n): if n==0: self.draw_cross(x,y,length) return # Рассчитываем центры для ветвей self.vicsek2(x-length/3,y-length/3,length/3,n-1) self.vicsek2(x-length/3,y+length/3,length/3,n-1) self.vicsek2(x+length/3,y-length/3,length/3,n-1) self.vicsek2(x+length/3,y+length/3,length/3,n-1) self.vicsek2(x,y,length/3,n-1) def draw_cross(self,x,y,length): # выбираем цвет для фигуры h =(x**2+y**2)**0.5/self.L r,g,b = colorsys.hsv_to_rgb(h,1,1) sx=x-length/2 sy=y-length/6 d=length/3 # рисуем крестик self.canvas.create_line(sx,sy,sx,sy+d,fill="#%02x%02x%02x"%(round(r * 255), round(g * 255), round(b * 255))) self.canvas.create_line(sx,sy+d,sx+d,sy+d,fill="#%02x%02x%02x"%(round(r * 255), round(g * 255), round(b * 255))) self.canvas.create_line(sx+d,sy+d,sx+d,sy+2*d,fill="#%02x%02x%02x"%(round(r * 255), round(g * 255), round(b * 255))) self.canvas.create_line(sx+d,sy+2*d,sx+2*d,sy+2*d,fill="#%02x%02x%02x"%(round(r * 255), round(g * 255), round(b * 255))) self.canvas.create_line(sx+2*d,sy+2*d,sx+2*d,sy+d,fill="#%02x%02x%02x"%(round(r * 255), round(g * 255), round(b * 255))) self.canvas.create_line(sx+2*d,sy+d,sx+3*d,sy+d,fill="#%02x%02x%02x"%(round(r * 255), round(g * 255), round(b * 255))) self.canvas.create_line(sx+3*d,sy+d,sx+3*d,sy,fill="#%02x%02x%02x"%(round(r * 255), round(g * 255), round(b * 255))) self.canvas.create_line(sx+3*d,sy,sx+2*d,sy,fill="#%02x%02x%02x"%(round(r * 255), round(g * 255), round(b * 255))) self.canvas.create_line(sx+2*d,sy,sx+2*d,sy-d,fill="#%02x%02x%02x"%(round(r * 255), round(g * 255), round(b * 255))) self.canvas.create_line(sx+2*d,sy-d,sx+d,sy-d,fill="#%02x%02x%02x"%(round(r * 255), round(g * 255), round(b * 255))) self.canvas.create_line(sx+d,sy-d,sx+d,sy,fill="#%02x%02x%02x"%(round(r * 255), round(g * 255), round(b * 255))) self.canvas.create_line(sx+d,sy,sx,sy,fill="#%02x%02x%02x"%(round(r * 255), round(g * 255), round(b * 255))) root = Tk() app = Application(master=root) root.mainloop()
Прикрепленный файл | Размер |
---|---|
tsybrik_example_vicsek.rar | 1.44 кб |