АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Пружинный маятник

Читайте также:
  1. I. Маятники
  2. Абсолютно непружне зіткнення кулі та маятника. Енергія дисипації
  3. Вивчення вільних затухаючих коливань математичного маятника
  4. Визначення моменту інерції маятника Обербека
  5. Визначення прискорення вільного падіння за допомогою математичного маятника
  6. Визначимо коефіцієнт відновлення відносної швидкості та енергію дисипації для частково пружного зіткнення кулі та маятника
  7. Гармонические колебания и их характеристики. Пружинный, физический и математический маятники.
  8. Главная пружина и маятник
  9. Колодец и маятник
  10. Математический маятник.
  11. Маятник и перспектива
  12. Маятниковый метод

 

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

 

Пружинный маятник — это простая физическая система, представляющая собой груз на прикрепленной к опоре пружине, Если немного оттянуть груз (выведя тем самым систему из равновесия), а затем отпустить, то маятник начнет совершать колебания. В идеальном случае полного отсутствия трения колебательное движение будет гармоническим, т. е. будет происходить неограниченно продолжительное время с постоянной амплитудой, В реальных системах трение всегда присутствует, поэтому колебания пружинного маятника происходят с затуханием.

 

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

Y = Ay ⋅cos((k / m)12 t +ϕ0)⋅ e −α t.

Сложная формула? Совсем нет! Вы без труда в ней разберетесь, прочитав описание входящих в нее величин:

Y – величина абсолютного удлинения пружины в момент времени t. Периодически изменяется в интервале от 0 до Ау.

Ау — амплитуда колебаний, т. е. максимальное удлинение пружины, Если скорость груза при начале движения равна 0, то амплитуда соответствует удлинению пружины в этот момент.

m — масса груза. Чем она больше, тем более плавными будут колебания (т. е. частота колебательного движения будет ниже),

к — жесткость пружины. Чем она больше, тем более резкими будут колебания (т. е. их частота будет выше).

t — время от начала колебательного движения.

• ϕ0 — смещение фазы. Возникает, если в начальный момент времени скорость груза не равна нулю. В нашей модели эта величина не понадобится.

• а — коэффициент, учитывающий вклад трения. Чем он больше, тем быстрее затухают колебания.

 

Вы можете сказать: «Мы хотим научиться программировать на ActionScript, а нам читают лекции по физике! Нельзя ли без формул?» Увы — нет. Математика — единственный язык, на котором можно описывать явления вокруг нас. Любая игра, эффект или даже анимация — это прежде всего математическая модель. Уверенное владение основами математики хотя бы за курс средней школы просто необходимо тому, кто хочет проявить себя на поприще Flash-программирования. В этой книге мы будем создавать много моделей, в которых будет активно использоваться королева наук

— и вы увидите, какой это мощный инструмент (в умелых руках, разумеется).

 

Не будем утомлять вас длинными теоретическими выкладками и приступим-таки к реализации задуманного проекта.

 

С чего бы начать? Разумно будет вначале создать пружинный маятник в «железе» и лишь затем приступать к написанию кода (иначе мы просто не сможем его тестировать).

 

В том, чтобы нарисовать груз или опору, нет никакой сложности. А вот как изобразить пружину? Рисовать несколько часов одно кольцо за другим? Слишком сложно. Тем более, что звенья пружины вряд ли при всем старании получатся одинаковыми, отчего она будет казаться грубой, а сам маятник — не особо похожим на оригинал. Мы поступим по-другому. Нарисовав фрагмент, соответствующий одному шагу спирали, мы создадим нужное число его копий (10-20). Совмещая затем участки пружины, получим необходимое изображение с минимальными усилиями. Несколько советов:

 

• Чтобы нарисовать элемент пружины, создайте эллипс, а затем, разрезав его кольцо при помощи ластика, просто сместите один конец кривой вверх, а другой — вниз (рис. 3.1, а).

 

• Работайте в увеличенном масштабе (300-500 %) при этом проще совмещать концы фрагмен-

тов пружины.

 

• Соединив 4—5 фрагментов, в дальнейшем используйте полученный элемент для сборки пру-

жины — это значительно ускорит выполнение поставленной задачи.

 

• Чтобы создать копию фрагмента, выделите его и выполните протаскивание мышью при нажатой клавише <Ctrl>.

 

• Когда нужное число витков будет соединено, немного удлините свободные концы пружины — за один из них она будет прикреплена к основе, к другому будет присоединен груз. Затем трансформируйте пружину (инструмент Free Transform) так, чтобы она выглядела сжатой (рис.

3.1, b). Переведите изображение пружины в клип (<F8>).

 

 

Рис. 3.1. Заготовка для пружины (а) и пружина (b)

 

