Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 21, 2012 16:02:07

Vadimoto
Зарегистрирован: 2012-11-11
Сообщения: 17
Репутация: +  -3  -
Профиль   Отправить e-mail  

Анимация

Функция вращения изображения по
окружности. Помогите пожалуйста

Офлайн

#2 Ноя. 21, 2012 22:47:56

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Анимация

Vadimoto.
Применяем параметрическое уравнение: x = x0 + r*cos(угол), y = y0 +r*sin(угол) для 0<= угол <= pi, т.е. каждая последующая точка определяется углом, на который мы проворачиваем рисунок. Угол Вы задаете сами.

Но есть один нюанс: изменение х связано с изменением у, но не линейно. Учитывая, что функция move требует размер приращения по отдельным координатам его нужно предварительно высчитать. Для рассчетов будем использовать то-же параметрическое уравнение, но корректрируем результат по последнему значению, т.е.
угол 0 – запомнили х(0) и у(0)
угол 10 – рассчитываем х(10) и у(10)
(чтобы узнать размер приращения необходимо от х(0) отнять х(10), а от у(10) отнять у(0))
угол 20 – расчитываем х(20) и у(20)
(чтобы узнать следующее приращение необходимо от х(10) отнять х(20), а от у(20) отнять у(10))
и т.п.
Код привожу ниже. Код рисует только дугу от 180 до 90 градусов. Остальную часть кода попробуй сделать самостоятельно…

from Tkinter import *
import math
import time
root = Tk()
tuk = PhotoImage(file = "001.gif")
cnv = Canvas(root, height = 400, width = 400)
cnv.pack()
S = cnv.create_image(150, 200, image = tuk, tag = "tuk")
root.focus_force()
def move_tuk(event = None):
    angle = 0
    lastx = 50
    lasty = 0
    for t in range(9):
        time.sleep(0.1)
        angle += 10                                 # С каждым шагом увеличиваем угол на 10
        newx = 50*math.cos(angle*math.pi/180.0)     # Не забываем переходить от градусов в радианы
        newy = 50*math.sin(angle*math.pi/180.0)     # Не забываем переходить от градусов в радианы
        deltax = lastx - newx                       # От предыдущего значения Х отнимаем новое - ищем приращение
        deltay = newy - lasty                       # От нового значения У отнимаем предыдущее - ищем приращение
        lastx = newx                                # Перезаписываем новую позицию виджета по Х, чтобы искать приращение от нее
        lasty = newy                                # Перезаписываем новую позицию виджета по У, чтобы искать приращение от нее
        cnv.move(S, deltax, -deltay)                # Непосредственно перемещаем...
        cnv.update_idletasks()
cnv.after(100, move_tuk)
root.mainloop()



Отредактировано 4kpt (Ноя. 21, 2012 22:49:15)

Офлайн

#3 Ноя. 22, 2012 01:16:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Анимация

4kpt
newx = 50*math.cos(angle*math.pi/180.0)     # Не забываем переходить от градусов в радианы
>>> import math
>>> math.radians(60)
1.0471975511965976
>>> math.degrees(_)
59.99999999999999
>>>



Офлайн

#4 Ноя. 22, 2012 09:17:03

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Анимация

py.user.next
Можно и так…
Я показывал явно, что я беру и куда подставляю.



Офлайн

#5 Ноя. 25, 2012 10:58:16

Vadimoto
Зарегистрирован: 2012-11-11
Сообщения: 17
Репутация: +  -3  -
Профиль   Отправить e-mail  

Анимация

что то я не понимаю..Что бы продолжить вращения что и где нужно изменить?

Офлайн

#6 Ноя. 26, 2012 09:23:33

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Анимация

Модератор: Тема перемещена в центр помощи



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version