Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Rita от Июль 15, 2011, 23:08



Название: Qt и падающие шарики
Отправлено: 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% энергии. То есть кол-во шариков впринципе может быть неограниченным. Очень надеюсь на вашу помощь!


Название: Re: Qt и падающие шарики
Отправлено: kuzulis от Июль 16, 2011, 11:41
Препод - @#$%

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

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

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


Название: Re: Qt и падающие шарики
Отправлено: Rita от Июль 16, 2011, 12:25
Нет, графики не нужны! Надо сделать именно так. Самое забавное, что он нам рассказал только, как кнопки создавать и сказал, что все остальное мы спросим у гугла! Но в гугле такой бредятины явно нет. Одна единственная надежда на вас.


Название: Re: Qt и падающие шарики
Отправлено: Igors от Июль 16, 2011, 13:07
Нормальное, хорошее задание. Имеется ввиду просто:

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

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


Название: Re: Qt и падающие шарики
Отправлено: pastor от Июль 16, 2011, 16:48
Я бы взглянул в сторону QML + animation

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


Название: Re: Qt и падающие шарики
Отправлено: lit-uriy от Июль 16, 2011, 18:46
а я бы на "сталкивающиеся мышки" посмотрел: %QTDIR%\examples\graphicsview\collidingmice


Название: Re: Qt и падающие шарики
Отправлено: m_ax от Июль 16, 2011, 22:10
Если dE - это потеря энергии, то
скорость после подскока будет пропорциональна квадратному корню dE, а не просто dE, т.е.
правильнее так:
Код
C++ (Qt)
v=sqrt(dE)*v;
 
а не
Код
C++ (Qt)
v=dE*v;
 


Название: Re: Qt и падающие шарики
Отправлено: alex312 от Июль 16, 2011, 22:32
может как-то так (http://labs.qt.nokia.com/2010/02/26/qt-box2d-is-easy/)