【问题标题】:Drawing a pattern using turtle使用海龟绘制图案
【发布时间】:2020-10-18 13:15:20
【问题描述】:

我正在尝试在正方形内绘制点图案。我已经设法绘制了图案,但是正方形中间有一个间隙(由于 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()

【问题讨论】:

  • this fixed code 怎么样?仅修复了两个鞍形函数中 j 循环的范围。结果图像here.
  • 基本上你的j循环应该是从0(n+1)//2的相同范围。一个函数绘制正值x,另一个绘制负值x,范围相同。
  • 好的,如果它解决了您的任务,我将发布此代码作为答案!
  • 要具有递减范围,您必须指定负增量。例如尝试range(10, 0, -1) 并查看documentation on range
  • @Grace500 我还在my answer 中发布了simplified version of code,它只有一个绘图功能,范围从j-(n+1)//2(n+1)//2

标签: python turtle-graphics


【解决方案1】:

我相信你让这个问题变得比必要的更困难。我首先会得到代码来简单地绘制一个统一的点网格。然后修改代码以根据它们在网格中的位置调整点的大小。比如:

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

我已经让我的代码坚持n 的奇数,否则模式不是对称的。

【讨论】:

    【解决方案2】:

    您的一个函数为负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()
    

    生成的图像输出如下:

    您的代码可以简化为只有一个绘图函数,它在-(n + 1) / 2(n + 1) / 2 的范围内绘制x (j)。 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()
    

    【讨论】:

    • 我已经运行了您的所有三个示例解决方案,并且 none 似乎生成了所需的图像。仔细看看每个的输出。
    • @cdlane 问题的作者同意事实上我的画是正确的,也是他想要的。在我的机器上,第一个代码绘制this image,这就是作者想要的。问题帖子中显示的图片不是想要的输出,而是作者的代码当前显示的内容,他想要输出like this
    • 我的评论基于您上面的第 4 列和第 5 列是相同的,尽管在 OP 发布的图像中,它们是不同的。在您的替代解决方案中,相邻行是相同的,与 OP 的图像不同。而且它们不会生成与上面相同的图像。
    • 虽然我按照您建议的方式更改了我的代码,但在上面提供的代码中,第 4 列和第 5 列是相同的,这不应该是这种情况。但是,在我的代码中更改 j 循环发表作品!
    • @Grace500 是的,这只是我的一个想法,j 在两个循环中都处于错误的范围内,所以这个想法只是稍微修改它,尽管可能需要一些小的调整。顺便说一句,我答案末尾的简化代码正确绘制了所有内容!
    猜你喜欢
    • 2016-01-05
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多