TurtleGraphics Python - Ограничение случайного перемещения черепахи по кругу? - PullRequest
0 голосов
/ 21 сентября 2009

Как я мог бы заставить случайно перемещающуюся черепаху быть ограниченным внутри круга с радиусом 50, центр круга в (0, 0)? Таким образом, если черепаха в данный момент находится в местоположении (x, y), ее расстояние от центра равно math.sqrt (x ** 2 + y ** 2). Когда расстояние между черепахой и ее центром больше 50, пусть она развернется и продолжит. Я получил код для работы с размером экрана, но куда мне поместить math.sqrt (x ** 2 + y ** 2), чтобы ограничить его кругом? Вот код, который у меня есть:

import turtle, random, math

def bounded_random_walk(num_steps, step_size, max_turn):
    turtle.reset()
    width = turtle.window_width()
    height = turtle.window_height()
    for step in range(num_steps):
       turtle.forward(step_size)
       turn = random.randint(-max_turn, max_turn)
       turtle.left(turn)

       x, y = turtle.position()
       if -width/2 <= x <= width/2 and -height/2 <= y <= height/2:
           pass
       else:  # turn around!
           turtle.left(180)
           turtle.forward(step_size)

Этот код работает для черепахи на экране, но не по кругу.

Ответы [ 2 ]

1 голос
/ 21 сентября 2009

Где вы кодируете:

   if -width/2 <= x <= width/2 and -height/2 <= y <= height/2:

Вы действительно имеете в виду «если точка (x, y) находится внутри разрешенной области». Таким образом, когда «разрешенной областью» является «круг с радиусом 50 с центром в начале координат», сравнивая квадраты расстояний и радиуса (это более ясно, чем брать квадратные корни ...! -), вы получите:

   if (x*x + y*y) <= 50*50:

оставляя весь остальной код без изменений.

Редактировать : поскольку ОП отметил, что это не работает для него, я изменил if / else на:

   x, y = turtle.position()
   # if -width/3 <= x <= width/3 and -height/3 <= y <= height/3:
   if (x*x + y*y) <= 50*50:
       pass
   else:  # turn around!
       print 'Bounce', step, x, y
       turtle.left(180)
       turtle.forward(step_size)

и запустил его как bounded_random_walk(200, 10, 30) из Terminal.App в Mac OS X, чтобы отобразился print. В результате я получаю от 50 до 60 отпечатков «Bounce», и черепаха явно ОГРАНИЧЕНА внутри желаемого круга, как говорят логика и геометрия.

Так что я надеюсь, что ОП отредактирует свой собственный ответ по этим направлениям (в идеале в системе и в такой схеме, где он может увидеть результаты print или каким-либо другим способом предоставления результатов и в идеале показать их нам), так что что я могу помочь ему отладить его код.

0 голосов
/ 05 декабря 2016

Разница во мнениях относительно того, работает ли предложенное исправление к этому коду или нет, заинтересовала меня. Я запустил код @ user176073 с изменениями @ AlexMartelli для 1000 шагов, и странные вещи произошли - чтобы проиллюстрировать это, я добавил ограничивающий круг красного цвета, чтобы черепаха оставалась (примерно) в пределах:

enter image description here

Вспышка произошла на нескольких прогонах и, по-видимому, связана с логикой коррекции, которая пытается вернуть черепаху обратно в круг после ее ухода. Он неправильно применен после того, как к черепахе применен новый угол - это не 180 от первоначального угла, который вывел черепаху из круга, поэтому он имеет тенденцию немного блуждать, пока не вернется внутрь.

Я попробовал новую реализацию с парой изменений: применить новое обновление угла после коррекции, а не до; используйте Python 3 undo , чтобы вернуть черепаху внутрь, а не пытаться сделать это самостоятельно. Это результат:

enter image description here

Обновленный код:

import turtle
import random

RADIUS = 50

def bounded_random_walk(num_steps, step_size, max_turn):

    for _ in range(num_steps):
        turtle.forward(step_size)

        x, y = turtle.position()

        if (x * x + y * y) > RADIUS * RADIUS:
            turtle.undo()  # undo misstep
            turtle.left(180)

        turn = random.randint(-max_turn, max_turn)
        turtle.left(turn)

bounded_random_walk(1000, 10, 30)

turtle.exitonclick()
...