![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Petr0vi4 |
![]()
Сообщение
#1
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 14.7.2009 Пользователь №: 907 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Пишу программу для симуляции движения частиц идеального газа в сосуде. У меня есть 4 стенки сосуда (QGraphicsRectItem) и 100 QGraphicsEllipsItem шариков размером 5*5 (типа молекулы).
Каждой молекуле на этапе создание присваивается вектор в виде координат 2х точек, а перемещение происходит по событию таймера вдоль этого вектора. Мне необходимо обработать столкновение между молекулами и стенами. Я все это реализовал, но дело в том, что все это жутко тормозит ![]() Код обнаружения столкновений:
Таймер срабатывает с интервалом в 10 мс. AllObjects - массив элементов класса Control. Control - класс наследник QObject, в нем есть QGraphicsEllipsItem* Item (сама молекула) + переменные типа qreal для вектора движения. Код в событии таймера:
Получается за 1 событие таймера я 2 раза выполняю цикл по всем объектам. Класс для молекулы выбран с рассчетом на то, что в нем уже прописана обработка столкновений. При количестве шариков 20-30 все работает идеально, при 50-100 уже тормозит ![]() Можно ли как то ускорить обработку? Может кто-нибудь предложит какое-то альтернативное решение.
Причина редактирования: используй тэг code
|
|
|
![]() |
Kagami |
![]()
Сообщение
#2
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Посмотри в документации по QGraphicsItem::UserType и QGraphicsItem::type(). При определении столкновения смотришь какого типа исследуемый объект. Если это молекула или стена, то ты уже знаешь что с ними делать. В противном случае можно вызывать метод родителя.
|
|
|
Petr0vi4 |
![]()
Сообщение
#3
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 14.7.2009 Пользователь №: 907 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Что-то плохо все работает, может все-таки решить проблему как-то по-другому? Вроде программа простая.
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 5.7.2025, 9:09 |