Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Sertik
0 / 0 / 0
Регистрация: 20.05.2011
Сообщений: 9
1

Солнечная система, проблема с вращением

31.03.2012, 01:29. Просмотров 1964. Ответов 9
Метки нет (Все метки)

Нужно сделать модель солнечной системы. Но никак не получается сделать адекватное вращение планет.
Delphi
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
unit USunSystem;
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
type
  int=integer;
  TBody=object
    x,y,r,red,g,b:int;
    Color:string;
    procedure Draw;
    procedure Clear;
    procedure Step(Rad:int);
    procedure Init(InitX,InitY,InitR,InitRed,InitG,InitB:int);
    function GetX:int;
    function GetY:int;
    function GetR:int;
    function GetRed:int;
    function GetG:int;
    function GetB:int;
  end;
 
const
  centerx=Round(601/2);  //координаты центра
  centery=Round(601/2);  //окружности
 // rad=50;                //радиус
 
var   angle:real;      //угол
//-------------------------------------
 
procedure TBody.Init(InitX,InitY,InitR,InitRed,InitG,InitB:int);
begin
  x:=InitX;
  y:=InitY;
  r:=InitR;
  red:=InitRed;
  g:=InitG;
  b:=InitB;
end;
 
procedure TBody.Draw;
begin
  Form1.Image1.Canvas.Ellipse(x,y,x+r,y+r);
  Form1.Image1.Canvas.Brush.Color:=RGB(red,g,b);
  Form1.Image1.Canvas.FloodFill((x+Round(r/2)),(y+Round(r/2)),clWhite,fsSurface);
end;
 
procedure TBody.Clear;
begin
  Form1.Image1.Canvas.Ellipse(x,y,x+r,y+r);
  Form1.Image1.Canvas.Brush.Color:=RGB(255,255,255);
  Form1.Image1.Canvas.FloodFill((x+Round(r/2)),(y+Round(r/2)),RGB(Red,g,b),fsSurface);
  Form1.Image1.Canvas.Pen.Color:=clWhite;
  Form1.Image1.Canvas.Ellipse(x,y,x+r,y+r);
  Form1.Image1.Canvas.Pen.Color:=clBlack;
end;
 
procedure TBody.Step(rad:int);
begin
  x:=centerx+Round(rad*cos(angle))-Round(r/2);
  y:=centery+Round(rad*sin(angle))-Round(r/2);
  angle:=angle+pi/(rad*2);
end;
 
function TBody.GetX:int;
begin
  GetX:=x;
end;
 
function TBody.GetY:int;
begin
  GetY:=y;
end;
 
function TBody.GetR:int;
begin
  GetR:=r;
end;
 
function TBody.GetRed:int;
begin
  GetRed:=red;
end;
 
function TBody.GetG:int;
begin
  GetG:=g;
end;
 
function TBody.GetB:int;
begin
  GetB:=b;
end;
 
//глобальные переменные
var
  Sun, Mercury, Venus{, Earth, Mars, Jupiter}: TBody;
  //Saturn, Uranus, Neptune: TBody;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  angle:=pi/2;
//координатная плоскость
  Form1.Image1.Canvas.MoveTo(Round(Image1.Height/2),0);
  Form1.Image1.Canvas.LineTo(Round(Image1.Width/2),Image1.Height);
  Form1.Image1.Canvas.MoveTo(0,Round(Image1.Height/2));
  Form1.Image1.Canvas.LineTo(Image1.Width,Round(Image1.Height/2));
//Солнце
  Sun.Init(Round(Image1.Width/2)-25,Round(Image1.Height/2)-25,50,255,255,0);
  Sun.Draw;
//Меркурий
  Mercury.Init(Round(Image1.Width/2)-5,Round(Image1.Height/2)+45,10,180,238,180);
  Mercury.Draw;
//Венера
  Venus.Init(Round(Image1.Width/2)-10,Round(Image1.Height/2)+60,20,245,245,220);
  Venus.Draw;
end;
 
//Движение Меркурия
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Mercury.Clear;
  Mercury.Step(50);
  Mercury.Draw;
end;
 
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Venus.Clear;
  Venus.Step(100);
  Venus.Draw;
end;
 
end.
Венера почему-то бежит рядом с Меркурием, хоть и интервал разный у таймеров. Помогите пожалуйста понять, в чем проблема?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2012, 01:29
Ответы с готовыми решениями:

солнечная система
прикрепляю архив с проэктом, прога рабочая, но нужно сделать, чтобы солнце тоже...

Солнечная система
Добрый день уважаемые форумчане! Для получения зачета дали задание "Модель...

Солнечная система Qt
Подскажите как реализовать солнечную систему на Qt. Может есть какие-то...

GLScene Солнечная система
Помогите пжлст. Не могу понять, как сделать, чтобы вокруг земли вращалась...

Солнечная система OpenGl
Нужна помощь. Может у кого то есть программа на OpenGl, моделирующая солнечную...

9
Lirrk
Заблокирован
31.03.2012, 02:16 2
Таймер нужен всего один, и нужно только для каждой планеты прибавлять своё приращение угловой скорости. Ну и конечно надо задать начальное расположение планет. В принципе можно задать их парад...
И вообще задайте все через таблицы. и цвета и скорости. И всё это можно вывести лишь одним проходом цикла на шаг таймера
0
Lirrk
Заблокирован
31.03.2012, 02:26 3
вот тута исходник есть. Правда реализовано отвратительно. Но работает, хотя анимация мелькает.
http://bearloga.info/?p=527
1
Sertik
0 / 0 / 0
Регистрация: 20.05.2011
Сообщений: 9
31.03.2012, 03:39  [ТС] 4
Цитата Сообщение от Lirrk Посмотреть сообщение
вот тута исходник есть. Правда реализовано отвратительно. Но работает, хотя анимация мелькает.
http://bearloga.info/?p=527
Спасибо, посмотрю.

