Как я могу переместить объект, нарисованный в контексте устройства Python - PullRequest
0 голосов
/ 24 сентября 2008

Я нарисовал изображение в контексте устройства, используя python, и я хочу плавно / анимировать его по вертикали или горизонтали.

Какой алгоритм мне использовать? Где я могу получить информацию для такого рода задач в Python?

Ответы [ 2 ]

1 голос
/ 24 сентября 2008

Когда объект рисуется в контексте устройства, он остается там. Если вы хотите переместить его, вам нужно перерисовать его.

Вы можете сохранить фиксированный фон и перерисовывать только подвижные элементы при каждом их перемещении. Вот как это делается.

Чтобы плавно переместить объект по линии, вы должны сделать что-то вроде этого (у меня нет готовой программы, поэтому я могу только дать вам представление):

  • выберите начальную и конечную позиции: точка A (x1, y1) и B (x2, y2)
  • выберите, через какое время объект должен изменить положение с А на В (скажем, 10 секунд).
  • использовать таймер, установленный на определенный интервал (скажем, 2 секунды)
  • вычисляет дельту X и Y, которую объект должен изменять для каждого интервала таймера. В этом случае dx = (x2-x1) * 2/10 и dy = (y2-y1) * 2/10
  • в обратном вызове таймера увеличивает текущее положение объекта с помощью dx и dy и перерисовывает изображение

Это был бы алгоритм.

Предлагаю вам также взглянуть на PyGame . Может быть, вы можете использовать это, и у него также есть несколько учебных пособий.

0 голосов
/ 24 сентября 2008

Чтобы плавно переместить объект между начальной координатой (x1, y1) и координатой назначения (x2,y2), вам нужно сначала спросить себя, как long должен пройти объект, чтобы добраться до пункта назначения. Допустим, вы хотите, чтобы объект находился там в t единицах времени (которые могут быть секундами, часами и т. Д.). Как только вы определили это, тогда тривиально отрабатывать смещение за единицу времени:

dx = (x2-x1)/t
dy = (y2-y1)/t

Теперь вам просто нужно добавить (dx,dy) к позиции объекта ((x,y), первоначально (x1,y1)) каждый единичный момент времени и остановиться, когда объект окажется в пределах некоторого порогового расстояния от пункта назначения. Это связано с тем, что ошибки в делениях будут накапливаться, поэтому, если вы сделали проверку на равенство, например:

(x,y)==(x2,y2)

Вряд ли это когда-либо будет правдой.

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

v(t) = u(t) + t*a(t)
x(t) = v(t) + t*v(t)

Это всего лишь метод Эйлера , и его должно быть достаточно для анимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...