2008-09-24 2 views
-1

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

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

+0

Это дубликат http://stackoverflow.com/questions/126761/how-can-i-move-an-object-drawn-in-device-context-python? Не могли бы вы закрыть один или другой? – 2008-09-24 13:11:24

+0

Вам нужно сказать, какую графическую библиотеку вы используете. – wnoise 2008-10-10 07:06:02

ответ

1

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

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

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

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

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

Я предлагаю вам также взглянуть на PyGame. Возможно, вы можете использовать это, и у него также есть некоторые уроки.

0

Чтобы плавно переместить объект между начальной координатой (x1, y1) и назначением координатами (x2,y2), вы должны сначала спросить себя, как долго объект должен предпринять, чтобы добраться до места назначения. Допустим, вы хотите, чтобы объект попал туда в 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) 

Это просто Euler's method, и должно быть достаточно для анимации.

Смежные вопросы