使用乌龟绘制图案

时间:2020-10-18 13:15:20

标签: python turtle-graphics

我正在尝试在正方形内绘制点的图案。我已经设法画出了图案,但是在正方形的中间有一个缝隙(由于x坐标的反转而造成)。我该如何纠正该错误?我试图反转范围(而不是x坐标),但是python不接受这种格式。

import turtle

T = turtle.Turtle()
turtle.tracer(0,0)
T.speed(10)
T.pensize(3)

zoom = 40 

def verticalSaddle2(T,n,k):
   for j in range(((n+1)//2),n+1):
          
    for i in range(1,(n+1)//2):
     
        if k <= 1 :
            return()

        else:
                        
                            T.penup()
                            T.setpos((j)* zoom, (i) * zoom)
                            T.pendown()
                            

                            T.dot(k)
                            k=k-2

    for i in range(((n+1)//2),n+1):
     
        if k <= 1 :
            return()
        else:
                        
                            T.penup()
                            T.setpos((j)* zoom, (i) * zoom)
                            T.pendown()
                            

                            T.dot(k)
                            k=k+2

 k=10
 n=7


 verticalSaddle2(T,n,k)

def verticalSaddle3(T,n,k):
for j in range(1,((n+1)//2)):
    
            for i in range(1,(n+1)//2):
             
                if k <= 1 :
                    return()

                else:
                                
                                    T.penup()
                                    T.setpos((-j)* zoom, (i) * zoom)
                                    T.pendown()
                                    

                                    T.dot(k)
                                    k=k-2

            for i in range(((n+1)//2),n+1):
             
                if k <= 1 :
                    return()
                else:
                                
                                    T.penup()
                                    T.setpos((-j)* zoom, (i) * zoom)
                                    T.pendown()
                                    

                                    T.dot(k)
                                    k=k+2
        
k=12
n=7
            
verticalSaddle3(T, n, k)

turtle.update()
turtle.done()

2 个答案:

答案 0 :(得分:0)

您的其中一个函数为负x绘制图片的左侧部分,另一个函数为正x为其右侧绘制几乎相同的图片,这两个部分只是另一部分的镜像版本。 xj循环处理。为了无间隙地绘制左右图像,您的两个j循环应固定为从0(n+1)//2的相同范围。产生的固定代码如下:

import turtle

T = turtle.Turtle()
turtle.tracer(0,0)
T.speed(0.01)
T.pensize(3)

zoom = 40 

def verticalSaddle2(T,n,k):
    for j in range(0,(n+1) // 2):
              
        for i in range(1,(n+1)//2):
         
            if k <= 1 :
                return()

            else:
                            
                T.penup()
                T.setpos((j)* zoom, (i) * zoom)
                T.pendown()
                

                T.dot(k)
                k=k-2

        for i in range(((n+1)//2),n+1):
         
            if k <= 1 :
                return()
            else:
                            
                T.penup()
                T.setpos((j)* zoom, (i) * zoom)
                T.pendown()
                

                T.dot(k)
                k=k+2

k=10
n=7


verticalSaddle2(T,n,k)

def verticalSaddle3(T,n,k):
    for j in range(0,((n+1)//2)):
        
        for i in range(1,(n+1)//2):
         
            if k <= 1 :
                return()

            else:
                            
                T.penup()
                T.setpos((-j)* zoom, (i) * zoom)
                T.pendown()
                

                T.dot(k)
                k=k-2

        for i in range(((n+1)//2),n+1):
         
            if k <= 1 :
                return()
            else:
                            
                T.penup()
                T.setpos((-j)* zoom, (i) * zoom)
                T.pendown()
                

                T.dot(k)
                k=k+2
        
k=12
n=7
            
verticalSaddle3(T, n, k)

turtle.update()
turtle.done()

结果图像输出如下:

enter image description here

您的代码可以简化为仅具有一个绘制函数,该函数在xj范围内绘制-(n + 1) / 2(n + 1) / 2)。 Simplified code is here

可以简化代码,使其具有如下所示的短代码:

import turtle

T = turtle.Turtle()
turtle.tracer(0,0)
T.pensize(3)

zoom = 40 

def saddle(T, n, k):
    for j in range(-((n + 1) // 2) + 1, (n + 1) // 2):
        for i in range(1, n + 1):
            T.penup()
            T.setpos(j * zoom, i * zoom)
            T.pendown()
            T.dot(k - 2 * (min(i - 1, n - i) + (n + 1) // 2 - 1 - abs(j)))

saddle(T, 7, 16)

turtle.update()
turtle.done()

答案 1 :(得分:0)

我相信您正在使这个问题变得更加困难。首先,我将获得代码以简单地绘制均匀点的网格。然后修改代码以根据点在网格中的位置调整大小。像这样:

from turtle import Screen, Turtle

DISTANCE = 40

def saddle(t, n, minimum=1):
    assert n % 2 == 1, "n should be odd"

    t.penup()

    for x in range(-n // 2 + 1, n // 2 + 1):
        t.setx(x * DISTANCE)

        for y in range(-n // 2 + 1, n // 2 + 1):
            t.sety(y * DISTANCE)
            t.dot(2 * (minimum + abs(x) + abs(y)))

screen = Screen()
screen.tracer(False)

turtle = Turtle()
turtle.hideturtle()

saddle(turtle, 7)

screen.tracer(True)
screen.exitonclick()

enter image description here

我已经使我的代码对n坚持使用奇数,否则该模式将不对称。