Масштабирование рисунка черепахи python - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь написать python скрипт, который берет n и рисует кривую Гильберта на основе этого порядка. мой алгоритм работает нормально, это dr aws кривая и изменить размер при изменении размера окна. тем не менее, мой рисунок не по центру и может go вне пределов. Я хотел бы масштабировать кривую с экраном, не имея много пустого пространства или не выходя за границы

вот мой код:

import sys
import turtle
from turtle import Turtle, Screen


#Drawing the hilbert curve using recursion.
#Var: turtle if for the Turtle, A is the length of the lines, parity is for inverting the direction, and n is for the order
def hilbert_curve(turtle, A, parity, n):

if n < 1:
    return

turtle.left(parity * 90)
hilbert_curve(turtle, A, - parity, n - 1)
turtle.forward(A)
turtle.right(parity * 90)
hilbert_curve(turtle, A, parity, n - 1)
turtle.forward(A)
hilbert_curve(turtle, A, parity, n - 1)
turtle.right(parity * 90)
turtle.forward(A)
hilbert_curve(turtle, A, - parity, n - 1)
turtle.left(parity * 90)



def main():
    #Rescale the drawing when changing the window size
    def onResize(x=0, y=0):
     width = my_win.window_width()
     hight = my_win.window_height()
     my_win.setworldcoordinates(-width-1, -hight-1, width-1, hight-1)
     my_win.ontimer(onResize,100)


#initilize the turtle.
turtle = Turtle()
#initilize the screen.
my_win = Screen()
w = my_win.window_width()
h = my_win.window_height()
A = 20
onResize()




rule = 1
my_win.tracer(False)
if len(sys.argv) < 2:
    print("Please declare the order after calling the program name")
    return
n = int(sys.argv[1])
hilbert_curve(turtle,A,rule,n)

my_win.update()
my_win.mainloop()


main()

** Я был бы признателен, если кто-то могу решить мою проблему спасибо **

1 Ответ

1 голос
/ 23 января 2020

мой алгоритм работает нормально, он др aws кривая и изменяет размер при изменении размера окна.

Нет, это не так. Ваш рисунок никогда не масштабируется, он остается того же размера. И ваша main() функция, которая устанавливает код масштабирования, никогда не вызывается, как это следует из вызова mainloop(), который передает управление обработчику событий tkinter:

my_win.mainloop()

main()

Использование Таймер событий является неправильным способом go об этой проблеме. Однако, так как черепаха не отображает событие изменения размера основного окна tkinter, давайте поиграем с этой моделью, а не опускаемся до уровня tkinter. Вместо этого я бы сделал это следующим образом:

from turtle import Turtle, Screen

def hilbert_curve(turtle, A, parity, n):

    '''
    Draw the hilbert curve using recursion.

    Arguments:
        turtle is for the Turtle,
        A is the length of the lines,
        parity is for inverting the direction,
        and n is for the order
    '''

    if n < 1:
        return

    turtle.left(parity * 90)
    hilbert_curve(turtle, A, - parity, n - 1)
    turtle.forward(A)
    turtle.right(parity * 90)
    hilbert_curve(turtle, A, parity, n - 1)
    turtle.forward(A)
    hilbert_curve(turtle, A, parity, n - 1)
    turtle.right(parity * 90)
    turtle.forward(A)
    hilbert_curve(turtle, A, - parity, n - 1)
    turtle.left(parity * 90)

def main():
    order = 4
    parity = 1
    length = 100 / (4 * order - 1)

    def onResize():
        # Rescale drawing when changing window size (the hard way)
        turtle.reset()
        screen.setworldcoordinates(0, 0, 100, 100)
        hilbert_curve(turtle, length, parity, order)
        screen.update()
        screen.ontimer(onResize, 1000)

    screen = Screen()
    screen.tracer(False)

    turtle = Turtle()

    onResize()

    screen.mainloop()

main()

Т.е. поддерживать постоянные виртуальные координаты независимо от размера окна и перерисовывать кривую, чтобы соответствовать текущему размеру окна. Кстати, Разве я не написал этот код кривой Гильберта ? Убедитесь, что вы проголосовали, откуда вы взяли!

...