如何在乌龟中找到下一个最近的物体?
How to find the next nearest object in turtle?
我这里有我的代码。当我点击某处时,我试图找到最近的点。所以我在点击的点和所有其他点之间取最小的距离。我的疑问是:
a) 在 line() 中,为什么 least_dist 得到一个值而不是 selected_point?
b) 任何实际获取我的代码的指针都会有所帮助
import turtle
import math
#starting turtle
turtle.ht()
turtle.speed(0)
turtle.setup(600,600)
turtle.penup()
def draw_dots(dot_row,dot_col):
global points
points=[[0 for i in range(5)]for j in range(5)]
dot_x=-200
dot_y=-100
for dots_2 in range(dot_row):
for dots in range(dot_col):
points[dots_2][dots]=(dot_x,dot_y)
#print(points[dots_2][dots])
turtle.goto(dot_x,dot_y)
turtle.dot(20,"black")
dot_x+=100
if dots==dot_col-1:
dot_x=-200
dot_y+=75
for k in range(3): #ignore the next 6 lines cause they are just for verifying
points[k],points[4-k]=points[4-k],points[k]
for i in range(5):
for j in range(5):
print(points[i][j],end=" ")
print()
def line(x,y):
least_dist=500
for k in range(5):
for l in range(5):
if math.sqrt(((points[k][l][0]-x)**2)+(points[k][l][1]-y)**2)<least_dist:
print(1)
least_dist=math.sqrt(((points[k][l][0]-x)**2)+(points[k][l][1]-y)**2)
print(2)
selected_point=(points[k][l][0],points[k][l][1])
print(3)#im putting "print" here just to ensure that that line is under going #compilation but selected point dosent have a value
else:
selected_point="none"
print(selected_point,least_dist)
def clicked(x,y):
turtle.goto(x,y)
column=(x+300) // 100
row=(-y+300) // 75
print("x:",x,"y:",y,"column",column,"row",row)
line(x,y)
turtle.onscreenclick(clicked)
draw_dots(5,5)
您的代码从一开始就有缺陷。例如,您使用以下方法初始化一个包含 25 个二维点的列表:
points=[[0 for i in range(5)]for j in range(5)]
但这会创建一个包含 5 个五维点的列表!你想要更多:
points = [[0, 0] for _ in range(25)]
此索引继续错误:
for dots_2 in range(dot_row):
for dots in range(dot_col):
points[dots_2][dots]=(dot_x,dot_y)
相反,您需要更多类似的东西:
for dots_2 in range(dot_row):
for dots in range(dot_col):
points[dots_2 * 5 + dots] = (dot_x, dot_y)
下面是我重写的代码以使其按照您描述的方式工作:
from turtle import Screen, Turtle
def draw_dots(dot_row, dot_col):
dot_x, dot_y = -200, -150
for row in range(dot_row):
for col in range(dot_col):
points[row * 5 + col] = (dot_x, dot_y)
turtle.goto(dot_x, dot_y)
turtle.dot(20)
dot_x += 100
if col == dot_col - 1:
dot_x = -200
dot_y += 75
def clicked(x, y):
screen.onclick(None)
turtle.goto(x, y)
least_dist = 600
selected_point = None
for point in points:
distance = turtle.distance(point)
if distance < least_dist:
least_dist = distance
selected_point = point
print(selected_point, least_dist)
screen.onclick(clicked)
screen = Screen()
screen.setup(600, 600)
turtle = Turtle()
turtle.hideturtle()
turtle.speed('fastest')
turtle.penup()
points = [[0, 0] for _ in range(25)]
draw_dots(5, 5)
screen.onclick(clicked)
screen.mainloop()
我这里有我的代码。当我点击某处时,我试图找到最近的点。所以我在点击的点和所有其他点之间取最小的距离。我的疑问是: a) 在 line() 中,为什么 least_dist 得到一个值而不是 selected_point? b) 任何实际获取我的代码的指针都会有所帮助
import turtle
import math
#starting turtle
turtle.ht()
turtle.speed(0)
turtle.setup(600,600)
turtle.penup()
def draw_dots(dot_row,dot_col):
global points
points=[[0 for i in range(5)]for j in range(5)]
dot_x=-200
dot_y=-100
for dots_2 in range(dot_row):
for dots in range(dot_col):
points[dots_2][dots]=(dot_x,dot_y)
#print(points[dots_2][dots])
turtle.goto(dot_x,dot_y)
turtle.dot(20,"black")
dot_x+=100
if dots==dot_col-1:
dot_x=-200
dot_y+=75
for k in range(3): #ignore the next 6 lines cause they are just for verifying
points[k],points[4-k]=points[4-k],points[k]
for i in range(5):
for j in range(5):
print(points[i][j],end=" ")
print()
def line(x,y):
least_dist=500
for k in range(5):
for l in range(5):
if math.sqrt(((points[k][l][0]-x)**2)+(points[k][l][1]-y)**2)<least_dist:
print(1)
least_dist=math.sqrt(((points[k][l][0]-x)**2)+(points[k][l][1]-y)**2)
print(2)
selected_point=(points[k][l][0],points[k][l][1])
print(3)#im putting "print" here just to ensure that that line is under going #compilation but selected point dosent have a value
else:
selected_point="none"
print(selected_point,least_dist)
def clicked(x,y):
turtle.goto(x,y)
column=(x+300) // 100
row=(-y+300) // 75
print("x:",x,"y:",y,"column",column,"row",row)
line(x,y)
turtle.onscreenclick(clicked)
draw_dots(5,5)
您的代码从一开始就有缺陷。例如,您使用以下方法初始化一个包含 25 个二维点的列表:
points=[[0 for i in range(5)]for j in range(5)]
但这会创建一个包含 5 个五维点的列表!你想要更多:
points = [[0, 0] for _ in range(25)]
此索引继续错误:
for dots_2 in range(dot_row):
for dots in range(dot_col):
points[dots_2][dots]=(dot_x,dot_y)
相反,您需要更多类似的东西:
for dots_2 in range(dot_row):
for dots in range(dot_col):
points[dots_2 * 5 + dots] = (dot_x, dot_y)
下面是我重写的代码以使其按照您描述的方式工作:
from turtle import Screen, Turtle
def draw_dots(dot_row, dot_col):
dot_x, dot_y = -200, -150
for row in range(dot_row):
for col in range(dot_col):
points[row * 5 + col] = (dot_x, dot_y)
turtle.goto(dot_x, dot_y)
turtle.dot(20)
dot_x += 100
if col == dot_col - 1:
dot_x = -200
dot_y += 75
def clicked(x, y):
screen.onclick(None)
turtle.goto(x, y)
least_dist = 600
selected_point = None
for point in points:
distance = turtle.distance(point)
if distance < least_dist:
least_dist = distance
selected_point = point
print(selected_point, least_dist)
screen.onclick(clicked)
screen = Screen()
screen.setup(600, 600)
turtle = Turtle()
turtle.hideturtle()
turtle.speed('fastest')
turtle.penup()
points = [[0, 0] for _ in range(25)]
draw_dots(5, 5)
screen.onclick(clicked)
screen.mainloop()