Russian Qt Forum
Июнь 16, 2024, 09:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsScene и движения планет.  (Прочитано 6735 раз)
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


Короче, надо получить анимацию.


« Последнее редактирование: Декабрь 14, 2010, 00:29 от Ubuntu_linux » Записан
Fat-Zer
Гость
« Ответ #1 : Декабрь 14, 2010, 01:09 »

Как эта ересь хоть что-то рисует!? Минут 10 пялился на код так и не понял...

Что вообще такое x и y? Как оно должно работать?
Записан
Ubuntu_linux
Гость
« Ответ #2 : Декабрь 14, 2010, 01:17 »

Как эта ересь хоть что-то рисует!? Минут 10 пялился на код так и не понял...

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

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

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

И я соединяю старое и новое положения планет линией то-эсть это  будет траектория. И эта траектория  должна выводится на экран маленькими  кусочками, а она в меня выводится большим куском (когда цикл по i закончился).
« Последнее редактирование: Декабрь 14, 2010, 01:26 от Ubuntu_linux » Записан
Fat-Zer
Гость
« Ответ #3 : Декабрь 14, 2010, 01:45 »

Вы в досе на турбо паскале рисовали? (здесь так не надо)

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

Записан
Ubuntu_linux
Гость
« Ответ #4 : Декабрь 14, 2010, 01:55 »

Мерсі, просто до этого не работал с QGraphics...
Сейчас попробую.
Записан
Ubuntu_linux
Гость
« Ответ #5 : Декабрь 14, 2010, 02:17 »

Получилось!
Спасибо!
Записан
Ubuntu_linux
Гость
« Ответ #6 : Декабрь 15, 2010, 00:53 »

Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #7 : Декабрь 15, 2010, 02:15 »

Прецессия орбиты - это чисто из-за погрешности вычислений, я так понял? Типа шаг большой и судя по всему метод не особо устойчивый, самый плюшевый (Ньютона).
Или всё же ОТО?  Шокированный   
Записан

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

Arch Linux Plasma 5
Fat-Zer
Гость
« Ответ #8 : Декабрь 15, 2010, 03:37 »

или в алгоритме косяк, или какой-то коэфициент не кратный 9 влияет, или ТС так и хотел и решил похвалится...
Кароче чтобы разобраться нужна телепатия, код или хотя бы более подробное описание проблеммы...

ЗЫ: пишется merci, нзч
« Последнее редактирование: Декабрь 15, 2010, 03:39 от Fat-Zer » Записан
Ubuntu_linux
Гость
« Ответ #9 : Декабрь 15, 2010, 12:40 »

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

Та нет,  просто если поставить в силу гравитации не 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


« Последнее редактирование: Декабрь 15, 2010, 12:45 от Ubuntu_linux » Записан
Ubuntu_linux
Гость
« Ответ #10 : Декабрь 16, 2010, 01:53 »

Удалось запустить программу на nokia 5800, смотрите видео:




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


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