Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];

Вниз

Лунный цикл   Найти похожие ветки 

 
Mozart ©   (2005-12-25 10:06) [0]

Добрый день...мне поставили задачу сделать прогу для лунного календаря... ( я занимаюсь голосовыми сервисами на bayonne) и я не могу понять алгоритма  - как меняется лунный цикл...тут читал - вроде в одном земном месяце 28 лунных в другом 29 в третьем 30 и т. д. Может кто-то знает закономерность?


 
TUser ©   (2005-12-25 10:08) [1]

1 лунный месяц - 28 дней. Вроде бы.


 
Mozart ©   (2005-12-25 10:09) [2]

да в том то и дело что вроде нет :)


 
TUser ©   (2005-12-25 10:13) [3]

Промежуток времени между двумя последовательными одинаковыми фазами Луны называется синодическим месяцем, его продолжительность 29,53 суток. Сидерический же месяц, т.е. время, за которое Луна делает один оборот вокруг Земли относительно звезд, составляет 27,3 суток.

(с) взял с диска "Открытая астрономия", говорят, что школьная программа. Так что действительно, нет.


 
Anatoly Podgoretsky ©   (2005-12-25 10:13) [4]

Mozart ©   (25.12.05 10:09) [2]
Кто тебе это сказал. Кто то управляет периодом обращения Луны?


 
Mozart ©   (2005-12-25 10:21) [5]

дело в том что я на каком то астрологическом портале листал даты по лунному календарю и увидел такие интересные вещи... - 24 лунный день = 2005-12-24 а 25 лунный день = ничему, нет такого! 26 лунный день = 2005-12-25... вот теперь сижу и думаю....:)


 
Mozart ©   (2005-12-25 10:23) [6]

Синодический цикл продолжительностью от 29,6 до 30,5 суток - это хорошо нам знакомый и привычный лунный месяц, т.е. период времени, за который Луна проходит от новолуния до новолуния. - это тоже с сайта (теперь уже дачников)...
я не понял - у нее что орбита меняется постоянно?


 
palva ©   (2005-12-25 10:24) [7]

А чего тут думать? В течение суток 2005-12-24 Луна всходила два раза.


 
Mozart ©   (2005-12-25 10:29) [8]

ну должен же быть какой - то алгоритм...наверное...иначе как строят все эти лунные календари? на каждый месяц свой?

/да, кстати пришло на ум - у меня работает сис админ (высшее физическое) так вот им на лекциях в институте говорили что луна с вероятностью 90% искусственное тело - типа не может космический объект быть направлен только одной стороной к поверхности планеты, это может быть излучатель или наблюдатель :)


 
palva ©   (2005-12-25 10:30) [9]

Да, продолжительность синодического месяца меняется. В среднем он равен, как вы написали выше. Но на него влияет движение Солнца (по Копернику - движение Земли вокруг Солнца), а это движение неравномерно, поскольку орбита Земли не круговая а эллиптическая. Продолжительность сидерического месяца по идее меняться не должна, если не учитывать тонких эффектов.


 
VirEx ©   (2005-12-25 12:00) [10]

sunproject.dpr
-------------------------------------------------------------------------------
program sunproject;

uses

Forms,
main in "main.pas" {Sun};

{$R *.RES}

begin

Application.Initialize;
Application.Title := "Sun";
Application.CreateForm(TSun, Sun);
Application.Run;
end.  

main.dfm

--------------------------------------------------------------------------------
   object Sun: TSun

