Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив1 / docx56 / Записка(6).docx
Скачиваний:
18
Добавлен:
01.08.2013
Размер:
76.38 Кб
Скачать
    1. Реализация математических функций для анимирования переходов между состояниями объектов.

Приведём реализацию описанных математических функций используемых для построения промежуточных состояний объекта. В приведённой реализации использовалась модуль для математических вычислений из библиотеки Ogre, распространённой библиотеки для трёхмерной графики с открытым исходным кодом.

Для линейной функции реализация наиболее проста и выглядит как показано ниже.

def deltaLinearAnimation(self, progress):

return progress

Здесь видно, что значение параметра определяющего состояние объекта изменяется по линейной зависимости от части прошедшего времени в заданном интервале. В данной функции и далее progress – это часть заданного интервала времени, которая прошла с момента изменения состояния.

Реализация для квадратичной функции и функции от аргумента пятой степени были объединены в один метод, принимающий на вход требуемую степень аргумента. Таким образом становится возможным задавать абсолютно любые степенные функции.

def deltaPowerOfNAnimation(self, progress, power):

return Math.Pow(progress, power)

Вычисление функции определяющей дугу окружности выглядит следующим образом:

def deltaCircleAnimation(self, progress):

return 1 - Math.Sin(Math.ACos(progress))

Следующим является метод для вычисления анимации по закону синуса:

def deltaSineAnimation(self, progress):

return 1 - Math.Sin((1 - progress) * Math.PI / 2)

Реализация функции описывающей возрастающие колебательные движения:

def deltaElasticAnimation(self, progress, x):

return Math.Pow(2, 10 * (progress - 1))

* Math.Cos(20 * Math.PI * x / 3 * progress)

Заключительной является так называемая функция «back». Её реализация представлена ниже.

def deltaBackAnimation(self, progress, x):

return Math.Pow(progress, 2) * ((x + 1) * progress - x)

Из всех приведённых методов становится видно, что все они реализуются подобным образом, что означает лёгкость добавления новых математических функций, если в этом возникнет необходимость. Таким образом, набор математических законов, по которым происходит построение цепочки промежуточных состояний объекта, теоретически может быть расширен до любых необходимых размеров.

    1. Реализация обратных функций.

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

Такая реализация приведена ниже:

def animateValue(self, toValue, progress, animationType,

easeAnimationType):

delta = 1

if easeAnimationType == self.EASE_IN:

delta = self.deltaAnimation(progress, animationType)

elif easeAnimationType == self.EASE_OUT:

delta = 1 - self.deltaAnimation(1 - progress, animationType)

elif easeAnimationType == self.EASE_IN_OUT:

if progress < 0.5:

delta = self.deltaAnimation(2 * progress, animationType) / 2

else:

delta = (2 - self.deltaAnimation(2 * (1 - progress),

animationType)) / 2

return int(toValue * delta)

Приведённый метод вычисляет значение величины определяющей состояние объекта по заданному начальному и конечному значению состояния, части прошедшего промежутка времени, типу анимации и типу обратной функции. Здесь метод deltaAnimation – это метод применяющий ту или иную анимирующую функцию в зависимости от переданного типа. Его реализация выглядит следующим образом:

def deltaAnimation(self, progress, animationType):

delta = 1

if animationType == self.LINEAR:

delta = self.deltaLinearAnimation(progress)

elif animationType == self.CIRCLE:

delta = self.deltaCircleAnimation(progress)

elif animationType == self.ELASTIC:

delta = self.deltaElasticAnimation(progress, 1.5)

elif animationType == self.POWER_OF_TWO:

delta = self.deltaPowerOfNAnimation(progress, 2)

elif animationType == self.POWER_OF_FIVE:

delta = self.deltaPowerOfNAnimation(progress, 5)

elif animationType == self.SINE:

delta = self.deltaSineAnimation(progress)

elif animationType == self.BACK:

delta = self.deltaBackAnimation(progress, 2.5)

return delta

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

Соседние файлы в папке docx56