Добавлено через 10 минут
Цитата Сообщение от Lirrk Посмотреть сообщение
Таймер нужен всего один, и нужно только для каждой планеты прибавлять своё приращение угловой скорости.
Если не сложно, можете это показать на моем коде с имеющимися уже планетами (Меркурием и Венерой)? Просто не совсем понял, как это сделать.

Не по теме:

Я с таймером немного не в ладах >_<

0
Lirrk
Заблокирован
31.03.2012, 11:28 5
Sertik,
Лень.
А вообще планеты двигаются по эллипсам а не по кругу. Это раз.
Во вторых таймер задаёт масштаб анимации и на соотношение не влияет. Он представляет только так сказать "масштаб времени" каждый тик может быть часом секундой днём неделей месяцем годом
может быть несколько секунд несколько минут и так далее.
Предположим что у нас таймер нестроен на 50 миллисекунд. то есть это 1000/50 положений в секунду.
то есть каждые 50 миллисекунд таймера соответствуют дню или другому времени
Теперь. У нас есть такое понятие как угловая скорость движения планеты. Это табличные данные из астрономического справочника. то есть это скорость движения планеты по орбите или на какой угол она ушла за определённое время.
Вот например за 1 секунду (чисто гипотетически) планета относительно центра орбиты уходит на 0.05 градусов. а таймер у нас - один день. Вычисляем сколько секунд в дне и умножаем на 0.05
На такой угол планета ушла за день. К тому углу, где планета сейчас прибавляем угол смещения и получаем новый угол положения планеты. Зная радиус орбиты, на рисунке (и соотношения радиусов. если это эллипс) вычисляем координаты положения планеты и выводим планету в нужную точку. И так для каждой планеты.
Только если у меня не изменяет память то ли у Нептуна то ли у Плутона, смещён центр орбиты.
1
duhar
60 / 43 / 6
Регистрация: 15.01.2012
Сообщений: 167
31.03.2012, 12:44 6
Цитата Сообщение от Lirrk Посмотреть сообщение
то ли у Плутона

Не по теме:

Дык он же уже не планета=) Можно его не учитывать. По-моему аж с 2005 года

0
Sertik
0 / 0 / 0
Регистрация: 20.05.2011
Сообщений: 9
31.03.2012, 14:21  [ТС] 7
Цитата Сообщение от Lirrk Посмотреть сообщение
Sertik,
К тому углу, где планета сейчас прибавляем угол смещения и получаем новый угол положения планеты. Зная радиус орбиты, на рисунке (и соотношения радиусов. если это эллипс) вычисляем координаты положения планеты и выводим планету в нужную точку.
Delphi
1
2
3
4
5
6
procedure TBody.Step(rad:int);
begin
  x:=centerx+Round(rad*cos(angle))-Round(r/2);
  y:=centery+Round(rad*sin(angle))-Round(r/2);
  angle:=angle+pi/(rad*2);
end;
А разве это не то же, что Вы написали?
0
Lirrk
Заблокирован
31.03.2012, 14:31 8
Sertik,
Только я там не то написал. Если пренибречь эллипсами, то прокатит, Но угловая скорость движения по орбите величина непостоянная. Нужно вычислять по длине орбиты и по скорости движения планеты угол смещения на данный момент времени, и тогда уже по ней вычислять координаты. Для достоверности данных нужно учитывать, например, что у Меркурия орбита качается. Что у движения каждой планеты свои особенности. Если это упустить, то даже на простой модели возникнут значительные искажения, и погрешность может достигнуть больших величин.Не говоря уже о том, что всё это должно быть привязано к реальным датам.
Так что вашему преподу надо было мозгами шевелить, прежде чем давать подобные задания.
1
Sertik
0 / 0 / 0
Регистрация: 20.05.2011
Сообщений: 9
31.03.2012, 14:59  [ТС] 9
Цитата Сообщение от Lirrk Посмотреть сообщение
Для достоверности данных нужно учитывать
Это то все понятно, но я просто пытаюсь понять (пусть даже орбиты круговые, радиусы планет и их расстояние до солнца не правильные), как и почему (на имеющемся коде) Меркурий и Венера двигаются на одной прямой, такое чувство, что они привязаны к прямой, которая вращается вокруг Солнца. У них же радиусы и углы разные даже.
Собственно, вот исходник, можете посмотреть, как они движутся.
0
Вложения
Тип файла: rar Kurs.rar (167.5 Кб, 158 просмотров)
Sertik
0 / 0 / 0
Регистрация: 20.05.2011
Сообщений: 9
31.03.2012, 18:51  [ТС] 10
Тему можно закрывать, я разобрался.
Спасибо огромное за помощь, сам бы долго думал))
0
31.03.2012, 18:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2012, 18:51

Солнечная система наша?
Я тут задумался над вопросом: А солнечная система наша? Что вы об этом думаете?

Солнечная система (с ошибкой)
Друг принес курсач не могу разобраться выдаешь ошибку( 201 ),буду очень...

Солнечная система, OpenGL
Добрый вечер! у меня есть проект солнечной системы на opengl. проблема вот в...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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