IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Игра "Солнечная система"
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Это не совсем игра, но так написано в моем задании.
Вот что мне надо постараться создать:

Моделируется движение планет в солнечной системе и прохождение комет через нее. В упрощенной модели не следует соблюдать реальные пропорции размеров планет, Солнца и расстояний между ними. В данной модели все планеты движутся вокруг Солнца в одной плоскости но с разной скоростью. У планет, Солнца и комет есть определенные размеры и масса, пропорциональная кубу линейного размера. В одном из углов "Солнечной системы" в случайные моменты времени генерируются кометы, летящие в произвольном направлении. Комета и планета престают существовать при столкновении. При столкновении кометы о Солнцем исчезает только комета. На кометы действуют силы притяжения планет и Солнца в соответствии с законом всемирного тяготения, что изменяет их траекторию. Комета вышедшая за пределы "Солнечной системы* исчезает на всегда. У комет есть хвост, направленный в сторону от Солнца, Управление моделью : при помощи клавиш: начать, закончить.

Итак, делаться будет на с++, с помощью псевдографики как в этой теме.
Как изначально представляю себе это. Будет базовый класс фигура, который будет иметь такие показатели. как радиус планеты, масса, сила притяжения, радиус орбиты. Каждая планета наследник от этого класса.
Не понял вот этого в задании
Цитата
масса, пропорциональная кубу линейного размера
Так же пока не представляю как в случайном какого-либо конца экрана запустить комету в каком то направлении, рисовать ей хвост(какми способом) от солнца, ну и физику притяжения с изменением траектории.

Как наверстаю начальный код по планетам выложу, далее нужна будет конечно помощь. Заранее благодарю всех кто откликнется, за советы и помощь.

Сообщение отредактировано: Account -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
4 страниц V < 1 2 3 4 >  
 Ответить  Открыть новую тему 
Ответов(40 - 59)
сообщение
Сообщение #41


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата(Account @ 23.07.2011 13:54) *
Только не пойму вот что, в чем вот разница объявлений(присваивание 0),
virtual void Show(int) = 0;
virtual void Recalc()
Присвоивание нуля методу делает его чисто виртуальным, ты не сможешь создать экземпляр класса Celestial (только потомки, да и то - чтобы их создать, надо чтоб потомок переопределял чисто виртуальную функцию, делал ее просто виртуальной). То есть, пока в классе есть хоть одна чисто виртуальная функция (неважно, описанная в этом классе или унаследованная от любого предка и не перекрытая) - он является абстрактным. Он как бы есть (наследоваться от него можно), но его в то же время и нет (создать экземпляр нельзя). В Паскале, кстати, такие методы как раз и называются Абстрактными...


Цитата(Account @ 23.07.2011 13:54) *
Забыл еще спросить по частицам, массив размерностью определенный переменный const int parrSize = 1500;
а используется только 100 ?
maxParticles(100)
Ага... Тут дело вот в чем: если взять просто массив из 100 частичек, инициализировать их, и потом, когда частички удалятся от кометы, переинициализировать опять рядом с кометой - то будет очень своеобразное поведение? то есть, хвост будет "фонтанировать": он будет создаваться, потом частички будут удаляться все дальше и дальше (при этом ни одна из них еще не уйдет слишком далеко, следовательно, новых-то частиц рядом с кометой не будет), пока не начнут уходить из области влияния комету, тогда она начнет испускать новую порцию частичек. Я попробовал - выглядит ужасно. Поэтому я решил пойти другим путем: я на каждой итерации добавляю по StepParticles - Count новых частичек рядом с кометой (где Count - счетчик удалившихся старых частиц), чтобы выброс шел постоянно. Естественно, что общее число частиц начинает возрастать. И возрастает до тех пор, пока длина хвоста не установится, потом возрастание прекращается. Так вот, для этого и нужно место под 1500 частичек, чтобы массив не переполнялся. Хотя, возможно, это я чересчур загнул, надо гонять программу и проверять, сколько максимально частичек присутствует в хвосте. Хочешь - сделай такую проверку. Мне лень было, я выделил место под 1500 элементов, так сказать, с запасом. Все равно, если б я делал для себя, я б не стал использовать массив, написал бы класс связного списка, и все... Сколько засунешь в него - столько он и будет хранить. Новые будут прибывать, старые - удаляться... Но тебе, чтоб не перегружать программу, я этого делать не стал.

