Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.
Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.
Спасибо за статью. Я не Ваш студент. Но мне она помогла написать функцию для Канторова множества на Python для черепашки: import turtle def kanter(x, y, d):     if d > 1:         turtle...
Как реализовать в данном примере границы расчёта?

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Скриншот к примеру
Среда программирования: 
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.rar1.44 кб