Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Ubuntu_linux от Декабрь 14, 2010, 00:17



Название: QGraphicsScene и движения планет.
Отправлено: Ubuntu_linux от Декабрь 14, 2010, 00:17
Рисую на QGraphicsScene траекторию движения  планеты вокруг солнца, НО получается не  то что надо. А именно траектория  выводится на экран вся полностью после завершения цикла. (НЕТ динамики). Как решить  проблему?  ???

Код
C++ (Qt)
void Widget::getResult(){
   QLine line0,line1;
int k=0;
line0.setP1(QPoint(x[0],y[0]));
line1.setP1(QPoint(x[1],y[1]));
 
   for(int i=0;i<10000;i++){
 
...................
///////////////////////////////////// тут я вычисляю новые координаты и скорость ///////////////////////////////////////
..................
   if(k==50){ /// тут я рисую траекторию
   line0.setP2(QPoint(x[0],y[0]));
   line1.setP2(QPoint(x[1],y[1]));
   scene->addLine(line0,QPen(QBrush(Qt::red),5,Qt::SolidLine));
   scene->addLine(line1,QPen(QBrush(Qt::blue),5,Qt::SolidLine));
   line0.setP1(QPoint(x[0],y[0]));
   line1.setP1(QPoint(x[1],y[1]));
 
 
k=0;}//if
   k++;
}//for
 
}//getResult


Короче, надо получить анимацию.
(http://dl.4pda.ru/forum/dl/post/727183/Screenshot_2.png) (http://madeinlinux.ru.gg/Plenet.htm)



Название: Re: QGraphicsScene и движения планет.
Отправлено: Fat-Zer от Декабрь 14, 2010, 01:09
Как эта ересь хоть что-то рисует!? Минут 10 пялился на код так и не понял...

Что вообще такое x и y? Как оно должно работать?


Название: Re: QGraphicsScene и движения планет.
Отправлено: Ubuntu_linux от Декабрь 14, 2010, 01:17
Как эта ересь хоть что-то рисует!? Минут 10 пялился на код так и не понял...

Что вообще такое x и y? Как оно должно работать?

X[0], y[0] -координаты первой планеты.
x[1], y[1] - координаты второй планеты.

Там в цикле есть часть кода (  я не показал)  которая находит новые координаты планет.

И я соединяю старое и новое положения планет линией то-эсть это  будет траектория. И эта траектория  должна выводится на экран маленькими  кусочками, а она в меня выводится большим куском (когда цикл по i закончился).


Название: Re: QGraphicsScene и движения планет.
Отправлено: Fat-Zer от Декабрь 14, 2010, 01:45
Вы в досе на турбо паскале рисовали? (здесь так не надо)

Если кратко что не так:
1) Цикл блокирует перерисовку окна, поэтому так и происходит.
2) Заводите таймер и по нему отрисовываете новый отрезок
После этого должно заработать.
3) Не тот класс используете... QGraphicScene удобен для отрисовки другого рода, например как сама планета вращается по орбите.
4) Так что заводите буфер (например QPixMap) и по таймеру отрисовываете в нём этот отрезок
5) По тому же таймеру обновляете само окно.



Название: Re: QGraphicsScene и движения планет.
Отправлено: Ubuntu_linux от Декабрь 14, 2010, 01:55
Мерсі, просто до этого не работал с QGraphics...
Сейчас попробую.


Название: Re: QGraphicsScene и движения планет.
Отправлено: Ubuntu_linux от Декабрь 14, 2010, 02:17
Получилось!
Спасибо!


Название: Re: QGraphicsScene и движения планет.
Отправлено: Ubuntu_linux от Декабрь 15, 2010, 00:53
(http://dl.4pda.ru/forum/dl/post/730174/Screenshot_9.png)


Название: Re: QGraphicsScene и движения планет.
Отправлено: m_ax от Декабрь 15, 2010, 02:15
Прецессия орбиты - это чисто из-за погрешности вычислений, я так понял? Типа шаг большой и судя по всему метод не особо устойчивый, самый плюшевый (Ньютона).
Или всё же ОТО?  :o   


Название: Re: QGraphicsScene и движения планет.
Отправлено: Fat-Zer от Декабрь 15, 2010, 03:37
или в алгоритме косяк, или какой-то коэфициент не кратный 9 влияет, или ТС так и хотел и решил похвалится...
Кароче чтобы разобраться нужна телепатия, код или хотя бы более подробное описание проблеммы...

ЗЫ: пишется merci, нзч


Название: Re: QGraphicsScene и движения планет.
Отправлено: Ubuntu_linux от Декабрь 15, 2010, 12:40
Прецессия орбиты - это чисто из-за погрешности вычислений, я так понял? Типа шаг большой и судя по всему метод не особо устойчивый, самый плюшевый (Ньютона).
Или всё же ОТО?  :o  

Та нет,  просто если поставить в силу гравитации не R^2 , а R то получим такую картину. А иначе результат будет таков:

П.С. Точности самого простого метода сполна хватает.
Код
C++ (Qt)
void Widget::getResult(){
   int k=0;
line0.setP1(QPointF(x[0],y[0]));
line1.setP1(QPointF(x[1],y[1]));
 
timer->start(100);
int N=10000;
   for(int i=0;i<N;i++){
 
       dt=ui->lineEdit_dt->text().toDouble();
 
   fx=x[1]-x[0];
   fy=y[1]-y[0];
   r=sqrt(pow(fx,2)+pow(fy,2));
   vx[0]+=-Kraft(sqrt(pow(fx,2)+pow(fy,2)))*(fx/r)*dt/m[0];
   vy[0]+=-Kraft(sqrt(pow(fx,2)+pow(fy,2)))*(fy/r)*dt/m[0];
 
   vx[1]+=Kraft(sqrt(pow(fx,2)+pow(fy,2)))*(fx/r)*dt/m[1];
   vy[1]+=Kraft(sqrt(pow(fx,2)+pow(fy,2)))*(fy/r)*dt/m[1];
 
   x[0]+=vx[0]*dt;
   y[0]+=vy[0]*dt;
 
   x[1]+=vx[1]*dt;
   y[1]+=vy[1]*dt;
 
k++;
   if(k=100){k=0;
   QEventLoop *loop=new QEventLoop;
   QTimer *t=new QTimer;
   t->start(1);
   loop->connect(t,SIGNAL(timeout()),loop,SLOT(quit()));
   loop->exec();
}//if k
  }//for
 
}//getResult




Название: Re: QGraphicsScene и движения планет.
Отправлено: Ubuntu_linux от Декабрь 16, 2010, 01:53
Удалось запустить программу на nokia 5800, смотрите видео:

(http://i2.ytimg.com/vi/-MvkFOC30Q0/default.jpg) (http://www.youtube.com/watch?v=-MvkFOC30Q0)