Russian Qt Forum
Ноябрь 23, 2024, 12:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt и падающие шарики  (Прочитано 6007 раз)
Rita
Гость
« : Июль 15, 2011, 23:08 »

Помогите пожалуйста сделать GUI для программы! Под конец практики мне задали неподъемную задачу: написать программу, моделирующую падение шарика(это я сделала)! Но когда препод сказал визуализировать это с помощюь Qt,совершеннно мне не знакомого, - руки опустились! Помогите пожалуйста, сроки поджимают, а Qt оказалось не так просто одолеть! Вот что я написала:
Код
C++ (Qt)
#include <stdio.h>
#include <math.h>
 
float dh(float speed);
 
const float g = 9.81;  //ускорение свободного падения
const float dt = 0.1;  //период времени
 
int main()
{
float h; //начальная высота
do
{
printf("Тело падает с высоты (h > 0):\n> ");
scanf("%g", &h);
printf("h = %g м\n\n", h);
}
while (h <= 0);
 
float v = 0.0; //начальная скорость
 
const float prz = 0.1; //регистрация приземления
const float dE = 0.7; // потеря энергии при отскоке
 
int sw = 1; // переключатель движения
float h1 = h; // текущая высота
float t = 0; // начальное время
       float t1 = 0;   // длительность завершившихся полетов
       printf("Падение: %1.3f %1.3f %1.3f\n", t, h1, v);
for (t = dt; (v > prz) || (h > prz); t+= dt)
{
v = v + sw * g*dt;     //новая скорость
h1 = h1 - sw* dh(v); // предыдущая высота +/- изменение
 
if (h1 <= 0)
{
                    h1 = 0; // долетаем до земли
sw = -1; // отскок
t = t1 + sqrt(2* h/g); // время предыдущих полетов + последнего
t1 = t; // время всех полетов
                       v=dE*v;
}
 
if (v <= 0)
{
v = 0; // зависли в воздухе
sw = 1; // падение
h = dE * h; // новая высота с учетом потери энергии
h1 = h;
t = t1 + sqrt(2* h/g); // время предыдущих полетов + последнего
}
 
if (sw == 1)
{
printf("Падение: %1.3f %1.3f %1.3f\n", t, h1, v);
}
if (sw == -1)
{
printf("Отскок:  %1.3f %1.3f %1.3f\n", t, h1, -v);
}
 
}
 
return 0;
}
 
float dh(float V) // изменение высоты
{
return V*dt + g* dt*dt/2;
}

А тепреь требуется для этого написать GUI, которое должно содержать кнопку Add и прямоугольное поле для шариков. При нажатии на кнопку на максимальной высоте рандомно появляется шарик и начинает падать, отскакивая от пола. При ударе теряется 30% энергии. То есть кол-во шариков впринципе может быть неограниченным. Очень надеюсь на вашу помощь!
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Июль 16, 2011, 11:41 »

Препод - @#$%

Обычно же при моделировании строится график. А по графику и так всё ясно с поведением шариков-шмариков Улыбающийся.

Может достаточно графиков с использованием Qt4?

PS: Странно всё это.
Записан

ArchLinux x86_64 / Win10 64 bit
Rita
Гость
« Ответ #2 : Июль 16, 2011, 12:25 »

Нет, графики не нужны! Надо сделать именно так. Самое забавное, что он нам рассказал только, как кнопки создавать и сказал, что все остальное мы спросим у гугла! Но в гугле такой бредятины явно нет. Одна единственная надежда на вас.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июль 16, 2011, 13:07 »

Нормальное, хорошее задание. Имеется ввиду просто:

- создать окно
- по нажатию кнопки нарисовать кружок (шарик)
- перерисовывать этот кружок с шагом по времени (позицию Вы уже посчитали)

Самое забавное, что он нам рассказал только, как кнопки создавать и сказал, что все остальное мы спросим у гугла! Но в гугле такой бредятины явно нет. Одна единственная надежда на вас.
Хмм.. правильно сказал Улыбающийся Просить помощи в таком вопросе ну, скажем, "не очень хорошо". Если Вы не хотите этим заниматься, скажите напр "нужен человек который бы это сделал, о цене договоримся, пишите в личку" - это нормально. А то "забавно, бредятина" и особенно "единственная надежда" выглядят неуклюжими попытками проскочить "на шару"  Улыбающийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Июль 16, 2011, 16:48 »

Я бы взглянул в сторону QML + animation

Можно взглянуть на экзампл QTDIR/examples/declarative/toys/tvtennis
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Июль 16, 2011, 18:46 »

а я бы на "сталкивающиеся мышки" посмотрел: %QTDIR%\examples\graphicsview\collidingmice
Записан

Юра.
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #6 : Июль 16, 2011, 22:10 »

Если dE - это потеря энергии, то
скорость после подскока будет пропорциональна квадратному корню dE, а не просто dE, т.е.
правильнее так:
Код
C++ (Qt)
v=sqrt(dE)*v;
 
а не
Код
C++ (Qt)
v=dE*v;
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #7 : Июль 16, 2011, 22:32 »

может как-то так
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.254 секунд. Запросов: 22.