Left = 210
Top = 106
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = "Sun"
ClientHeight = 257
ClientWidth = 299
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
OldCreateOrder = False
Position = poDesktopCenter
OnCreate = CreateForm
PixelsPerInch = 96
TextHeight = 13
object GroupBoxInput: TGroupBox
Left = 4
Top = 4
Width = 173
Height = 93
Caption = " Ввод "
TabOrder = 0
object LabelLongitude: TLabel
Left = 35
Top = 44
Width = 78
Height = 13
Alignment = taRightJustify
Caption = "Долгота (град):"
end
object LabelTimeZone: TLabel
Left = 13
Top = 68
Width = 100
Height = 13
Alignment = taRightJustify
Caption = "Часовая зона (час):"
end
object LabelAtitude: TLabel
Left = 40
Top = 20
Width = 73
Height = 13
Alignment = taRightJustify
Caption = "Широта (град):"
end
object EditB5: TEdit
Tag = 1
Left = 120
Top = 16
Width = 37
Height = 21
TabOrder = 0
Text = "0"
end
object EditL5: TEdit
Tag = 2
Left = 120
Top = 40
Width = 37
Height = 21
TabOrder = 1
Text = "0"
end
object EditH: TEdit
Tag = 3
Left = 120
Top = 64
Width = 37
Height = 21
TabOrder = 2
Text = "0"
end
end
object GroupBoxCalendar: TGroupBox
Left = 184
Top = 4
Width = 109
Height = 93
Caption = " Календарь "
TabOrder = 1
object LabelD: TLabel
Left = 19
Top = 20
Width = 30
Height = 13
Alignment = taRightJustify
Caption = "День:"
end
object LabelM: TLabel
Left = 13
Top = 44
Width = 36
Height = 13
Alignment = taRightJustify
Caption = "Месяц:"
end
object LabelY: TLabel
Left = 28
Top = 68
Width = 21
Height = 13
Alignment = taRightJustify
Caption = "Год:"
end
object EditD: TEdit
Tag = 1
Left = 56
Top = 16
Width = 37
Height = 21
TabOrder = 0
Text = "0"
end
object EditM: TEdit
Tag = 2
Left = 56
Top = 40
Width = 37
Height = 21
TabOrder = 1
Text = "0"
end
object EditY: TEdit
Tag = 3
Left = 56
Top = 64
Width = 37
Height = 21
TabOrder = 2
Text = "0"
end
end
object ButtonCalc: TButton
Left = 12
Top = 227
Width = 169
Height = 25
Caption = "&Вычислить"
TabOrder = 2
OnClick = ButtonCalcClick
end
object ListBox: TListBox
Left = 4
Top = 104
Width = 289
Height = 117
ItemHeight = 13
TabOrder = 3
end
object ButtonClear: TButton
Left = 192
Top = 227
Width = 91
Height = 25
Caption = "&Очистить"
TabOrder = 4
OnClick = ButtonClearClick
end
end


 
VirEx ©   (2005-12-25 12:01) [11]

main.pas

--------------------------------------------------------------------------------
   {

Программа вычисляет время восхода и захода
солнца по дате (с точностью до минуты) в пределах
нескольких текущих столетий. Производит корректировку, если
географическая

точка находится в арктическом или антарктическом регионе, где заход
или восход солнца

на текущую дату может не состояться. Вводимые данные: положительная
северная широта и

отрицательная западная долгота. Часовой пояс указывается относительно
Гринвича

(например, 5 для EST и 4 для EDT). Алгоритм обсуждался в
"Sky & Telescope" за август 1994, страница 84.

}

unit main;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,

StdCtrls;

type

TSun = class(TForm)
GroupBoxInput: TGroupBox;
LabelLongitude: TLabel;
EditB5: TEdit;
EditL5: TEdit;
LabelTimeZone: TLabel;
EditH: TEdit;
GroupBoxCalendar: TGroupBox;
LabelD: TLabel;
LabelM: TLabel;
LabelY: TLabel;
EditD: TEdit;
EditM: TEdit;
EditY: TEdit;
ButtonCalc: TButton;
ListBox: TListBox;
ButtonClear: TButton;
LabelAtitude: TLabel;
procedure Calendar; // Календарь
procedure GetTimeZone; // Получение часового пояса
procedure PosOfSun; // Получаем положение солнца
procedure OutInform; // Процедура вывода информации
procedure PossibleEvents(Hour: integer); // Возможные события на
полученный час

procedure GetDate; //Получить значения даты
procedure GetInput; //Получить значения широты,...
procedure ButtonCalcClick(Sender: TObject);
procedure CreateForm(Sender: TObject);
procedure ButtonClearClick(Sender: TObject);
private
function Sgn(Value: Double): integer; // Сигнум
public
{ Public declarations }
end;

var

Sun: TSun;
st: string;
aA, aD:  array [1 .. 2] of double;
B5: integer;
L5: double;
H:  integer;
Z, Z0, Z1: double;
D:  double;
M, Y:  integer;
A5, D5, R5: double;
J3: integer;
T, T0, TT, T3: double;
L0, L2: double;
H0, H1, H2, H7, N7, D7: double;
H3, M3: integer;
M8, W8: double;
A, B, A0, D0, A2, D1, D2, DA, DD: double;
E, F, J, S, C, P, L, G, V, U, W:  double;
V0, V1, V2: double;
C0: integer;
AZ: double;

