TurtleGraphics Python: отскакивая черепаха от стен? - PullRequest
1 голос
/ 22 сентября 2009

Итак, я пытаюсь сделать реалистичную подпрыгивающую функцию, при которой черепаха ударяется о стену и отскакивает под соответствующим углом. Мой код выглядит так:

def bounce(num_steps, step_size, initial_heading):
   turtle.reset()
   top = turtle.window_height()/2
   bottom = -top
   right = turtle.window_width()/2
   left = -right

   turtle.left(initial_heading)
   for step in range(num_steps):
      turtle.forward(step_size)
      x, y = turtle.position()
      if left <= x <= right and bottom <= y <= top:
         pass
      else:
         turtle.left(180-2 * (turtle.heading()))

Итак, это работает для боковых стенок, но я не понимаю, как заставить его правильно отскакивать от верха / низа. Есть предложения?

Ответы [ 2 ]

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

Попробуйте что-то вроде этого:

if not (left <= x <= right):
    turtle.left(180 - 2 * turtle.heading())
elif not (bottom <= y <= top):
    turtle.left(-2 * turtle.heading())
else:
    pass

Мой синтаксис Python немного ржавый, извините: P. Но математика немного отличается для горизонтального и вертикального переворота.

EDIT

Я подозреваю, что ваша черепаха попадает в ситуацию, когда она направлена ​​вверх и застряла над верхней стенкой. Это привело бы к тому, что он просто перевернулся бы на неопределенный срок. Вы можете попробовать добавить следующие условия:

if (x <= left and 90 <= turtle.heading() <= 270) or (right <= x and not 90 <= turtle.heading() <= 270):
    turtle.left(180 - 2 * turtle.heading())
elif (y <= bottom and turtle.heading() >= 180) or (top <= y and turtle.heading <= 180):
    turtle.left(-2 * turtle.heading())
else:
    pass

Если это работает, возможно, есть ошибка в другом месте вашего кода. Обработка кромки сложно сделать правильно. Я предполагаю, что turtle.heading () всегда будет возвращать что-то между 0 и 360 - если нет, то будет еще сложнее получить права.

0 голосов
/ 22 сентября 2009

Gday,

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

def inbounds(limit, value):
    'returns boolean answer to question "is turtle position within my axis limits"'
    return -limit < value * 2 < limit

def bounce(num_steps, step_size, initial_heading):
    '''given the number of steps, the size of the steps 
        and an initial heading in degrees, plot the resultant course
        on a turtle window, taking into account elastic collisions 
        with window borders.
    '''

    turtle.reset()
    height = turtle.window_height()
    width = turtle.window_width()
    turtle.left(initial_heading)

    for step in xrange(num_steps):
        turtle.forward(step_size)
        x, y = turtle.position()

        if not inbounds(height, y):
            turtle.setheading(-turtle.heading())

        if not inbounds(width, x):
            turtle.setheading(180 - turtle.heading())

Я использовал функцию setheading и вспомогательную функцию (inbounds) для дальнейшего объявления цели кода здесь. Предоставление какой-либо doc-строки также является хорошей практикой в ​​любом коде, который вы пишете (при условии, что сообщение, в котором оно указано, является точным!)

Ваш пробег может отличаться при использовании xrange, Python 3.0+ переименовывает его в range.

...