![]() |
Модераторы: SoWa |
![]() ![]() ![]() |
|
Venus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 18.12.2010 Репутация: нет Всего: нет |
Помогите кто может. Нужно написать на ActionScript во Flash программу такого типа: дано сколько то шариков, все они связаны между собой усилиями(типа невидимых пружинок, натяжений) так, что когда тянешь один-за ним смещаются другие.
|
|||
|
||||
Catapulta |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 по известному уравнению линии и что делать во второй части. НУ и там по мелочи может чего еще. Удачи. |
|||
|
||||
Catapulta |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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. Хотя если шарики и не думали перекрывать друг друга, то так оно и будет. Эта технология в своем имени содержит слово штраф: наложение штрафных функций или там еще как-то. Вот. Больше в память ничего не приходит. Хотя методов на самом деле уйма. |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | ActionScript 3 | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |