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

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

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

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

16.03.2014, 17:31. Просмотров 361. Ответов 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++
C++ Показ на экране движения планет по орбите
C++ Двусвязный список планет. Упорядочить по возрастанию диаметра орбиты
Не работают методы в классе с контейнером map C++
Дана строка, содержащая число в десятичной системе исчисления. Преобразовать число в строке к восьмеричной системе. C++
C++ Почему не работают методы списка (односвязного), при вызове ф-ий? (Код прилагается)
C++ Неправильно записано
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,994
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
Модератор
Эксперт С++
 Аватар для zss
6129 / 5732 / 1854
Регистрация: 18.12.2011
Сообщений: 14,653
Завершенные тесты: 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
Модератор
6453 / 4919 / 451
Регистрация: 14.02.2011
Сообщений: 16,320
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
Модератор
6453 / 4919 / 451
Регистрация: 14.02.2011
Сообщений: 16,320
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
Модератор
6453 / 4919 / 451
Регистрация: 14.02.2011
Сообщений: 16,320
16.03.2014, 19:48     Движение планет в звёздной системе, методы isOrbitFree и Simulate работают неправильно #9
Цитата Сообщение от greendaizer Посмотреть сообщение
проблема не в проверке, а в кривом значении поля orbit
тогда оладчиком смотри где и когда появляется кривое значение
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,994
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++ Возникает ошибка в задаче на нахождения длинны планет
C++ Движение 3х планет методом итераций (планеты не правильно летят)
Движение 3х планет (Луна не летает вокруг земли) C++

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

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1780 / 1155 / 223
Регистрация: 16.05.2013
Сообщений: 3,042
Записей в блоге: 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 работают неправильно
Ответ Создать тему
Опции темы

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