Напрягаем мозги
Добавлено: 16 апр 2005, 02:02
Есть такая задачка:
В сосуде с идеальным газом, находящимся в равновесном состоянии, помещена большая частица.
Под действием соударений с молекулами она начинает броуновское движение.
Можно менять форму сосуда, форму размер и массу частицы.
/*Следующий абзац можно пропустить, если вопрос непонятен тогда советую прочитать*/
Я хочу сделать так:
Создать класс Частица, который будет содержать номер,координаты частицы(2-х или 3-х мерная модель), направление движения (это тоже координаты куда частица переместится,проще куда направлена скорость) и скорость.
Методы: графическое отображение частицы, моделирование столкновения с другой частицей(соответственно меняется скорость, направление движения) и перемещение(изменение начальной координаты ), еще создать класс Броуновская Частица(БЧ), наследующий от класса Частица, в нем поменяются только координаты, это будет массив содержащий координаты оболочки частицы. И еще мне нужен массив для координат сосуда(молекулы и БЧ с ним сталкиваются).
/*Вопрос*/
В итоге у меня есть координаты молекул, частицы и сосуда. Вопрос в том, что когда я буду моделировать перемещение молекулы или частицы я должен буду перебирать координаты всех молекул для того чтобы узнать столкнется она с кем нибудь или нет, а это грустно и долго...
/*Как можно решить*/
И подходящего алгоритма на ум не приходит, можно конечно разделить сосуд на части и соответственно все молекулы по группам,находящимся в той или иной части. Т е взять самые крайние координаты сосуда(например х1 и х2), также для у (у1 и у2), и наложить своеобразную сетку.
Тогда в класс надо будет добавить номер ячейки в котором находить молекула .Теперь при перемещении мне достаточно проверять на совпадение координат только те молекулы которые находятся с моей в одной ячейке, и еще проверять ячейки окружающие мою(тк молекула может перелететь из одной ячейки в другую),причем перемещение(т е один "шаг ") будет не больше чем размер ячейки . Вот так можно решить, вроде понятно обьяснил.
Может кто-нибудь предложит другой алгоритм, лучше чем мой? Буду благодарен.
В сосуде с идеальным газом, находящимся в равновесном состоянии, помещена большая частица.
Под действием соударений с молекулами она начинает броуновское движение.
Можно менять форму сосуда, форму размер и массу частицы.
/*Следующий абзац можно пропустить, если вопрос непонятен тогда советую прочитать*/
Я хочу сделать так:
Создать класс Частица, который будет содержать номер,координаты частицы(2-х или 3-х мерная модель), направление движения (это тоже координаты куда частица переместится,проще куда направлена скорость) и скорость.
Методы: графическое отображение частицы, моделирование столкновения с другой частицей(соответственно меняется скорость, направление движения) и перемещение(изменение начальной координаты ), еще создать класс Броуновская Частица(БЧ), наследующий от класса Частица, в нем поменяются только координаты, это будет массив содержащий координаты оболочки частицы. И еще мне нужен массив для координат сосуда(молекулы и БЧ с ним сталкиваются).
/*Вопрос*/
В итоге у меня есть координаты молекул, частицы и сосуда. Вопрос в том, что когда я буду моделировать перемещение молекулы или частицы я должен буду перебирать координаты всех молекул для того чтобы узнать столкнется она с кем нибудь или нет, а это грустно и долго...
/*Как можно решить*/
И подходящего алгоритма на ум не приходит, можно конечно разделить сосуд на части и соответственно все молекулы по группам,находящимся в той или иной части. Т е взять самые крайние координаты сосуда(например х1 и х2), также для у (у1 и у2), и наложить своеобразную сетку.
Тогда в класс надо будет добавить номер ячейки в котором находить молекула .Теперь при перемещении мне достаточно проверять на совпадение координат только те молекулы которые находятся с моей в одной ячейке, и еще проверять ячейки окружающие мою(тк молекула может перелететь из одной ячейки в другую),причем перемещение(т е один "шаг ") будет не больше чем размер ячейки . Вот так можно решить, вроде понятно обьяснил.
Может кто-нибудь предложит другой алгоритм, лучше чем мой? Буду благодарен.