Не могу понять в чем бага....blitz
оч надо найти причину до завтрашнего вечера
просьба бэсик говно - не писать
просьба бэсик говно - не писать
короче, вроде понятно, что бага в округлении, но я никак не могу догнать, как ее обойти...
мож, кто какие костыли придумает?
мож, кто какие костыли придумает?
Потести с двумя планетами с простыми начальными данными, чтобы первые несколько кадров ты мог сам вручную просчитать.
Кроме того прикинь на сколько у тебя смещаются планеты за один кадр. Если это расстояние больше 1/10 от расстояния между планетами то точность алгоритма будет плохой.
Ну и последнее, если две планеты сильно сблизятся, то из-за дискретности алгоритма они приобретут слишком большое ускорение на один кадр и очень быстро разлетятся. Как решение можно уменьшать dt.
Кроме того прикинь на сколько у тебя смещаются планеты за один кадр. Если это расстояние больше 1/10 от расстояния между планетами то точность алгоритма будет плохой.
Ну и последнее, если две планеты сильно сблизятся, то из-за дискретности алгоритма они приобретут слишком большое ускорение на один кадр и очень быстро разлетятся. Как решение можно уменьшать dt.
И еще. Если планеты изначально не имеют скорости, то их гравитационное взаимодействие приведет к тому, что они слипнутся в центре.
Но это в реальном мире. А в дискретном в какой-то момент окажется, что планеты слишком близко. Они приобретут очень большое ускорение и вместо того, чтобы в центре встретится, они из него разлетятся с очень большими скоростями.
Но это в реальном мире. А в дискретном в какой-то момент окажется, что планеты слишком близко. Они приобретут очень большое ускорение и вместо того, чтобы в центре встретится, они из него разлетятся с очень большими скоростями.
угу
я ща убрал задержку между кадрами - получилось неплохо
еще теперь дельта т делится на 1000 - как бы замедление времени в 1000 раз
но теперь главная задача - как красиво обойти бесконечности?
планеты действительно сильно сближаются и потом улетают в бесконечность
есть идея с пробросом их через друг друга при сближении на минимальное расстояние, т.е. вместо одной планеты ставим другую...хотя это плохо - вся картина рушится
я ща убрал задержку между кадрами - получилось неплохо
еще теперь дельта т делится на 1000 - как бы замедление времени в 1000 раз
но теперь главная задача - как красиво обойти бесконечности?
планеты действительно сильно сближаются и потом улетают в бесконечность
есть идея с пробросом их через друг друга при сближении на минимальное расстояние, т.е. вместо одной планеты ставим другую...хотя это плохо - вся картина рушится
Можно придать им начальные скорости так, чтобы они стабильно вращались не сближаясь. Для двух это легко. Для трех тоже можно, по крайней мере у Солнца Земли и Луны получается. Еще можно уменьшать dt с уменьшением расстояния между планетами, но если они слипаются, а не просто пролетают рядом, то это не поможет.
угу я понял
для двух тел все работает замечательно - тела вертятся вокруг центра масс
ща допишу перемещение камеры с центром масс и заценю для трех
для двух тел все работает замечательно - тела вертятся вокруг центра масс
ща допишу перемещение камеры с центром масс и заценю для трех
чет я седня уже не могу писать....или центр масс гуляет
завтра продолжу...
большая просьба писавшим на этом....посоветовать что-нибудь
завтра продолжу...
большая просьба писавшим на этом....посоветовать что-нибудь
для начала я бы сделал все константы (в т.ч. и нулевые) флоатами - т.е. добавил бы .0 после каждой целочисленной константы
В таких задачах есть смысл работу сил на каждом дискретном шаге честно посчитать.
В случае пересечения 2х планет (проход через 0 на отрезке [-a, b] считать, что для всякого x работа при прохождении отрезка [-x, x] равна 0.
Конечно, будет погрешность за счёт поочерёдного перемещения. Тут уж не знаю, что делать.
В случае пересечения 2х планет (проход через 0 на отрезке [-a, b] считать, что для всякого x работа при прохождении отрезка [-x, x] равна 0.
Конечно, будет погрешность за счёт поочерёдного перемещения. Тут уж не знаю, что делать.
Оставить комментарий
PooH
прога про три планеты, их гравитационное взаимодействиена производительность пох
пишется на блице3д
для незнающих:
planet(i)\a[k] - это поле а[k] списка planet(i)
Короче, вроде все правильно, только прога при g=50 не меняет картинку (ускорения = 0 а при g>60 все работает слишком быстро - т.е. планеты разлетаются за миллисекунды