Жестко закрепленная пружина удлиняется относительно точки крепления. По умолчанию же центр клипа, относительно которого система просчитывает все трансформации, располагается ровно посередине его графической доставляющей. Это означает, что если мы попытаемся растянуть программно пружину, то она удлинится на одинаковую величину в обе стороны. Нам же необходимо, чтобы деформация осуществлялась только в одном направлении. Чтобы этого добиться, зайдите в режим редактирования клипа (выполнив двойной щелчок по нему) и переместите изображение пружины так, чтобы ее верхний конец в точности совпал с точкой отсчета системы координат (ей соответствует черный крестик на рабочем поле). Выполнив описанную операцию, немного поэкспериментируйте, растягивая пружину. Если в состоянии деформации она будет похожа на свой реальный прототип, то продолжайте работу. В противном случае попробуйте внести в свое творение изменения или просто воспользуйтесь готовым объектом из архива примеров.

Теперь необходимо нарисовать груз. Как он будет выглядеть — это решать только вашей фантазии. Наиболее очевидный вариант — небольшой металлический цилиндр (рис. 3.2). Нарисовав грузик, переведите его в клип.

 

Третьим необходимым элементом пружинного маятника является подвес. Чтобы не тратить много времени, изобразите его просто как узкий и длинный прямоугольник. Сохранить его необходимо как символ типа graph.

 

Собираем маятник из созданных компонентов. У вас должно по Рис. 3.2. Пружинный маятник лучиться приблизительно то же, что и на рис. 3.2.

 

 

Итак, работа руками завершена. Пришло время для работы головой — приступаем к созданию кода.

 

Для начала даем клипам с изображением пружины и груза идентификаторы. Первый называем pruzina, второй — gruz.

 

Создаем новый слой и, назвав его «Код», размешаем выше существующего. Выделяем его первый кадр и нажимаем <F9>. При этом открывается наш основной холст — панель Actions, заставляя задуматься: с чего бы лучше начать?

 

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

 

var k:Number = 1000; // Жесткость пружины var n:Number = 200; // Масса груза var alpha:Number = 0.1; // Коэффициент трения

var A:Number = null; // Амплитуда (она будет задана при смещении груза)

 

Присвоенные значения взяты навскидку: при тестировании модели мы их заменим более подходящими. Пока трудно предполагать, чему должна равняться каждая переменная — хотя бы потому, что смещение мы будем измерять не в метрах, а в пикселях.

Выводить колебательную систему из равновесия пользователь будет самостоятельно, оттягивая указателем мыши грузик на нужное расстояние вниз. Чтобы обеспечить соответствующие трансформации, нам необходимо как-то регистрировать событие нажатия кнопки мыши в тот момент, когда курсор располагается над клипом gruz. Сделать это можно несколькими способами, самый простой из которых связан с использованием «кнопочного» события onPress (во Flash MX клипы стали листенерами таких событий):

 

gruz.onPress=function():Void { trace (this);

}

 

Войдите в режим тестирования. Если после «щелчка» по грузу откроется панель Output со строкой «_level0.gruz», то, удалив функцию trace(), продолжайте выполнение проекта. Иначе — ищите ошибку.

 

О том, что пользователь начал протаскивание грузика, должны узнать остальные Функцииобработчики сценария. Для этого при наступлении события onPress клипа gruz будем устанавливать булев флаг в специальной переменной:

 

gruz_press=true; // Эта переменная должна быть создана там же, где и

// остальные, со значением false

 

После того как произойдет щелчок курсором по грузу, он должен начать перемешаться вслед за курсором мыши. Причем смещение должно происходить только По вертикали и в определенных пределах (пружина не может растягиваться и сжиматься до бесконечности). Справиться с этой задачей очень просто, воспользовавшись мощным методом класса MovieClip startDrag (center, xmin, ymin, xmax, ymax), где:

 

• center — параметр, определяющий, перемешается ли клип относительно той точки, в которой находился указатель мыши в момент активации метода (false), или же точка его центра и указатель жестко связываются (true). Очевидно, что нам скорее подходит первый режим;

 

• xmin, ymin, xmax, ymax — точки, задающие границу области перемещения клипа.

 

Определяем граничные точки следующим образом:

• xmin. Смещения по горизонтали происходить не должно, поэтому задаем левую границу области, равную текущей координате X клипа: this._x.

• ymin. Груз не должен подниматься выше того положения, когда маятник находится в равновесии. Конечно, это отклонение от физической модели пружинного маятника, в которой насколько пружина растягивается, настолько она потом и сжимается. Однако будем считать, что пружина у нас достаточно жесткая и полностью сжата. А это означает, что при колебаниях ее длина никогда не будет заметно меньшей, чем в состоянии покоя.

 

Положение груза при равновесии фиксируем в специальной переменной (она должна быть задана вместе с остальными):

 

var gruz_pos:Number=gruZ._y;

 

• xmax. Задаем аналогично xmin.

• ymax. Даже самая пластичная пружина не может растянуться более, чем в 3—4 раза от ее начальной длины. Поэтому нижний предел смещения груза стоит ограничить 3 значениями ширины клипа pruzina, отсчитанными от его положения в состоянии равновесия. Так как ширина пружины будет непрерывно меняться, то необходимо зафиксировать ее начальную величину, создав для этого отдельную переменную:

 

var pruz_height:Nυ=pruzina._height;

 

Строку с методом startDrag() заносим в тело единственной пока функции-обработчика:

 

gruz.startDrag(false,this._x, gruz_pos, this,_x, 3*pruz_height+gruz_pos);

 

При отпускании кнопки мыши протаскивание груза должно быть закончено. «Отловить» соответствующее событие можно несколькими способами. Во-первых, можно воспользоваться встроенным «кнопочным» событием onRelease. Однако при этом не будет фиксироваться отпускание кнопки мыши в том случае, если указатель находится не над клипом. Чтобы предусмотреть такую ситуацию, придется использовать специальный обработчик onReleaseOutside. Два обработчика для одного события — это слишком много. Мы поступим по-другому: «отлавливая» событие отпускания кнопки мыши при помощи обработчика onMouseUp, будем проверять, чему равняется переменная graz_press. Если она равна true, значит, груз протаскивался. При этом необходимо остановить работу метода startDragO (для чего используем метод stopDragO), а также указать в переменной gruz_press, что перемещения клипа gruz больше не происходит. В виде ActionScript описанные действия материализуются как:

 

_root.onMouseUp = function():Void { if(gruz_press) { gru2_press = false; gruz.StopDrag();

}

};

 

Тестируем фильм и проверяем, все ли работает так, как задумано. Если да, то продолжаем выполнение проекта.

 

Раз груз жестко закреплен на пружине, то при его смещении она должна растягиваться. Этот процесс должен быть непрерывным, поэтому реализующий деформацию код следует вызывать достаточно часто. Для этого можно или создать функцию-обработчик события onEnterFrame, или воспользоваться таймером setInterval(). Мы, ввиду простоты, применим первый вариант:

 

_root,onEnterFrame = function():Void {

};

 

При вызове созданного обработчика будем проверять, чему равна переменная gruz_press. Если ей соответствует true, значит, груз протаскивается. При этом пружина должна быть удлинена настолько, насколькоон сместился относительно своего начального положения:

 

pruzina._height = pruz_height+gruz._y-gruz_pos;

 

Тестируем фильм и пробуем перемешать грузик. Вроде бы все неплохо... Хотя по какой-то неизвестной причине при деформации пружины изменяется не только ее длина, но и ширина. Так как свойство _width у нас в коде нигде не фигурирует, ошибку в сценарии можно сразу исключить. Дело тут в другом.

 

Возникшие трудности связаны с тем, что мы сместили точку отсчета системы координат клипа. А обойти их предельно просто: для этого каждый раз, меняя длину пружины, будем устанавливать изначальное значение ее ширины. С этой целью создадим специальную переменную:

 

var pruz_width:Number = pruzina._width;

 

Ниже выражения, определяющего длину пружины, в теле обработчика onEnterFrame наберите следующую строку:

 

pruzina._width = pruz_width;

 

Тестируем фильм. Вот теперь действительно все работает так, как надо!

 

В том случае, если переменная pruz_press равна false (груз был отпущен), по событию onEnterFrame будем запускать механизм, реализующий колебания маятника. Для его создания переведем на язык ActionScript рассмотренную в начале описания проекта формулу:

 

else { // Math.abs — метод, вычисляющий абсолютную величину числа pruzina._height = pruz_height + Math.abs(A*Math.cos (Math.sqrt (k/m)*time)

*Math.exp (-alpha*time)); pruzina._width = pruz_width;

gruz._y = gruz_pos+Math.abs (A*Math.cos (Math.sqrt(k/m)*time)

*Math.exp(-alpha*time));

}

 

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

 

В заданных формулах используются величины, которые мы еще не описали:

 

• Амплитуда А. Должна быть вычислена в момент отпускания груза как разность между его по-

ложением и координатой точки равновесия:

 

А = gruz._y-gruz_pos; // Строку добавляем в тело обработчика события onMouseUp

 

• Время time. Должно быть определено равным 0, там же, где и амплитуда. Явно переменную time надо задать вместе с остальными, присвоив значение null. Менять значение времени мы будем сразу же после вычисления текущего значения смешения:

 

time+=l/12; // Заносим выражение в блок предложения else обработчика // onEnterFrame

 

Более точно время колебаний можно измерять, воспользовавшись возможностями класса Date или глобальной функцией getTimer(). Однако не будем забегать вперед.

 

Чтобы вычисленияколебаний маятника не происходили до того, как он будет выведен из равновесия, соответствующие выражения будем выполнять лишь в том случае, если time отлична от null:

 

if(time!=null) {

}

 

Модель готова. Остался последний штрих. Мы должны предоставить пользователю удобный интерфейс, при помощи которого можно будет менять значения параметров. Для этого создадим три поля ввода и, подписав их «Масса», «Жесткость», «Трение», свяжем (поле Var) с переменными m, k, alpha. Теперь любое изменение текста в полях будет сопровождаться переопределением переменных, что позволит быстро проверить работу модели при самом различном сочетании значений параметров.

 


1 | 2 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.013 сек.)