繁体   English   中英

使用海龟绘制图案

[英]Drawing a pattern using turtle

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

您的一个函数为负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 ) 。 简化代码在这里

使用非常短的代码可以进一步简化,如下所示:

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

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

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的奇数,否则模式不对称。

如果你想绘制一个填充成正方形的均匀圆圈的点画(ala Damien Hirst),这里是代码。 您可以通过相应地更改 for 循环上的 function 范围来更改尺寸。 colors 是随机添加的,因此您可以忽略 colors,或者将它们设置为黑色,作为图案。

import turtle as tim
from turtle import Screen
import random

tim.colormode(255)

color_list = [(25, 108, 164), (194, 38, 81), (238, 161, 49), (234, 215, 85), (226, 237, 228), (223, 137, 176),
              (144, 108, 56), (102, 197, 219), (206, 166, 29), (20, 57, 132), (214, 73, 90), (239, 89, 50),
              (141, 208, 227), (118, 192, 140), (3, 186, 176), (106, 107, 199), (138, 29, 73), (4, 161, 86),
              (98, 51, 36), (22, 156, 210), (232, 165, 184), (175, 185, 221), (29, 90, 95), (233, 172, 161),
              (152, 213, 190), (242, 205, 8), (89, 48, 31), (39, 46, 81), (26, 97, 94)]

tim.penup()


def dot_painting():
    count = 0
    for _ in range(10):
        for step in range(10):
            tim.dot(30, random.choice(color_list))
            tim.forward(35)
            if step == 9:
                count += 1
                if count % 2 != 0:
                    turn_left()
                else:
                    turn_right()


def turn_right():
    tim.dot(30, random.choice(color_list))
    tim.right(90)
    tim.forward(35)
    tim.right(90)


def turn_left():
    tim.dot(30, random.choice(color_list))
    tim.left(90)
    tim.forward(35)
    tim.left(90)


dot_painting()

screen = Screen()
screen.exitonclick()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM