Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
greendaizer
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 70
#1

Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно - C++

16.03.2014, 17:31. Просмотров 393. Ответов 10
Метки нет (Все метки)

Программа должна симулировать движение планет в звёздной системе, она запускается, но методы isOrbitFree и Simulate работают неправильно.

Это класс старсистем, также имеются и другие классы, но с проблемой они, скорее всего, не связаны, поэтому выкладывать их не буду:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "StarSystem.h"
#include <math.h>
 
StarSystem::StarSystem()
   { systemExists = false;
    starExists = false;
    vector <Planet> planets;
};
 
void StarSystem::creating(string input)
  {
   name=input;
   systemExists = true;
  }
bool StarSystem::ifSystemExists()
  {
   if (systemExists) return true;
   else return false;
  }
 
bool StarSystem::ifStarExists()
  {
   if (starExists) return true;
   else return false;
  }
void StarSystem::addingAStar(string name)
{
 starExists=true;
 starName=name;
 
}
void StarSystem::addingAPlanet(Planet& planet, double x, double y)
{
 planets.push_back(planet);
 planet.orbit = sqrt(x*x+y*y);
}
 
bool StarSystem::isOrbitFree(double x, double y)
{
  if (x==0&&y==0) return false;
 
  if (planets.empty()) return true;
  else
  {
   for(vector<Planet>::iterator it = planets.begin();it!=planets.end();it++)
    if ((*it).orbit==sqrt(x*x+y*y)) return false;
  };
 
  return true;
}
 
 
void StarSystem::simulate(double time)
{
 
  for(vector<Planet>::iterator it = planets.begin();it!=planets.end();it++)
  {
   (*it).place.x+=(*it).orbit*cos(o);
   (*it).place.y+=(*it).orbit*sin(o);
  }
}
 
 
ostream & operator << (ostream & out, const StarSystem & system)
{
 out<<endl;
 if (!system.systemExists) out<<"You have no star system\n";
 else out<<"Your star system: "<<system.name<<endl;
 
 if (!system.starExists) out<<"You have no star\n";
 else out<<"Your star: "<<system.starName<<"; "<<"Coordinates: 0 0"<<endl;
 
 if (system.planets.empty()) out<<"You have no planets\n";
 else
  {out<<"Your planets: \n";
  for(int i=0; i<system.planets.size();i++)
   out<<system.planets[i].name<<"; "<<"Coordinates: "<<system.planets[i].place.x<<" "<<system.planets[i].place.y<<endl;
 return out;
 }
}
Проблемные методы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
bool StarSystem::isOrbitFree(double x, double y)
{
  if (x==0&&y==0) return false;
 
  if (planets.empty()) return true;
  else
  {
   for(vector<Planet>::iterator it = planets.begin();it!=planets.end();it++)
    if ((*it).orbit==sqrt(x*x+y*y)) return false;
  };
 
  return true;
}
 
 
void StarSystem::simulate(double time)
{
 
  for(vector<Planet>::iterator it = planets.begin();it!=planets.end();it++)
  {
   (*it).place.x+=(*it).orbit*cos(time);
   (*it).place.y+=(*it).orbit*sin(time);
  }
}
Первый пропускает на дополнение в систему планет с одинаковыми радиусами орбит, даже если ввести координаты (10, 0) и (0, 10), второй вообще выводит какую-то неведомую ерунду, причём в (*it).orbit на момент выполнение метода содержится набор левых цифр вперемешку с буквами.

Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2014, 17:31     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно
Посмотрите здесь:

