วาดลวดลายโดยใช้เต่า
ฉันกำลังพยายามวาดรูปแบบของจุดภายในสี่เหลี่ยมจัตุรัส ฉันสามารถวาดรูปแบบได้แล้ว แต่มีช่องว่างตรงกลางของสี่เหลี่ยม (เกิดจากการผกผันของพิกัด 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()
คำตอบ
ฉันเชื่อว่าคุณกำลังทำให้ปัญหานี้ยากเกินความจำเป็น ก่อนอื่นฉันจะได้รับรหัสเพื่อวาดเส้นตารางของจุดที่สม่ำเสมอ จากนั้นแก้ไขโค้ดเพื่อปรับขนาดจุดตามตำแหน่งในตาราง สิ่งที่ต้องการ:
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มิฉะนั้นรูปแบบจะไม่สมมาตร
ฟังก์ชันหนึ่งของคุณวาดส่วนซ้ายของภาพเป็นค่าลบ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()
ผลลัพธ์ของภาพด้านล่าง:
รหัสของคุณได้ง่ายที่จะมีเพียงหนึ่งฟังก์ชั่นการวาดภาพที่ดึงx( j) อยู่ในช่วงจากไป-(n + 1) / 2 รหัสย่ออยู่ที่นี่(n + 1) / 2
เป็นไปได้ที่จะลดความซับซ้อนมากยิ่งขึ้นหากมีโค้ดสั้น ๆ เช่นถัดไป:
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()