Цитата(Account @ 23.07.2011 13:54) *
Ну и нужен совет как дальше делать, столкновение кометы с планетами и солнцем.
Я тебе уже говорил выше: проверяй комету с каждым телом, если Расстояние(Комета, НебесноеТело) меньше чем RКомета + RНебесноеТело, значит, произошло столкновение... Но тебе до этого надо еще принимать меры, когда комета слишком близко подходит к планете - это будет менять ее траекторию. Принцип - то же самый: проверять на каждом шаге расстояние, и если оно меньше какого-то расстояния, вычисленного по массе планеты (там Шека тебе чего-то писал) - то менять Vx и Vy кометы...

Цитата
Попробовал на нетбуке, тоже вылет, пишется Abnormal program termination.
Значит, запускай трассировку, и смотри, на какой именно строке программа вылетает. Возможно для этого придется перед каждой строкой в Comet::Recalc, Comet::Show и всех вызываемых оттуда функциях выводить тестовое сообщение, и потом смотреть, какое именно из них вывелось последним, значит, на последующей строке произошел вылет. Возможно - будет достаточно просто запустить отладку программы (F7 в IDE), поставить курсор на строку, скажем, с closegraph(), и нажать F4. При вылете программы курсор может быть установлен на строку с ошибкой. Так что ищи, где ошибка, коли она только у тебя воспроизводится...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #42


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


IUnknown, а можешь скинуть свой компилятор, на какой-нито файлообменник?
В нем проверю.
По F4 ошибок не выдает, по F7 что то при создании частиц слишком долго) но постараюсь сделать

Сообщение отредактировано: Account -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #43


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Вот тут мой компилятор валяется: http://vlady.uzelok.net/progs/Tc30.exe
Просто запускай его, он сам распакуется куда скажешь...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #44


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 23.07.2011 17:02) *

Вот тут мой компилятор валяется: http://vlady.uzelok.net/progs/Tc30.exe
Просто запускай его, он сам распакуется куда скажешь...


Спасибо. Блин вылет имеется. Буду пробовать по F7.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #45


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


   for(i = 0; i <= stepParticles - count; i++)
{
// Вот отсюда ...
if(maxParticles + i >= parrSize)
{
cout << "Oops..." << endl;
}
// ... до сюда
trace[maxParticles + i] = new Particle((int)(getX()) - 1 + random(2), (int)(getY()) - 1 + random(2),
Vx + Cvt((int)((getX() - sun->getX()) / Ex)) - 1 + random(2),
Vy + Cvt((int)((getY() - sun->getY()) / Ey)) - 1 + random(2));
// ...
Попробуй добавить вот этот кусок, поставить на вывод Oops курсор и нажать на F4... Если оно туда придет, значит, как я и предполагаю, у тебя по какой-то причине генерируется слишком много частичек и происходит вылет за границы массива. Если нет - то я вообще не понимаю, в чем дело, больше просто негде ошибаться... Вообще-то обычно есть сообщение, по какой причине Abnormal programm termination. Либо Floating point error: Domain, либо еще что-то. Почему у тебя этого не показывает - непонятно...

Тебе сейчас главное - локализовать место, где происходит вылет. Через F7 это на самом деле будет долго, для первого раза выполняй методы не заходя в них, то есть, по F8 на имени метода... Потом, когда будешь знать, в каком именно методе происходит вылет - зайдешь в него и там уже жми на F8... Так каждый раз будешь подбираться все ближе и ближе, пока не найдешь, что именно глючит... Найдешь - говори...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #46


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 23.07.2011 17:33) *

код (Показать/Скрыть)
Попробуй добавить вот этот кусок, поставить на вывод Oops курсор и нажать на F4... Если оно туда придет, значит, как я и предполагаю, у тебя по какой-то причине генерируется слишком много частичек и происходит вылет за границы массива. Если нет - то я вообще не понимаю, в чем дело, больше просто негде ошибаться... Вообще-то обычно есть сообщение, по какой причине Abnormal programm termination. Либо Floating point error: Domain, либо еще что-то. Почему у тебя этого не показывает - непонятно...

Тебе сейчас главное - локализовать место, где происходит вылет. Через F7 это на самом деле будет долго, для первого раза выполняй методы не заходя в них, то есть, по F8 на имени метода... Потом, когда будешь знать, в каком именно методе происходит вылет - зайдешь в него и там уже жми на F8... Так каждый раз будешь подбираться все ближе и ближе, пока не найдешь, что именно глючит... Найдешь - говори...

