使用乌龟绘制图案 [英] Drawing a pattern using turtle
问题描述
我正在尝试在正方形内绘制点图案.我已经设法绘制了图案,但是正方形中间有一个间隙(由于 x 坐标的反转引起).我该如何纠正这个错误?我试图反转范围(而不是 x 坐标),但 python 不接受这种格式.
I am trying to draw a pattern of dots within a square. I have managed to draw the pattern, however there is a gap in the middle of the square (caused due to the inversion of the x coordinates). How can I correct this error? I have tried to invert the range (instead of the x coordinates), but python does not accept this format.
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
.生成的固定代码如下:
One of your function draws left part of picture for negative x
, another function almost same picture for right part for positive x
, both parts are just mirrored versions of another part. x
is handled by j
loop. In order to draw same left and right picture without gap your both j
loops should be fixed to be in same range, from 0
to (n+1)//2
. Resulting fixed code below:
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 范围内绘制
code> 到 x
(j
)(n + 1)/2
.简化的代码是这里.
Your code can be simplified to have just one drawing function which draws x
(j
) in range from -(n + 1) / 2
to (n + 1) / 2
. Simplified code is here .
使用非常短的代码可以进一步简化,如下所示:
It is possible to simplify even more to have very short code like next:
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()
这篇关于使用乌龟绘制图案的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!