Vẽ mẫu bằng con rùa
Tôi đang cố gắng vẽ một mô hình chấm trong một hình vuông. Tôi đã cố gắng vẽ mô hình, tuy nhiên có một khoảng trống ở giữa hình vuông (gây ra do sự đảo ngược tọa độ x). Làm cách nào để sửa lỗi này? Tôi đã cố gắng đảo ngược phạm vi (thay vì tọa độ x), nhưng python không chấp nhận định dạng này.
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()
Trả lời
Tôi tin rằng bạn đang làm cho vấn đề này khó khăn hơn mức cần thiết. Đầu tiên tôi sẽ lấy mã để vẽ một lưới các chấm đồng nhất. Sau đó, sửa đổi mã để kích thước các chấm dựa trên vị trí của chúng trong lưới. Cái gì đó như:
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()
Tôi đã làm cho mã của mình nhấn mạnh vào một số lẻ n, nếu không thì mô hình không đối xứng.
Một trong các chức năng của bạn vẽ phần bên trái của hình ảnh cho âm bản x, một chức năng khác gần giống hình ảnh cho phần bên phải cho phần tích cực x, cả hai phần chỉ là phiên bản nhân bản của phần khác. xđược xử lý bằng jvòng lặp. Để vẽ cùng một hình bên trái và bên phải mà không có khoảng cách, cả hai jvòng của bạn phải được cố định trong cùng một phạm vi, từ 0đến (n+1)//2. Kết quả mã cố định bên dưới:
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()
Kết quả đầu ra hình ảnh bên dưới:
Mã của bạn có thể được đơn giản hóa để chỉ có một hàm vẽ vẽ x( j) trong phạm vi từ -(n + 1) / 2đến (n + 1) / 2. Mã đơn giản là ở đây .
Có thể đơn giản hóa hơn nữa để có mã rất ngắn như tiếp theo:
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()