![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
IUnknown |
![]()
Сообщение
#21
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата пока не догнал принцип вычисления от солнца За это отвечает вот этот кусок кода: (Показать/Скрыть)
Цитата Только я теперь не знаю за что взяться, то ли продолжать свой код (выдрать у тебя только комету с хвостом) , то ли твой исходник переделывать Ну, это уже тебе решать. Я только показал пример реализации. Справишься с написанием всей программы в подобном стиле - бери и дорабатывай мой каркас. Не справишься - продолжай свою программу. |
Account |
![]()
Сообщение
#22
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
За это отвечает вот этот кусок кода: (Показать/Скрыть)
Ну, это уже тебе решать. Я только показал пример реализации. Справишься с написанием всей программы в подобном стиле - бери и дорабатывай мой каркас. Не справишься - продолжай свою программу. Вряд ли справлюсь , за пример спасибо, покапаюсь конечно в нем))) Вот сегодня запустил несколько планет)))) Код конечно плохой, но уж строго не суди, не программист) И у меня вопрос, можно ли как-нибудь мерцания избежать и перепрыжку рисовки планет через ось по Y ( Если взять центр координат середину экрана) код: (Показать/Скрыть)
|
IUnknown |
![]()
Сообщение
#23
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата и перепрыжку рисовки планет через ось по Y А ты понимаешь причину такой перепрыжки? ![]() for(int dv = 0; dv <= 4 * orbp; dv++) {Вот это добавь в самый конец Set(). Так сказать, чтобы очертить орбиту. И обрати внимание, с какой частотой у тебя точки стоят в одном месте, и насколько они редко расположены в другом (вот там где они реже всего и будет "перепрыжка". Но на самом то деле я бы это "перепрыжкой" не называл. Это то, как должно быть, именно там ведь у тебя и нет мерцания, правда? Мерцает в других местах траектории, потому что там обновление происходит слишком часто). Если б мне понадобилось запомнить координаты точек орбиты, я бы прошелся одним циклом от 0 до 359 градусов + sin и cos, и все точки были бы с одинаковой частотой. И тогда не будет вот этих "перепрыжек", и (скорее всего) уменьшится мерцание, ибо перерисовываться-то оно будет, но насколько реже - ты даже не представляешь ![]() Сообщение отредактировано: IUnknown - 20.07.2011 21:45 |
Account |
![]()
Сообщение
#24
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
Сделал для проверки отдельно
#include <iostream.h> Точки не последовательно расположены, что то ни как не догоню. как упорядочить потом координаты? |
IUnknown |
![]()
Сообщение
#25
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ууу... Как все запущено. Радианы и градусы - разные вещи, правда? Вот библиотека math подразумевает, что тригонометрические функции работают с радианами. Делаем проще:
// Не надо каждый градус, при таком маленьком радиусе достаточно каждого четвертого |
Account |
![]()
Сообщение
#26
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ууу... Как все запущено. Радианы и градусы - разные вещи, правда? Вот библиотека math подразумевает, что тригонометрические функции работают с радианами. Делаем проще: // Не надо каждый градус, при таком маленьком радиусе достаточно каждого четвертого Я и забыл про это ![]() |
Lapp |
![]()
Сообщение
#27
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Вопрос такой..
Тема вызывает интерес, и это понятно. Но BC у меня (и не только, думаю) нет. Можно ли и накормить волков (то есть преподавателей топикстартера), и сохранить овец (чтоб я и остальные могли компилировать прогу)? Я, конечно, могу переделать всю графику.. Но делать так с каждой новой версией кода по мере развития темы - извините, в лом. Есть ли более простой способ обеспечить совместимость? Добавлено через 4 мин. P.S. Я использую gnu в основном. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
IUnknown |
![]()
Сообщение
#28
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Можно попробовать воспользоваться вот этим:
http://codecutter.org/tools/winbgim/index.html (сразу говорю: я не пробовал, но положительные отзывы присутствуют. Насколько я помню, даже здесь я приводил эту ссылку уже). Есть еще вот этот проект: http://sourceforge.net/projects/openbgi/ - он начинался на Сурсах, года три назад, вроде под Билдером и Dev C++ работала графика... Или написать переходники к основным функциям именно под свой компилятор и под ОС (что там используется из BGI-шного - putpixel и circle? Пока вроде и все) Но есть еще вероятность, что не все конструкции, пропускаемые TurboC, другие компиляторы будут компилировать (обратное тоже верно, примеры я приводил в начале этой темы). Что с этим делать? |
Account |
![]()
Сообщение
#29
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
IUnknown, добавил в твой код следующее,глобальную переменную
int dc=1; В метод Update в конце добавил строку if (X>maxx+5 || Y<-5) {delete this;dc=0;} и в цикл запуска всего, просто условие проверки переменной dc и если 0 то заново создать такую же комету, сначала прога работает нормально, но потом через некоторое время вылетает с ненормальным завершением, в чем причина? Сообщение отредактировано: Account - 21.07.2011 18:43 |
IUnknown |
![]()
Сообщение
#30
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Хм... Не знаю, не пробовал делать так, как ты предлагаешь, ибо удалять объект там, где это делаешь ты - не очень хорошая идея. Сделал так: дописал еще один метод в класс Comet:
class Comet : public Celestial, никаких лишних глобальных переменных, ничего больше. Только эти 2 фрагмента. Запустил, уже 20 минут летает, ничего не завершается... ![]() |
Account |
![]()
Сообщение
#31
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
Хм... Не знаю, не пробовал делать так, как ты предлагаешь, ибо удалять объект там, где это делаешь ты - не очень хорошая идея. Сделал так: дописал еще один метод в класс Comet: class Comet : public Celestial, никаких лишних глобальных переменных, ничего больше. Только эти 2 фрагмента. Запустил, уже 20 минут летает, ничего не завершается... ![]() В одном из фильмов один из героев произнес фразу:"Чувствую себя богом...". А вот моя фраза:"Чувствую себя ЛОХОМ")))) Спасибо за решение. Твой код почти разобрал. Что не до конца догоню потом спрошу. Жду завтрашнего дня, там выходные можно будет спокойно позаниматься. Буду опять через одно место делать движение планет(в твоем коде)))) После чего только столкновение останется и изменение траектории кометы из за силы притяжения))) Сообщение отредактировано: Account - 21.07.2011 19:46 |
Account |
![]()
Сообщение
#32
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот жалкая попытка заставить двигаться планету, и опять вылет с ненормальным завершением выполнения(((
код (Показать/Скрыть)
Сообщение отредактировано: Account - 22.07.2011 18:56 |
IUnknown |
![]()
Сообщение
#33
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Что именно приводит к вылету программы, добавление движения планеты, или совместное движение планеты и кометы? Я вот сейчас попробовал запустить твою программу, закомментировав в Run() все, что касается кометы - прекрасно крутится зеленый кружок (хотя мне, например, непонятно твое желание просчитать сразу все точки и хранить массив из 720 int-ов, почему не хранить текущий угол поворота, и по нему рассчитывать координаты на каждой итерации?).
Только вот непорядок получается при переходе X от 359 к нулю. Остается артефакт, половина зеленой окружности (нижняя половина) остается на экране. Я бы сделал все-таки вот так: if (bShow), тогда по крайней мере артефактов не остается. А вообще - непонятно, почему ты 1) не догадался эти действия производить в методе Recalc(), он же для этого и предназначен: посмотри на Update самого базового класса: сначала гасим изображение, потом пересчитываем то, что нужно пересчитать, и, наконец, проявляем изображение в новом месте. 2) почему до сих пор не догадался, как снять постоянное мерцание Солнца? Оно не должно перерисовываться, у тебя оно все время гасится, потом вызывается пустой Recalc(), потом опять появляется - зачем? Должно быть так: нужно его отобразить один раз, и после этого не гасить и не перерисовывать. Попробуй сделать подобное поведение сам, если не получится - я помогу. |
Account |
![]()
Сообщение
#34
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
Что именно приводит к вылету программы, добавление движения планеты, или совместное движение планеты и кометы? Я вот сейчас попробовал запустить твою программу, закомментировав в Run() все, что касается кометы - прекрасно крутится зеленый кружок (хотя мне, например, непонятно твое желание просчитать сразу все точки и хранить массив из 720 int-ов, почему не хранить текущий угол поворота, и по нему рассчитывать координаты на каждой итерации?). Только вот непорядок получается при переходе X от 359 к нулю. Остается артефакт, половина зеленой окружности (нижняя половина) остается на экране. Я бы сделал все-таки вот так: if (bShow), тогда по крайней мере артефактов не остается. А вообще - непонятно, почему ты 1) не догадался эти действия производить в методе Recalc(), он же для этого и предназначен: посмотри на Update самого базового класса: сначала гасим изображение, потом пересчитываем то, что нужно пересчитать, и, наконец, проявляем изображение в новом месте. 2) почему до сих пор не догадался, как снять постоянное мерцание Солнца? Оно не должно перерисовываться, у тебя оно все время гасится, потом вызывается пустой Recalc(), потом опять появляется - зачем? Должно быть так: нужно его отобразить один раз, и после этого не гасить и не перерисовывать. Попробуй сделать подобное поведение сам, если не получится - я помогу. Наверное второе. Хотя заметил так же происходит вылет при столкновении. По поводу хранения угла, как сделаю отпишусь. У меня не доходит до указанного перехода вылетает с Abnormal programm terminated ( заранее извиняюсь за возможно неправильное написание на английском, не владею). По поводу артефакта понял, поправку принял. По 1) Как переделаю выложу. По 2) код (Показать/Скрыть)
P.S. Вот только не пойму как еще сделать в данном коде разную скорость у планет. Сообщение отредактировано: Account - 22.07.2011 21:50 |
IUnknown |
![]()
Сообщение
#35
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата По 2) Хм... Хитрый, да? Это не совсем правильное решение ![]() То, что ты сделал - выбивает объект класса Звезда из такой модели. То есть, ты не сможешь просто вызвать Update() в цикле для всех элементов массива КрупныеОбъекты, тебе придется исключать из этого процесса элемент массива, являющийся Солнцем, но проверять на взаимодействие придется со всеми... Опять лишние конструкции, опять if-ы, зачем тебе это? Нужно так модифицировать Star::Show(), чтобы при постоянном вызове Update() не происходило перерисовки объекта ![]() Цитата Вот только не пойму как еще сделать в данном коде разную скорость у планет. Вот как переделаешь перемещение планеты через угол (только угол не делай целочисленным, сделай вещественным) - поймешь... Будешь задавать для каждой планеты разное приращение угла - будет разная скорость вращения...Цитата У меня не доходит до указанного перехода вылетает с Abnormal programm terminated Это уже я только завтра/послезавтра смогу потестировать, ноут с Windows уже забрали. Если б тебе хотя бы удалось выяснить, где происходит ошибка - было бы проще... |
Account |
![]()
Сообщение
#36
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
По солнцу сделал вот так, но не уверен что правильно, так как рисоваться то все равно будет, просто наложение так сказать.
void Star :: Show(int) По поводу вылетов. Закоментировал как и ты все что относилось к комете, в run(). Вылетов не стало. |
Account |
![]()
Сообщение
#37
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот, что у меня теперь с использованием угла
код (Показать/Скрыть)
|
IUnknown |
![]()
Сообщение
#38
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я бы все-таки сделал так:
![]() Обрати внимание на следующие вещи: 1. Все-таки, пересчет планеты я вынес в Recalc() 2. Celestial::Recalc() сделал не чисто виртуальным, а просто пустым, это дало возможность вообще отказаться от реализации этого метода в классе Star, будет использоваться унаследованный из предка. 3. Я не передаю в конструктор планеты начальный угол, пусть все планеты начинают вращение с одним углом (хотя, есть и другие варианты), но я передаю ΔAngle, на который изменяется угол каждую итерацию. Это дает возможность элементарно реализовать не то что разные скорости вращения, а практически реальные, то, что есть на самом деле в Солнечной системе. Просто делишь те самые 360 градусов, которые предстоит пройти планете на ее реальный период обращения в сутках, и получаешь то, что получаешь, я добавил Марс для примера - он, как и положено, вращается один раз, пока Земля делает почти два оборота. Теперь ты понимаешь, зачем я уточнил, что лучше сделать угол вещественным? ![]() 4. Что касается Солнца - я тоже сделал так, как задумывалось изначально, чтоб вообще никакого обновления после первого показа не было. Вроде все, больше ничего не менял. Ах, да... Мне не удалось дождаться вылета программы: я раскомментировал все строки, касающиеся отображения кометы, и запустил программу. Генерация 30 (тридцати) комет при одновременном вращении двух планет - это достаточное время, чтобы вылет произошел, или надо ждать дольше? Вылета не было... Сообщение отредактировано: IUnknown - 23.07.2011 10:40 |
Account |
![]()
Сообщение
#39
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я бы все-таки сделал так: ![]() Обрати внимание на следующие вещи: 1. Все-таки, пересчет планеты я вынес в Recalc() 2. Celestial::Recalc() сделал не чисто виртуальным, а просто пустым, это дало возможность вообще отказаться от реализации этого метода в классе Star, будет использоваться унаследованный из предка. 3. Я не передаю в конструктор планеты начальный угол, пусть все планеты начинают вращение с одним углом (хотя, есть и другие варианты), но я передаю ΔAngle, на который изменяется угол каждую итерацию. Это дает возможность элементарно реализовать не то что разные скорости вращения, а практически реальные, то, что есть на самом деле в Солнечной системе. Просто делишь те самые 360 градусов, которые предстоит пройти планете на ее реальный период обращения в сутках, и получаешь то, что получаешь, я добавил Марс для примера - он, как и положено, вращается один раз, пока Земля делает почти два оборота. Теперь ты понимаешь, зачем я уточнил, что лучше сделать угол вещественным? ![]() 4. Что касается Солнца - я тоже сделал так, как задумывалось изначально, чтоб вообще никакого обновления после первого показа не было. Вроде все, больше ничего не менял. Ах, да... Мне не удалось дождаться вылета программы: я раскомментировал все строки, касающиеся отображения кометы, и запустил программу. Генерация 30 (тридцати) комет при одновременном вращении двух планет - это достаточное время, чтобы вылет произошел, или надо ждать дольше? Вылета не было... Разобрал. спасибо. По солнцу, жалко что сам не догадался (. Только не пойму вот что, в чем вот разница объявлений(присваивание 0), virtual void Show(int) = 0; Забыл еще спросить по частицам, массив размерностью определенный переменный const int parrSize = 1500; а используется только 100 ? maxParticles(100) Ну и нужен совет как дальше делать, столкновение кометы с планетами и солнцем. По поводу вылетов, происходят, может что с ОС на этом ноуте. Хочу потестировать на нетбуке, к вечеру отпишусь Сообщение отредактировано: Account - 23.07.2011 13:56 |
Account |
![]()
Сообщение
#40
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
Попробовал на нетбуке, тоже вылет, пишется Abnormal program termination.
На ноуте и нетбуке стоят WinXP Zver. Даже как то не посебе, раз у тебя все номрально, а у меня вылетает. |
![]() ![]() |
![]() |
Текстовая версия | 18.06.2025 2:34 |