如何在乌龟中找到下一个最近的物体?

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()