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

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

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

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

16.03.2014, 17:31. Просмотров 396. Ответов 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 на момент выполнение метода содержится набор левых цифр вперемешку с буквами.

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

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

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

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

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

Движение планет в солнечной системе - Turbo Pascal
Добрый день. Что-то не могу сделать так, чтобы солнечная система (по заданию не полная) двигалась.. Вот задание: Напишите...

Анимация: движение спутника, движение планет - Pascal ABC
Составьте программу, которая демонстрирует: а) прямолинейное движение спутника на фоне неба и Земли; б) движение планет вокруг Солнца...

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

выложили бы вы проект весь..
0
zss
Модератор
Эксперт С++
6380 / 5945 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
16.03.2014, 18:05 #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;
0
greendaizer
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 70
16.03.2014, 18:37  [ТС] #4
Это парметр, с ним всё в порядке.
Весь проект очень громоздкий и добавит путаницы

Добавлено через 32 минуты
zss, исправили этот момент, на проблемы с орбитой никуда не делись
0
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,846
16.03.2014, 18:51 #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);
второе ты учитываешь что у косинуса, а равно и у синуса, аргумент радиан, а не градус
1
greendaizer
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 70
16.03.2014, 19:07  [ТС] #6
Цитата Сообщение от ValeryS Посмотреть сообщение
скажи а вот так не проще будет
Это не то же самое?
Проблема остаётся
0
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,846
16.03.2014, 19:20 #7
Цитата Сообщение от greendaizer Посмотреть сообщение
Проблема остаётся
ты проверку поправил?
Цитата Сообщение от greendaizer Посмотреть сообщение
Это не то же самое?
то же самое, но со стрелками понятнее, по крайней мере, мне
0
greendaizer
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 70
16.03.2014, 19:45  [ТС] #8
Цитата Сообщение от ValeryS Посмотреть сообщение
ты проверку поправил?
Да, проблема не в проверке, а в кривом значении поля orbit
0
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,846
16.03.2014, 19:48 #9
Цитата Сообщение от greendaizer Посмотреть сообщение
проблема не в проверке, а в кривом значении поля orbit
тогда оладчиком смотри где и когда появляется кривое значение
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,998
17.03.2014, 07:17 #10
Цитата Сообщение от greendaizer Посмотреть сообщение
Весь проект очень громоздкий и добавит путаницы
ну если вы его прикрепите файлом будет легче отладчиком выловить ошибку
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
17.03.2014, 08:42 #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. Орбиты планет все-таки не круговые, а элипптические
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 08:42
Привет! Вот еще темы с ответами:

Движение Планет - Delphi
Ребята, очень нуждаюсь в вашей помощи! Задание, которое мне нужно выполнить заключается в следующем: нужно реализовать движения земли, луны...

Неправильно работают счетчики - C (СИ)
счетчики неправильно считают. не могу понять, в чем дело. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main(void) { ...

Неправильно работают paddingi - HTML, CSS
Здравствуйте! Помогите, пожалуйста, очень нужно! Хочу, чтобы у блока был внутренний паддинг. div.panorama { width:...

.NET 4.x Клиент неправильно видит методы сервиса - C# WCF
Доброго времени! Столкнулся с проблемой. Работаю с VS2013Express. Создаю простое приложение Silverlight+WCF. Описываю и...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.03.2014, 08:42
Ответ Создать тему
Опции темы

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