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

> Внимание!

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

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

4 страниц V  1 2 3 > »   
 Ответить  Открыть новую тему 
> Игра "Солнечная система"
сообщение
Сообщение #1


Бывалый
***

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

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


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

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

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

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

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


Я.
****

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

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


Цитата
с помощью псевдографики как в этой теме.
Что-то не нашел там псевдографики.
Цитата
Не понял вот этого в задании
Цитата
масса, пропорциональная кубу линейного размера
m = p * v;
v = 4 / 3 * Pi * r3
в данной модели нужна имитация только кубической зависимости т.к. коэффициент все равно не правильный будет).
Цитата
как в случайном какого-либо конца экрана запустить комету в каком то направлении
rand()
Цитата
рисовать ей хвост(какми способом) от солнца
Например так: ищешь вектор через центр солнца и центр кометы, нормируешь его, умножаешь вектор на длину хвоста, прибавляешь координаты центра кометы. Это конец хвоста. Соединяешь найденную точку с телом кометы помощью касательных к окружности. Вызываешь FloodFill с координатами центра этого треугольника либо рандомно выводишь пиксели в эту область. Представить можешь или нарисовать?
Цитата
ну и физику притяжения с изменением траектории.
F = G * m1 * m2 / r2
Учитывая, что центр масс системы без данной планеты в упрощенной схеме вряд ли искать надо + от ц. солнца он не сильно отличаться будет, тогда принимаем массу другого тела как ц.м солнца:
vпланеты = sqrt (G * mсолнца / rдо солнца)

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


Гуру
*****

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

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


Цитата
Будет базовый класс фигура, который будет иметь такие показатели. как радиус планеты, масса, сила притяжения, радиус орбиты. Каждая планета наследник от этого класса.
Наследование в таком виде здесь напрочь не нужно... Меркурий, Венера, ... (и т.д. по списку) - это не подвиды планет, а экземпляры класса Планета...

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


Злостный любитель
*****

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

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


> Каждая планета наследник от этого класса.

Такой ООП нам не нужен.

> Возможно, ты унаследуешься от единого предка НебесноеТело, от которого пойдет Звезда, Планета, Комета

Я бы сделал единый класс НебесноеТело с полем типа (Звезда, Планета, Комета). Этого часто хватает с лихвой, а код проще и читаемей, чем с иерархиями.

> Итак, делаться будет на с++

Так можно наследование на шаблончиках сделать...


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


Бывалый
***

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

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


Цитата(sheka @ 18.07.2011 0:12) *

Что-то не нашел там псевдографики.

sheka,я не шарю в этом , а по поводу хвоста не совсем понялblush.gif
Цитата
Наследование в таком виде здесь напрочь не нужно... Меркурий, Венера, ... (и т.д. по списку) - это не подвиды планет, а экземпляры класса Планета...

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

Что то не догоняю.blush.gif Сделать три класса Звезда, Планета, Комета, а планеты просто создавать как экземпляры класса планета?
Цитата
Так можно наследование на шаблончиках сделать...

Раньше что то читал, но в данной ситуации пока не догоняю как применить.

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


Злостный любитель
*****

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

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


> а планеты просто создавать как экземпляры класса планета?

Ты хотел программу без экземпляров классов?

> Раньше что то читал, но в данной ситуации пока не догоняю как применить

Шаблон "небесное тело", параметр - перечислимого типа (звезда, планета, комета). Для каждого значения параметра определяешь шаблон по-своему.


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


Бывалый
***

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

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


Цитата(TarasBer @ 18.07.2011 17:59) *

> а планеты просто создавать как экземпляры класса планета?

Ты хотел программу без экземпляров классов?

> Раньше что то читал, но в данной ситуации пока не догоняю как применить

Шаблон "небесное тело", параметр - перечислимого типа (звезда, планета, комета). Для каждого значения параметра определяешь шаблон по-своему.


Вопрос в тупик загнал, так как я спросил (приведенная цитата ) про реализацию, знаний то у меня не много. Поэтому спрашиваю и советуюсь, как сделать лучше. ))))
Про шаблоны теоретически понял, на практике пока все сложновато. Так как в примерах наблюдал и делали только с базовыми типами int, float, а не с перечисляемыми.

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


Я.
****

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

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


Вот псевдографика http://txtart.ru/index.html
Вот случайный хвост Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гуру
*****

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

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


Цитата
Шаблон "небесное тело", параметр - перечислимого типа (звезда, планета, комета). Для каждого значения параметра определяешь шаблон по-своему.
Для этого надо, чтобы компилятор поддерживал частичную специализацию. Турбо С++, о котором шла речь раньше, ее не поддерживает...

