Модераторы: SoWa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Молекулярная динамика, помогите кто может 
:(
    Опции темы
Venus
Дата 18.12.2010, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.12.2010

Репутация: нет
Всего: нет



Помогите кто может. Нужно написать на ActionScript во Flash  программу такого типа: дано сколько то шариков, все они связаны между собой усилиями(типа невидимых пружинок, натяжений) так, что когда тянешь один-за ним смещаются другие.  

PM MAIL   Вверх
Catapulta
Дата 27.12.2010, 07:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 20.12.2010

Репутация: нет
Всего: нет



Какая задача интересная.
Значит рассуждать надо так.

Часть 1. Расчет нового положения подчиненного шарика b 
Считаем расстояние d между старым положением a и старым положением b. Находим линию между новым положением a и старым положением b. Откладываем по этой линии расстояние d от точки нового положения a. Считаем найденную точку новым положением b.

Часть 2. Наложение шариков друг на друга
Шарики могут друг друга перекрывать, поэтому надо рассматривать их обходом графа в ширину, чтобы в будущем какие-либо действия предпринимать по этому поводу. 

Часть 3. Организация программы
Каждый шарик имеет 1) список подчиненных шариков, 2) значение нового и предыдущего положения, 3) маркер (для обхода графа в ширину), 4) метод move.
Метод move  (принимает своим параметром юзерские новые координаты самого первого шарика) будет примерно такой.
Двигаем шарик на новое место и сохраняем старое положение шарика. Помечаем его как рассмотренный. Помещаем его в список S.
Делать пока список S не пуст:
1. Для шариков всех из списка S все их подчиненные не помеченные как рассмотренные шарики помещаем в список T
2. Для всех шариков из T: расчитываем их новые положения в соответствии с частью 1, модифицируем эти положения и внешний вид шариков (например, вытянуть чуть-чуть) в соответствии с частью 2, 
3. Двигаем шарики из Т, сохраняем их старые положения, помечаем как рассмотренные.
4. Переменной S присваиваем содержимое переменной T, переменную Т делаем пустым списком.

Надеюсь нигде не ошиблась.
Я уже устала, а Вам надо додумать: как откладывать расстояние d по известному уравнению линии и что делать во второй части. НУ и там по мелочи может чего еще.
Удачи.

PM MAIL   Вверх
Catapulta
Дата 28.12.2010, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 20.12.2010

Репутация: нет
Всего: нет



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

Потом надо решить проблему с наложением шариков. Юзерский шарик двигать нельзя. Для остальных составляем выражение summa( ((xi-x'i)^2+(yi-y'i)^2))^1/2 ) -> min (*), где суммирование проводится по i, xi и yi известны из предыдущего абзаца, x'i и y'i надо найти. Юзерский шарик кстати добавит нули в выражение. На всякий случай поясняю, что в скобках находится расстояние между исходным (правильным) и новым положением шарика, в котором он не будет мешаться другим шарикам.
Кроме того есть область, в которой наш минимум действителен:   ((x'i-x'j)^2+(y'i-y'j)^2)^1/2  >= 2R , i!=j, R - радиус шарика (**) - расстояние между двумя шариками должно быть достаточным.
Ну и ищем методы нахождения минимума функции многих переменных (многомерный спуск, многомерная минимизация). На память в голову приходит следующее:
1) Надо брать частные производные для выражения (*), получать систему уравнений и ее решать. Честно сказать, никогда не понимала, почему ожидается, что в точке где производная равна нулю, будет именно минимум функции ( а не максимум) и что этот минимум вообще обязательно будет.
2) К функции (*) надо добавлять мильен (большое число, штраф) для x'i и y'i, которые не удовлетворяют требованиям (**), чтобы алгоритм минимизации не нашел, что лучше всего положить x'i==xi, y'i==yi. Хотя если шарики и не думали перекрывать друг друга, то так оно и будет. Эта технология в своем имени содержит слово штраф: наложение штрафных функций или там еще как-то.

Вот. Больше в память ничего не приходит. Хотя методов на самом деле уйма.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | ActionScript 3 | Следующая тема »


 




[ Время генерации скрипта: 0.1044 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.