วาดลวดลายโดยใช้เต่า

Oct 18 2020

ฉันกำลังพยายามวาดรูปแบบของจุดภายในสี่เหลี่ยมจัตุรัส ฉันสามารถวาดรูปแบบได้แล้ว แต่มีช่องว่างตรงกลางของสี่เหลี่ยม (เกิดจากการผกผันของพิกัด 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()

คำตอบ

cdlane Oct 19 2020 at 00:01

ฉันเชื่อว่าคุณกำลังทำให้ปัญหานี้ยากเกินความจำเป็น ก่อนอื่นฉันจะได้รับรหัสเพื่อวาดเส้นตารางของจุดที่สม่ำเสมอ จากนั้นแก้ไขโค้ดเพื่อปรับขนาดจุดตามตำแหน่งในตาราง สิ่งที่ต้องการ:

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มิฉะนั้นรูปแบบจะไม่สมมาตร

Arty Oct 18 2020 at 13:52

ฟังก์ชันหนึ่งของคุณวาดส่วนซ้ายของภาพเป็นค่าลบ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()