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