const

P2 = Pi * 2;                 // 2 * Pi
DR = Pi / 180;               // Радиан на градус
K1 = 15 * DR * 1.0027379;

implementation

{$R *.DFM}

function TSun.Sgn(Value: Double): integer;
begin

{if Value = 0 then} Result := 0;
if Value > 0 then  Result := 1;
if Value < 0 then Result := -1;
end;

procedure TSun.Calendar;
begin

G := 1;
if Y < 1583 then G := 0;
D1 := Trunc(D);
F  := D - D1 - 0.5;
J  := -Trunc(7 * (Trunc((M + 9) / 12) + Y) / 4);
if G = 1 then
begin
S  := Sgn(M - 9);
A  := Abs(M - 9);
J3 := Trunc(Y + S * Trunc(A / 7));
J3 := -Trunc((Trunc(J3 / 100) + 1) * 3 / 4);
end;
J  := J + Trunc(275 * M / 9) + D1 + G * J3;
J  := J + 1721027 + 2 * G + 367 * Y;
if F >= 0 then Exit;
F := F + 1;
J := J - 1;
end;

procedure TSun.GetTimeZone;
begin

T0 := T / 36525;
S  := 24110.5 + 8640184.813 * T0;
S  := S + 86636.6 * Z0 + 86400 * L5;
S  := S / 86400;
S  := S - Trunc(S);
T0 := S * 360 * DR;
end;

procedure TSun.PosOfSun;
begin

//      Фундаментальные константы
//  (Van Flandern & Pulkkinen, 1979)
L  := 0.779072 + 0.00273790931 * T;
G  := 0.993126 + 0.0027377785 * T;
L  := L - Trunc(L);
G  := G - Trunc(G);
L  := L * P2;
G  := G * P2;
V  := 0.39785 * Sin(L);
V  := V - 0.01000 * Sin(L - G);
V  := V + 0.00333 * Sin(L + G);
V  := V - 0.00021 * TT * Sin(L);
U  := 1 - 0.03349 * Cos(G);
U  := U - 0.00014 * Cos(2 * L);
U  := U + 0.00008 * Cos(L);
W  := -0.00010 - 0.04129 * Sin(2 * L);
W  := W + 0.03211 * Sin(G);
W  := W + 0.00104 * Sin(2 * L - G);
W  := W - 0.00035 * Sin(2 * L + G);
W  := W - 0.00008 * TT * Sin(G);

// Вычисление солнечных координат
S  := W / Sqrt(U - V * V);
A5 := L + ArcTan(S / Sqrt(1 - S * S));
S  := V / Sqrt(U);
D5 := ArcTan(S / Sqrt(1 - S * S));
R5 := 1.00021 * Sqrt(U);
end;

procedure TSun.PossibleEvents(Hour: integer);
var num: string;
begin

st  := "";
L0 := T0 + Hour * K1;
L2 := L0 + K1;
H0 := L0 - A0;
H2 := L2 - A2;
H1 := (H2 + H0) / 2; // Часовой угол,
D1 := (D2 + D0) / 2; // наклон в получасе
if Hour <= 0 then
V0 := S * Sin(D0) + C * Cos(D0) * Cos(H0) - Z;
V2 := S * Sin(D2) + C * Cos(D2) * Cos(H2) - Z;
if Sgn(V0) = Sgn(V2) then Exit;
V1 := S * Sin(D1) + C * Cos(D1) * Cos(H1) - Z;
A  := 2 * V2 - 4 * V1 + 2 * V0;
B  := 4 * V1 - 3 * V0 - V2;
D  := B * B - 4 * A * V0;
if D < 0 then Exit;
D  := Sqrt(D);
if (V0 < 0) and (V2 > 0) then st := st + "Восход солнца в ";
if (V0 < 0) and (V2 > 0) then M8 := 1;
if (V0 > 0) and (V2 < 0) then st := st + "Заход солнца в ";
if (V0 > 0) and (V2 < 0) then W8 := 1;
E  := (-B + D) / (2 * A);
if (E > 1)  or  (E < 0)  then E := (-B - D) / (2 * A);
T3 := Hour + E + 1 / 120; // Округление
H3 := Trunc(T3);
M3 := Trunc((T3 - H3) * 60);
Str(H3:2, num);
st := st + num + ":";
Str(M3:2, num);
st := st + num;
H7 := H0 + E * (H2 - H0);
N7 := -Cos(D1) * Sin(H7);
D7 := C * Sin(D1) - S * Cos(D1) * COS(H7);
AZ := ArcTan(N7 / D7) / DR;
if (D7 < 0) then AZ := AZ + 180;
if (AZ < 0) then AZ := AZ + 360;
if (AZ > 360) then AZ := AZ - 360;
Str(AZ:4:1, num);
st := st + ", азимут " + num;
end;