Неправильно работают методы в классе - C++
Есть класс GameObject в котором есть виртуальный метод draw: class GameObject { public: float xpos = 0; float ypos = 0; int...

Движение 3х планет (Луна не летает вокруг земли) - C++
Пітаюсь запрограмировать движение Земли и Луны вокруг солнца, но не получается закрутить луну вокруг земли. Подскажите где может быть...

Движение 3х планет методом итераций (планеты не правильно летят) - C++
Пытаюсь смоделировать движение 3х материальных точек методом итераций, а у меня они летят вверх постоянно, либо разлетаются. Если...

Не работают методы в классе с контейнером map - C++
#include &lt;map&gt; #include &lt;iostream&gt; #include &lt;string&gt; class Superclass { map&lt;long,long&gt; a; map&lt;long,long&gt;...

Файловые потоки типа wifstream и (или) wofstream неправильно работают - C++
Друзья! Есть двустрочный файл в кодировке UTF-16LE, нужно с него считать две строки и перегнать их в другой файл. В общем, копировать таким...

Выбрать некорректные реализации, т.е. такие, которые неправильно работают с памятью - C++
Ниже даны несколько вариантов реализации оператора присваивания для класса String (допускают утечки, обращаются к освобожденной памяти,...

Почему работают методы явно не созданного объекта - C++
Привет. Беглый поиск не дал ответа на вопрос, почему работает нижеприведённый код: class SomeClass { public: ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
16.03.2014, 18:02     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно #2
Цитата Сообщение от greendaizer Посмотреть сообщение
(*it).place.x+=(*it).orbit*cos(o); (*it).place.y+=(*it).orbit*sin(o);
o глобальная переменная?

выложили бы вы проект весь..
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,186
Завершенные тесты: 1
16.03.2014, 18:05     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно #3
Цитата Сообщение от greendaizer Посмотреть сообщение
if ((*it).orbit==sqrt(x*x+y*y)) return false;
Точное сравнение для действительных чисел некорректно.
Сравнивайте с некоторой точностью
C++
1
if (  fabs(it->orbit-sqrt(x*x+y*y))<1e-10) return false;
greendaizer
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 70
16.03.2014, 18:37  [ТС]     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно #4
Это парметр, с ним всё в порядке.
Весь проект очень громоздкий и добавит путаницы

Добавлено через 32 минуты
zss, исправили этот момент, на проблемы с орбитой никуда не делись
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
16.03.2014, 18:51     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно #5
Цитата Сообщение от zss Посмотреть сообщение
if ( *fabs(it->orbit-sqrt(x*x+y*y))<1e-10) return false;
не совсем так
точность зависит от аргументов
представь что x и y это числа порядка 10 в сотой
тогда погрешность в -10 просто съестся
я где то уже приводил ссылку
сейчас не помню но погрешность рассчитывается от порядка младшего числа допустим это у
тогда примерно так
C++
1
if ( *fabs(it->orbit-sqrt(x*x+y*y))<y*1e-10) return false;
Добавлено через 7 минут
Цитата Сообщение от greendaizer Посмотреть сообщение
(*it).place.x+=(*it).orbit*cos(time);
скажи а вот так не проще будет
C++
1
it->place.x+=it->orbit*cos(time);
второе ты учитываешь что у косинуса, а равно и у синуса, аргумент радиан, а не градус
greendaizer
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 70
16.03.2014, 19:07  [ТС]     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно #6
Цитата Сообщение от ValeryS Посмотреть сообщение
скажи а вот так не проще будет
Это не то же самое?
Проблема остаётся
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
16.03.2014, 19:20     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно #7
Цитата Сообщение от greendaizer Посмотреть сообщение
Проблема остаётся
ты проверку поправил?
Цитата Сообщение от greendaizer Посмотреть сообщение
Это не то же самое?
то же самое, но со стрелками понятнее, по крайней мере, мне
greendaizer
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 70
16.03.2014, 19:45  [ТС]     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно #8
Цитата Сообщение от ValeryS Посмотреть сообщение
ты проверку поправил?
Да, проблема не в проверке, а в кривом значении поля orbit
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
16.03.2014, 19:48     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно #9
Цитата Сообщение от greendaizer Посмотреть сообщение
проблема не в проверке, а в кривом значении поля orbit
тогда оладчиком смотри где и когда появляется кривое значение
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
17.03.2014, 07:17     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно #10
Цитата Сообщение от greendaizer Посмотреть сообщение
Весь проект очень громоздкий и добавит путаницы
ну если вы его прикрепите файлом будет легче отладчиком выловить ошибку
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 08:42     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно
Еще ссылки по теме:

Почему не работают методы списка (односвязного), при вызове ф-ий? (Код прилагается) - C++
Написал такой код, для односвязного списка. И когда начал компилировать, столкнулся с проблемой : не работают методы. Ошибка в том,...

Показ на экране движения планет по орбите - C++
Собственно нужна прога которая будет показывать на экране движения планет по арбите или что то подобное.

Возникает ошибка в задаче на нахождения длинны планет - C++
Условия задачи: Дано 9 планет,посчитать длину экватора,если известен радиус планет при отладке Возникает ошибка: warning C4552: !:...

Двусвязный список планет. Упорядочить по возрастанию диаметра орбиты - C++
согласно заданию есть список объектами которого являются звезды и планеты. при сортировки по имени необходимо вывести звезду и...

программа в виде тетриса(нарды, шашки) или вращения планет по орбите - C++
Мне нужна граффическая программа в виде тетриса(нарды, шашки) или вращения планет по орбите. Кому не сложно или есть определенные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
17.03.2014, 08:42     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно #11
Цитата Сообщение от greendaizer Посмотреть сообщение
второй вообще выводит какую-то неведомую ерунду, причём в (*it).orbit на момент выполнение метода содержится набор левых цифр вперемешку с буквами.
Если я правильно понял у вас круговыt орбиты и этот код:
C++
1
2
3
4
5
6
7
8
9
void StarSystem::simulate(double time)
{
 
  for(vector<Planet>::iterator it = planets.begin();it!=planets.end();it++)
  {
   (*it).place.x+=(*it).orbit*cos(time);
   (*it).place.y+=(*it).orbit*sin(time);
  }
}
означает вычисление координат каждой из планет в определенный момент времени. Если это так то по идее нужно избавится от оператора += и просто оставить =:
C++
1
2
3
4
5
6
7
8
9
void StarSystem::simulate(double time)
{
 
  for(vector<Planet>::iterator it = planets.begin();it!=planets.end();it++)
  {
   (*it).place.x=(*it).orbit*cos(time);
   (*it).place.y=(*it).orbit*sin(time);
  }
}
Теперь общие замечания по коду.
1) Не используйте постфиксный декремент если вам не нужно старое значение переменной. Лучше использовать префиксный.
2) Вы в каждом цикле вычисляете planets.end(). Это не разумно. Введите отдельный итератор и инициализируйте его значением planets.end():
C++
1
2
3
4
5
6
    vector<Planet>::iterator end =planets.end();
    //...
  for(vector<Planet>::iterator it = planets.begin();it != end; ++it)
  {
    //...
  }
P.S. Орбиты планет все-таки не круговые, а элипптические
Yandex
Объявления
17.03.2014, 08:42     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru