Вы в основном ответили на свой вопрос. Нарезка за пределами последовательности (по крайней мере для встроенных) не вызывает ошибки. Это имеет смысл, когда вы об этом думаете. Индексирование возвращает один элемент, но нарезка возвращает подпоследовательность элементов. Поэтому, когда вы пытаетесь индексировать несуществующее значение, ничего не вернуть; но когда вы вырезаете последовательность за пределами границ, вы все равно можете вернуть пустую последовательность.
Также обратите внимание, что есть различие между x[3]
и x[3:4]
. Например:
>>> [0, 1, 2, 3, 4, 5][3]
3
>>> [0, 1, 2, 3, 4, 5][3:4]
[3]
Причина, по которой они выглядят одинаково в случае строк, заключается в том, что не существует такой вещи, как отдельный символ за пределами строки; один символ - это всего лишь 1-символьная строка.
Пусть x1
, y1
, vx1
, vy1
будут x-позицией, y-позицией, x-скоростью и y-скоростью circle1
. Аналогично, у нас есть x2
, y2
, vx2
, vy2
для circle2
.
Поскольку один из кругов, скажем, circle1
, не реагирует на столкновение, полезно взглянуть на столкновение с точки зрения этого большого парня (также называемого системой отсчета). В этой системе отсчета circle2
имеет скорость x vx2 - vx1
и скорость y vy2 - vy1
. Положение x и y в circle2
аналогично x2 - x1
и y2 - y1
.
В этой системе отсчета circle1
также не движется и может рассматриваться как статическая стена.
Затем вы можете рассматривать эту проблему аналогично проблеме движущегося circle2
, сталкивающегося со стеной с вектором нормали (x2-x1 , y2-y1)
и скоростью (vx2-vx1 , vy2-vy1)
.
Я предполагаю, что вы знаете, как решить эту проблему, поскольку вы сказали, что понимаете столкновения между кругом и формой.
Как только вы получите конечную скорость circle2
, просто не забудьте вернуться к исходной перспективе, добавив vx1
к скорости x и vy1
к скорости y.