Итак сидел и держал F8, вроде на апдейте кометы, подозреваю на ее recalc(), НО хочу дать потестить кому-ни то из знакомыx, так же было бы не плохо если бы кто-ни то из здешних у себя запустил и протестил. Вдруг может что из-за видео дров, у меня тут периодически вылет их был, когда возвращался из IDE (дос режима)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #47


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Итак, дал погонять еще двоим, у одного вылет через 3 секунды, у другого не так быстро но также вылет, с тем же сообщением что я выше писал(((

Что то в комете. Буду искать по возможности.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #48


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Ау!!! Почему у меня (ноут с WinXP SP3, запускается через DosBox 0.74, мне на фиг не нужно смотреть на это все в полноэкранном режиме) нет никаких вылетов при том же коде, работающем с кометой ( видео прилагается: http://www.youtube.com/watch?v=PzSfcH3jBEE )? Это что, карма?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #49


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Да уж, возможно и карма, а скинь досбокс, я у себя через него запущу. Так же если что установлю uvScreenCamera_4.6.0.100, если будет ошибка попробую записать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #50


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Где-то вот тут: http://www.dosbox.com/download.php?main=1 smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #51


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 23.07.2011 19:42) *

Где-то вот тут: http://www.dosbox.com/download.php?main=1 smile.gif

Все запустил)) Вот скрин и ВИДЕО

Сообщение отредактировано: Account -


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #52


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Не понимаю... Причины такого поведения программы - не понимаю. Знаешь, почему? Потому что я, чтоб было проще отлаживать, безо всяких DosBox-ов, даже без Windows, переписал программу с использованием GLUT (там переделывать-то ничего не пришлось, только чуть-чуть перегруппировать методы и добавить условную компиляцию для двух графических примитивов - для putpixel и для circle - типа, это для ДОС, а это для glut) и запустил ее под Code::Blocks у себя на компьютере (не на ноуте, а именно на десктопе). Ты будешь смеяться, но оно не вылетает. Если уж и GCC ошибки не ловит - я не знаю, что еще делать...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #53


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 23.07.2011 23:37) *

Не понимаю... Причины такого поведения программы - не понимаю. Знаешь, почему? Потому что я, чтоб было проще отлаживать, безо всяких DosBox-ов, даже без Windows, переписал программу с использованием GLUT (там переделывать-то ничего не пришлось, только чуть-чуть перегруппировать методы и добавить условную компиляцию для двух графических примитивов - для putpixel и для circle - типа, это для ДОС, а это для glut) и запустил ее под Code::Blocks у себя на компьютере (не на ноуте, а именно на десктопе). Ты будешь смеяться, но оно не вылетает. Если уж и GCC ошибки не ловит - я не знаю, что еще делать...


У меня есть стационарный комп, но на нем стоит фряха, проверить пока больше нигде не могу. Как представиться возможность где-нито еще погонять. отпишусь по результатам. А пока займусь столкновением.
Я так понимаю, как ты предлагал что планеты буду как массив типа класса планета, чтобы можно было в цикле потом сравнить растояние каждой с кометой, только вот вычисления эти производить в Run() или как лучьше?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #54


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


[offtop]
Посмотрел видео, а после него, как обычно, выскакивает еще несколько "похожих" видео. Среди них песня некоей CINDY SANCHEZ, COMETI UN ERROR.avi. Меня привлекло слово cometi, которое проассоциировалось у меня с кометами, и я послушал.. Оказывается, название песни переводится (с испанского) как "я делаю ошибку" smile.gif. Я только потом понял, что слово "комета" действительно похоже на англ. "to commit" - совершать. Интересно также, что в испанской его версии только одно m, и за ним следует e, что делает его еще больше похожим на русское "комета". Я не знаком с этимологией слова "комета" (может, кто-нить что-нить нароет?) - возможно, тут есть смысловая связь.. Но! Но я не нашел никаких упоминаний о кометах в видео Account'а.. Что-это - совпадение? Если да, то сразу по нескольким пунктам (ибо есть возможность, что ошибка все же делается..)) Не знаю уж, есть ли тут какой-то скрытый смысл lol.gif
[/offtop]


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #55


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Кометы выглядят замечательно.. Но я не понимаю, почему они не притягиваются ни к Солнцу, ни к планетам? Некоторые проходят прямо через Солнце - и ничего! smile.gif)
Притяжение еще не реализовано?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #56


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
Притяжение еще не реализовано?
Нет еще, ищем пока ошибку, которая приводит к вылету программы у Account-а.

