Как нарисовать этот набор IFS кантора с метками? - PullRequest
0 голосов
/ 01 июля 2019

Я использую графический пакет Zelle в Python, чтобы нарисовать итерации кантора-троицы типа графа IFS (система итеративных функций). Я хочу нарисовать систему повторяющихся функций:

{R;x/9+1/6,2/3+x/9,x/9+1/3,x/9+5/6}

Следующий код является имитацией того, что я нашел в Интернете. Код правильный? Как сделать так, чтобы у каждого отрезка линии был свой цвет, и как обозначить точки на каждом этапе?

from graphics import *

def cantor_set(win,x,y,h,Len): 

    if Len < 2: return

    line = Line(Point(x, y), Point(x+Len, y))
    line.setWidth(20)
    line.draw(win)

    cantor_set(win,2*x+3,y+h,h,Len//18)
    cantor_set(win,2*x+12,y+h,h,Len//18)
    cantor_set(win,2*x+6,y+h,h,Len//18)
    cantor_set(win,2*x+15,y+h,h,Len//18)

def cantor_set_starter():
    Len = 790
    win = GraphWin("Cantor Set", 800, 200)
    c = cantor_set(win,5,20,50,790)
win.postscript(file = "can1.eps")
#win.getMouse()
#win.close()
cantor_set_starter()

1 Ответ

0 голосов
/ 04 июля 2019

Существует два основных типа ошибок в программировании: синтаксис и алгоритм . Ваша программа страдает от обоих. Мы можем довольно легко исправить ваши синтаксис ошибок:

from graphics import *

def cantor_set(win, x, y, h, length):

    if length < 2:
        return

    line = Line(Point(x, y), Point(x + length, y))
    line.setWidth(20)
    line.draw(win)

    cantor_set(win, 2 * x + 3, y + h, h, length // 18)
    cantor_set(win, 2 * x + 12, y + h, h, length // 18)
    cantor_set(win, 2 * x + 6, y + h, h, length // 18)
    cantor_set(win, 2 * x + 15, y + h, h, length // 18)

def cantor_set_starter(length):
    cantor_set(win, 5, 20, 50, length)

win = GraphWin("Cantor Set", 800, 200)

cantor_set_starter(790)

win.getMouse()
win.close()

Но так как в алгоритме имеется ошибка , он не рисует канарно-подобный граф. Чтобы помочь вам исправить это, нам нужно знать больше о том, где вы получили уравнение системы итерированных функций и другие детали. Если цель состоит в том, чтобы просто нарисовать набор Кантора, мы можем изменить вашу программу для этого, в основном, выбрасывая код и корректируя математику в том, что осталось:

from graphics import *

def cantor_set(win, x, y, height, length):

    if length < 2:
        return

    line = Line(Point(x, y), Point(x + length, y))
    line.setWidth(height / 2)
    line.draw(win)

    length /= 3

    cantor_set(win, x, y + height, height, length)
    cantor_set(win, x + 2 * length, y + height, height, length)

win = GraphWin("Cantor Set", 800, 300)

cantor_set(win, 5, 20, 50, 790)

win.getMouse()
win.close()

enter image description here

...