缩放绘制Python的海龟

2024-06-01 06:26:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个python脚本,它取n,并根据这个顺序绘制一条希尔伯特曲线。我的算法工作得很好,它在更改窗口大小时绘制曲线并重新缩放大小。然而,我的画没有居中,可能会越界。我想用屏幕缩放曲线,而不需要太多的空白空间,也不想让它超出范围

这是我的密码:

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()

**如果有人能解决我的问题,我将不胜感激谢谢**


Tags: theimportforifmysyswindowwidth
1条回答
网友
1楼 · 发布于 2024-06-01 06:26:02

my algorithm work fine it draws the the curve and rescale the size when changing the window size.

不,没有。您的图形是从不缩放的,其大小保持不变。设置缩放代码的main()函数是从不调用的,因为它遵循mainloop()调用,该调用将控制权移交给tkinter事件处理程序:

my_win.mainloop()

main()

使用事件计时器是解决此问题的错误方法。但是,由于turtle不公开底层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()

即,无论窗口大小如何,保持恒定的虚拟坐标,并重新绘制曲线以适应当前窗口大小。顺便说一句,didn't I write this Hilbert curve code?一定要把你从哪里弄来的票投上去

相关问题 更多 >