Присоединяйся, если есть желание smile.gif У тебя ж есть компилятор который умеет работать с GLUT-ом? Присоединяю получившийся у меня "комбайн", который компилируется и в GCC, и в Турбо-Сях, и ведет себя одинаково, ибо отличается только сама отрисовка. Где может сбоить - ума не приложу.

Прикрепленный файл  main.cpp ( 8.89 килобайт ) Кол-во скачиваний: 589

(сохранено в UTF8)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #57


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(IUnknown @ 24.07.2011 2:43) *
Присоединяйся, если есть желание smile.gif У тебя ж есть компилятор который умеет работать с GLUT-ом?

Спасибо - боюсь, поздновато, но я попробую (кстати, с той эмуляцией bgi-графики я не особо преуспел, хотя и пытался - в лом стало тратить на это время). GLUT не пользовал, сейчас пробую SDL - его должно с лихвой хватать для 2D.

Вечером посижу, попробую вникнуть..

Добавлено через 12 мин.
Цитата(IUnknown @ 24.07.2011 2:43) *
Нет еще, ...

Мне это немного странно.. Я бы с этого начал, потому что если его сделать - ВСЕ объекты будут двигаться единым способом. Ведь, если посмотреть с общей точки зрения - это просто система нескольких гравитирующих тел. В общем случае их движение представляет полный хаос, но в рассматриваемом случае (супермассивная звезда, массивные планеты, легкие кометы) мы просто знаем (глядя на небо)), что порядок возможен yes2.gif. То есть, не нужно отдельно делать движение планет по кругу - просто нужно задать подходящую массу и вектор скорости. Проблема будет только в том, как "отладить" всю систему, чтоб она не разваливалась из-за межпланетного взаимодействия (впрочем, вот его-то можно и "выключить" для простоты)).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #58


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


IUnknown, сделал вот что. Взяв за пример функцию dist() вот вставил вот такую boom() для проверки расположения кометы и каждой планеты
int boom(Celestial &a, Celestial &b)
{
double dx =abs (a.getX() - b.getX());
double dy =abs( a.getY() - b.getY());
if ((dx<(a.getSize()+3)) || (dy<(a.getSize()+3)))
return 1;
return 0;
}

Далее переправил такие места

//.....
Planet *planets[2];

//....
planets[0]->Update();
planets[1]->Update();
//....
planets[0] = new Planet(maxx / 2.+ 3 * 20, maxy / 2., 3,60, 360./365., "earth");
planets[1] = new Planet(maxx / 2.+ 4 * 20, maxy / 2., 3,80, 360./687., "mars");
//.....

Пока думаю как лучше организовать проверку на столкновение и выход кометы за систему, ведь в одном случе уничтожаются два объекта в другом только комета и при обоих комета заново создается.

Сообщение отредактировано: Account -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #59


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
но в рассматриваемом случае (супермассивная звезда, массивные планеты, легкие кометы) мы просто знаем (глядя на небо)), что порядок возможен yes2.gif . То есть, не нужно отдельно делать движение планет по кругу - просто нужно задать подходящую массу и вектор скорости.
Да, да... Теоретически - так оно и есть. Как только дело доходит до практики... Попробовал я реализовать то же самое с использованием сил гравитации. Вот так и есть, реальная орбитальная скорость, реальная масса Солнца и планет, реальное расстояние между планетами и Солнцем + масштабирование, чтоб не было необходимости в мониторе с диагональю около 30 а.е. smile.gif

Так вот, взаимодействие Солнца и планет отрабатывают на ура, все движется, да не по окружностям, а по эллиптическим орбитам. Красота... Вот, думаю, сейчас добавлю сюда комету, и посмотрю, как она будет двигаться. Так вот комете (при реальной же массе, которая на 16 порядков меньше массы Солнца - скажем, масса кометы Галлея = 2.2×1014 кг. против 2.0×1030 кг. солнечной массы) крышу сносит на первой же секунде, её солнце притягивает и выстреливает ей куда-то в неизвестном направлении как из пращи, со скоростью порядка 1000 км/сек smile.gif (при том, что реальная орбитальная скорость Меркурия, как самой быстрой планеты, не превышает 50 км/сек). Начинаю увеличивать массу кометы - все постепенно начинает приходить в норму, скорость выброса из системы уменьшается, а когда масса кометы становится соизмерима с массами планет - то комета переходит на гелиоцентрическую орбиту... Я явно что-то упускаю, а вот что - пока сообразить не могу...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #60


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Вот что пытался сделать для столкновения, но что то не работает так как надо

код (Показать/Скрыть)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

4 страниц V < 1 2 3 4 >
 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 16.05.2024 14:37
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name