[英]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
右侧部分绘制几乎相同的图片,两个部分都只是另一部分的镜像版本。 x
由j
循环处理。 为了在没有间隙的情况下绘制相同的左右图片,您的两个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.