Account, чтоб было понятно, о чем говорит Тарас - вот такой код будет прекрасно работать при использовании любого современного компилятора:
Пример (Показать/Скрыть)
, однако в досовском Турбо С++ ты этот пример работать не заставишь... А в других компиляторах нет поддержки graphics. Замкнутый круг.

P.S. Кстати... Я бы начинал написание программы именно с такого вот текстового "каркаса". Который будет тебе сообщать, что там инициализировалось, что в какой позиции находится, и что с чем взаимодействует. А вот когда это все будет нормально работать - тогда просто будешь заменять методы, печатающие информацию, на методы, отображающие ее графически. По крайней мере, я всегда делаю именно так. А то начнешь, сделаешь уже достаточно много, и красиво, и в самый ответственный момент вдруг выяснится, что вот именно то, что тебе сейчас нужно, компилятор не поддерживает. Ощущение не из приятных - все (или многое) переписывать заново... А с текстом ты сделаешь каркас гораздо быстрее, потеряешь меньше времени, и будет не так обидно.

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


Бывалый
***

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

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


sheka,спасибо за ссылку и за расчеты хвоста, как доберусь, попробую)))

IUnknown, так же спасибо за наглядный пример. Насчет компилятора тут вот как раз загвоздка, нужно именно на досовском(((

Так что буду делать))) Солнце + одну планету нарисовал, как ее запущу так выложу первые наработки)))

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


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

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

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


Забавная тема smile.gif.
С псевдографикой действительно неясно - Account, что же ты все-таки имел в виду? Кстати, подумалось, что та борландовская графика уже вполне заслуженно может переехать в раздел "псевдо" и гордо носить эту приставку к слову "графика" smile.gif. Sheka, суперская ссылка, просто шедевр, я с удовольствием разглядывал, спасибо, +1.

Все же я полагаю, что тут предполагается не текстовая мода, а графическая - в текстовой делать такую задачу все же странно. НО! Но по-хорошему-то (вау! я не припоминаю, чтоб я раньше встречал слова с двумя дефисами, кроме сложносоставных..), по-хорошему-то, надо писать основной код БЕЗ ГРАФИКИ вообще, а визуализацию всю поместить в отдельный модуль. Тогда графика будет, какая захочешь ("брюки превращаются.. брюки превращаются.. в элегантные шорты!" (С) smile.gif). Более того - то, что предлагал volvo877 (весьма ценный совет, на мой взгляд), легко реализуется в рамках этой же модели (как текстовые сообщения вместо графики).

Что касается хвоста (вроде - мелкая деталь, но вызывает большой интерес)), то я бы делал не так, как Шека предлагает (кстати, Шека, не совсем натурально вышло: хвост не сужается на удалении от кометы, а расширяется, хоть и бледнеет). Я бы описывал хвост тоже как потомок все того же самого небесного тела. Точнее - не весь хвост, а его частицы. По физике дела они такие и есть. То есть, примерно так..

Комета испускает частицы очень малой массы, которые имеют разброс скоростей. Интенсивность этого испускания и диапазон скоростей зависят он нагрева кометы, то есть от ее расстояния до Солнца (это все делается в одну строчку). Отделившись, частица летит сама, как все остальные небесные тела. Но есть одно отличие: она испытывает на себе дополнительную (т.е. кроме гравитации) силу - давление солнечного ветра. Эта сила совсем небольшая (поэтому при расчете движения остальных тел ее можно не учитывать), и действует она по радиусу от Солнца. Частицы хвоста можно изображать точками темного цвета (на фоне черного неба). И, наконец, эти частицы должны иметь некоторое конечное время жизни (это неверно по физике, но для модели сгодится). Вот, как-то так smile.gif.

Добавлено через 10 мин.
Такая модель хвоста на первый взгляд кажется сложнее, но на самом деле она даже проще, т.к. используется уже имеющийся механизм движения. Главное, чтоб вычислительных ресурсов компа хватило.. А это большой вопрос, поскольку добавляется немалое число небесных тел (заметно превосходящее число планет).

Добавлено через 13 мин.
Вот небольшая иллюстрация: Прикрепленное изображение
(взято отсюда). Хвост расширяется и немного загибается (благодаря сохранению момента импульса и увеличению расстояния до Солнца). Оба эти эффекта должны естественным образом получиться в описанной мной модели.


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


Бывалый
***

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

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


Lapp, да просто как то не воспринимается эта досовская графика как полноценная. вот и обозвал ее псевдо)

Итак, вот что сотворил, сильно не пинайте только))

games (Показать/Скрыть)



Не нравиться дергание при отрисовке на концах радиуса орбиты по оси х, но я так понял убрать это не возможно , так как в координатах используются только целые значения?
Цикл для рисовки естественно потом уберу из метода Move. просто для проверки загнал пока.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гуру
*****

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

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


Цитата
//подставлять неопределенные заранее значения не дает(((
Можно посмотреть, как пробовал?

Цитата
int ix=getmaxx()/2+orbp;
int iy=getmaxy()/2;
xy[0][0]=ix;
xy--[1][0]=iy; // <--- Вот это компилироваться не должно
Неужели TC пропускает такое?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Бывалый
***

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

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


Цитата(IUnknown @ 19.07.2011 21:54) *

Можно посмотреть, как пробовал?

Неужели TC пропускает такое?


Пробовал так
int xy[2][(orbp*4)];// и даже через дополнительную переменную
// Error: Constant expression recuired


По поводу второго, я при набирании поста просто накосячил)
конечно вот так на деле
xy[1][0]=iy;

Просто на ноуте иногда попадаю на доп. функциональные клавиши, в итоге курсор перепрыгивает + как всегда тороплюсь, невнимателен.

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


Гуру
*****

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

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


Чтобы передавать в класс размер массива надо сделать немного другое описание класса:

template <int orbp>
class Planeta
{
// вот тут все так же, как и раньше, кроме того, что orb не должно быть в конструкторе
public:
Planeta(int r, int clr, int svr): rp®, clrp(clr), svrp(svr)
{ cout<<"Create Planeta\n"; }

// дальше без изменений
};

template <int orbp>
void Planeta<orbp>::Move()
{
int xy[2][orbp]; // Чудо? Ошибки нет...
int ix=getmaxx()/2+orbp; // Здесь тоже...

// ...
}

// Ну, а создавать объект - так:
Planeta<70> P1(10, 11, 10);
Чувствуешь разницу? Передаешь радиус орбиты как константное выражение, и использовать его уже можно... Ну, или простым new выделять память под двумерный массив xy, если тебе так проще...

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


Злостный любитель
*****

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

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


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


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


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


Гуру
*****

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

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


Тарас, еще раз: чтобы что-то использовать - оно должно поддерживаться компилятором. Турбо С не знает ни про какие векторы. И про новые стандарты тоже. Отсюда и подобные решения проблем вместо решения задач...

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


Злостный любитель
*****

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

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


> Турбо С не знает ни про какие векторы.

Ну тогда да, проще передать размер в шаблоне, чем с нуля писать код вектора (хоть его и не так много надо для данной задачи).


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


Гуру
*****

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

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


Итак, Account, пре-альфа хвоста кометы. Сделано на основе системы частиц, т.е., particle system, как и предлагал Lapp (в принципе, тут других вариантов и быть не могло, все эти генерации точек в конусах и трапециях выглядят уж слишком неестественно). Более того, я дам тебе еще одну идею: я когда-то делал подобную вещь (но не с настолько упрощенной физикой, а с более приближенной к реальности), так там для достоверности еще при удалении от кометы цвет частички менялся. От белого через желтый, через ярко-красный, потом темно-красный, потом коричневый к черному. Как только цвет становился черным - частица удалялась (здесь сделано чуть-чуть по другому, частица удаляется, когда она дальше 40 радиусов от кометы, но принцип тот же, и там и там при некотором удалении от кометы на частицу можно перестать обращать внимание)... Ну, в принципе, тут можно много чего сделать, все ограничено только твоей фантазией...

P.S. Да, я знаю, планета не двигается, код не вычищен, память не освобождается, можно еще кое-что выделить в методы и будет проще. Но на то и пре-альфа: оценка возможностей.

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


Прикрепленные файлы
Прикрепленный файл  SOLARSYS.CPP ( 6.76 килобайт ) Кол-во скачиваний: 219
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Бывалый
***

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

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


IUnknown, вчерашний предложенный код с шаблоном еще не опробовал. только с работы пришел, отдохну попробую.

По поводу пре-альфа хвоста кометы, посмотрел, понравилось, сам код мне еще надо разобрать, так как бегло просмотрел, пока не догнал принцип вычисления от солнца и полностью вывод частичек, надо бы поподробней разобраться в коде. За исходник и за то что тратишь время отдельное спасибо. Только я теперь не знаю за что взяться, то ли продолжать свой код (выдрать у тебя только комету с хвостом) , то ли твой исходник переделывать, прям меня в тупик вогнал)

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

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

 





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