procedure TSun.OutInform;
begin

if (M8 = 0) and (W8 = 0) then
begin
if V2 < 0 then ListBox.Items.Add("Солнце заходит весь день ");
if V2 > 0 then ListBox.Items.Add("Солнце восходит весь день ");
end
else
begin
if M8 = 0 then ListBox.Items.Add("В этот день солнце не восходит ");
if W8 = 0 then ListBox.Items.Add("В этот день солнце не заходит ");
end;
end;

procedure TSun.GetDate;
begin

D := StrToInt(EditD.text);
M := StrToInt(EditM.text);
Y := StrToInt(EditY.text);
end;

procedure TSun.GetInput;
begin

B5 := StrToInt(EditB5.Text);
L5 := StrToInt(EditL5.Text);
H  := StrToInt(EditH.Text);
end;

procedure TSun.ButtonCalcClick(Sender: TObject);
var C0: integer;
begin

GetDate;
GetInput;
ListBox.Items.Add("Широта: "   + EditB5.Text +
" Долгота: " + EditL5.Text +
" Зона: "    + EditH.Text +
" Дата: "    + EditD.Text +
"/" + EditM.Text +
"/" + EditY.Text);
L5 := L5 / 360;
Z0 := H  / 24;
Calendar;
T  := (J - 2451545) + F;
TT := T / 36525 + 1; // TT - столетия, начиная с 1900.0
GetTimeZone; // Получение часового пояса
T  := T + Z0;
PosOfSun; // Получаем положение солнца
aA[1] := A5;
aD[1] := D5;
T  := T + 1;
PosOfSun;
aA[2] := A5;
aD[2] := D5;
if aA[2] < aA[1] then aA[2] := aA[2] + P2;
Z1 := DR * 90.833; // Вычисление зенита
S  := Sin(B5 * DR);
C  := Cos(B5 * DR);
Z  := Cos(Z1);
M8 := 0;
W8 := 0;
A0 := aA[1];
D0 := aD[1];
DA := aA[2] - aA[1];
DD := aD[2] - aD[1];
for C0 := 0 to 23 do
begin
P  := (C0 + 1) / 24;
A2 := aA[1] + P * DA;
D2 := aD[1] + P * DD;
PossibleEvents(C0);
if st <> "" then ListBox.Items.Add(st);
A0 := A2;
D0 := D2;
V0 := V2;
end;
OutInform;
ListBox.Items.Add(""); // Разделяем данные
end;

procedure TSun.CreateForm(Sender: TObject);
begin

EditD.Text := FormatDateTime("d", Date);
EditM.Text := FormatDateTime("m", Date);
EditY.Text := FormatDateTime("yyyy", Date);
end;

procedure TSun.ButtonClearClick(Sender: TObject);
begin

ListBox.Clear;
end;
end.


 
VirEx ©   (2005-12-25 12:09) [12]

эм... тут типа какого то смещения надо чтобы вычислить для Луны...)



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.035 c
2-1136524602
Paslei
2006-01-06 08:16
2006.01.22
Работа с полями MEMO


14-1135583754
Иксик
2005-12-26 10:55
2006.01.22
Кому-нибудь попадалась книга "Наносистемы" на русском?


2-1135852497
Dmitrij_K
2005-12-29 13:34
2006.01.22
Ускорение поиска файлов


4-1131548053
Igor_thief
2005-11-09 17:54
2006.01.22
Работа с реестром чужого пользователя


2-1135866498
rruussllaann
2005-12-29 17:28
2006.01.22
проблема динамического создания компонента





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский