Скелет человека
МІНІСТЕРСТВО ОСВІТИ І
НАУКИ УКРАЇНИ
ТЕРНОПІЛЬСЬКИЙ
ДЕРЖАВНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ
імені Івана
Пулюя
КУРСОВА РОБОТА
з об’єктно -
орієнтованого програмування на тему:
“Тригонометричні ефемериди
планет
Сонячної системи”
Зміст
стор.
Вступ. _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_5
1.Теоретична частина._ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ 6
2.Розробка алгоритму і структури програми._ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 16
3.Програма на мові програмування Delphi._ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 19
4.Тестування програми і результати її виконання. _ _ _ _ _ _ _ _ _ _ _ _ _ _ 45
5.Висновки. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ 46
6.Список літератури. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
47
Вступ
З давніх часів люди захоплено дивилися в нічне зоряне небо.
Ще нічого не знаючи про будову
Всесвіту , вони з ночі в ніч вели спостереження за зорями і Місяцем. Особливо
їх зацікавив небесний рух 5 яскравих зірок, які на відміну від інших міняли
своє положення і отримали за це назву – планети (aster planetes – (лат.)
блукаюча зоря).
Спостерігачі древніх цивілізацій намагалися розгадати
закони руху цих
зірок по небу. Древній грек Птоломей описав їх рух, виходячи із своєї гео-
центричної системи світу. Корінний перелом у вивченні небесної механіки
наступив в середньовіччі, коли Копернік поставив у центр світу Сонце, Кеп-
лер на основі спостережень сформулював закони руху планет по своїх орбі-
тах, а Ньютон вивів закон всесвітнього тяжіння. З тих пір астрономи почали
детально порівнювати результати спостережень із результатами обчислень.
Розвиток оптичних приладів і математичного апарату обчислень дав поштовх
до того, що результати набули високої точності. Ті незначні невідповідності
в обчисленнях заставили астрономів задуматись над їх причинами, що дало
змогу відкрити нерівномірності в русі планет, так наприклад зміщення пери-
гелію Меркурія було пояснено лише з приходом теорії відносності.
Людина завжди прагнула побачити своє майбутнє,
астрономам вдалося зазирнути у майбутнє планет. Знаючи їх початкове положення
і те, як вони ру-
хаються, вчені можуть прогнозувати їх місцезнаходження на століття вперед.
Однак вирішення цієї задачі складне, оскільки потрібно враховувати дуже ба-
гато чинників : вплив Сонця , вплив планет одна на одну, зміна елементів їх
орбіт з плином часу. До появи ЕОМ ці завдання вирішувались на папері мак-
симум з логарифмічною лінійкою , що займало місяці тяжкої праці. Навіть
незначна помилка, особливо на початку роботи, зводила всю її нанівець. Тепер
же, астрономи, за допомогою потужних ЕОМ можуть за лічені секунди обраху-
вати траєкторії руху планет, комет, астероїдів.
1. Теоретична частина
Планети Сонячної системи – це небесні тіла, які рухаються в полі
тяжіння Сонця по еліптичних орбітах і світяться відбитим сонячним промінням.
Основна відмінність планет від зірок у тому, що температури всередині планет
недостатні для перебігу там термоядерних реакцій, що в свою чергу зумовлене їх
малою масою.Крім великих планет до складу Сонячної системи входять малі планети
– астероїди. Великі планети за їх фізичними характеристиками поділяють на дві
групи: планети земної групи – Меркурій, Венера, Земля, Марс, та планети-гіганти
– Юпітер, Сатурн, Уран, Нептун. Плутон швидше належить до малих планет. Ос-
новна відмінність між цими групами в тому, що до складу планет першої групи
входять в основному важкі хімічні елементи тоді як планети-гіганти складаються
переважно з водню і гелію.
Отже уявімо, що проста людина, озброївшись
підзорною трубою чи навіть біноклем, захоче подивитися на ці планети. Перше
питання, яке в неї виникне – це куда, в яку точку неба направити свій погляд,
адже без спеціальних знань зоряних атласів виокремити планети на фоні
тисячі зірок неможливо. Для любителів астрономії і професіоналів астрономів
важливо буде знати точні координати планети, відстань до неї, кутовий діаметр,
фазу диска, видиму зоряну величину – тобто знати астрономічні ефемериди планети
.
В даній курсовій роботі складена програма на
мові Delphi, яка використовуючи
закони тригонометрії приблизно обчислює ефемериди планет і дозволяє наочно
зобразити планети на фоні зоряного неба. Слово “приблизно” означає, що існує
деяка похибка, пов’язана з слабким математичним апаратом обчислення, і ця
похибка для професіоналів була б просто катастрофічною. Адже сучасні теорії
руху планет з використанням диференціального і інтегрального обчислення, а
також сучасні обчислювальні машини дозволяють нівелювати похибку обчислення до
похибки роздільної здатності сучасних телескопів. Але хочу звернути увагу, що
кінцевими користувачами програми можуть бути прості люди і любителі астрономії,
для яких ця похибка не дуже важлива.
Отже, що таке ефемериди? Ефемериди –
це астрономічні дані про положення на небі та умови спостереження світил для
окремих або послідовних моментів часу. Ефемериди публікують у спеціальних
виданнях. Астрономічні ефемериди містять головним чином дані про координати,
відстані, фази планет.
Архімед сказав : “Дайте мені точку
опори і я переверну Землю”. Для астрономії точкою опори, здатною перевернути усю Сонячну систему, є час, а точніше
початкова точка відліку часу.
У програмі точкою відліку часу є 9 січня 1990р. Чим особлива ця дата? А
ні чим, просто у автора програми під рукою був лише “Астрономічний календар на
1990р. “ і він з нього дізнався про точні координати планет Сонячної системи
саме на цю дату. Другою проблемою, яку слід вирішити – є система відліку часу.
Те, що творилося з нашим календарем в історії для астрономів інакше як жахом
не назвеш. То спочатку був Юліанський календар потім Григоріанський, під час
переходу було втрачено 13 днів, як наслідок ми св’яткуємо старий Новий рік. Ви-
сокосні роки, 29 лютого, декретний час – все це призводить до плутанини.
В астрономії прийнято нумерувати дні.
Нумеровані дні в астрономії мають назву юліанські дні. Якщо дні нумеровані, то
спрощуються всі календарні розрахунки. Наприклад, число днів між двома датами
рівне різниці відповідних номерів дат. Це визначення і покладено в основу
системи відліку часу в нашій програмі. Єдина проблема – це розробити метод
нумерації днів в рамках нашого Григоріанського календаря.
Нумерація днів в
сучасному календарі затруднена через його неперіодичність : одні місяці мають
30 днів, інші 31, в лютому то 28, то 29 в високосному році. Як-
би в кожному місяці було 30 днів, а високосних років не було, то номер дати
можна було б визначити по формулі:
N=365
* G + 30 * (M-1) + D
де – G, M, D – рік, місяць, день дати.
Найбільші
складності в удосконалені цієї формули створює лютий. Для високосних років,
починаючи з 1 березня , потрібно враховувати додатковий день. Якби лютий був останнім
місяцем року, то по крайній мірі, ця складність зникла б. Тому в календарних
розрахунках місяць і рік доцільно перенумерувати: березень буде першим місяцем
року і т.д., а січень і лютий одинадцятим і дванадцятим місяцями попереднього
року.
Алгоритм присвоєння номера дня в рамках Григоріанського календаря буде
таким:
S:= int ( 12 – M /10 );
M:= 12 * S + M – 2 ;
G:= G – S ;
N:= 365 * G + int (G/4) – int (G/100) + int (G/400) + int (30.59 * M ) + D – 30 ;
спростимо : об’єднаємо перші два члена до int ( 365.25 * G ).
Для дат з 1900 по 2099 роки вираз N спрощується за рахунок того, що сума тре-
тього і четвертого членів за цей час не міняється і дорівнює –15. Так як в
нуме-
рації дат числа –15 і –30 тільки посувають номера всіх дат на одне і теж число,
то в розрахунках їх можна не враховувати. Щоб номера дат для CC і CCI ст. не
були занадто великими з номера року віднімемо 1900, тоді:
N:= int ( 365.25 * ( G – 1900 ) + int (
30.59* M ) + D ; (1)
Оскільки за цією
формулою 9 січня 1990 р. Має значення N:=32852,
то ми вводи-
мо його як константу точки відліку часу.
Тепер розберемося з простором.
Просторове положення планети відносно Сонця задається елементами орбіти.
Елементи орбіти – величини, які характеризують розміщення орбіти небесного тіла
в просторі, її розміри, форму, а також положення тіла на орбіті. За початок
відліку координат беруть точку весняного рівнодення - точку небесного екватора,
через яку центр диска Сонця 20(21) березня переходить з Південної півкулі неба
в Північну.
Якщо дивитися з полюса орбіти, з якого рух тіла відбувається проти руху
стрілки годинника, то точку перетину площини орбіти з площиною екліптики (
площина орбіти Землі ), в якій орбіта піднімається над площиною екліптики –
називають висхідним вузлом. Дугу від точки весняного рівнодення по великому
колі екліптики до вузла – називають довготою висхідного вузла (W, Aie ).
Дугу від точки
весняного рівнодення до точки перигелію планети ( найменша
відстань до Сонця ) – називають довготою перигелію Aap.
Розміри і форму орбіти визначають за рівнянням орбіти в полярних
координатах
де:
r – відстань від точки на
орбіті, де знаходиться планета до Сонця в а.о. ) AR ,
e – ексцентриситет орбіти (
геометрична властивість еліпса орбіти) Aeo ,
a – велика піввісь орбіти
(середня відстань від планети до Сонця в а.о. ) Aao ,
v – кут справжньої аномалії (
кут у площині орбіти від перигелію до точки на
орбіті, де перебуває планета),
оскільки v = b - Aap де:
b - геліоцентрична довгота
планети ( кут між точкою весняного рівнодення і точкою на орбіті де перебуває
планета ) AG,
отже:
або ( 2 )
Це головна формула, яка визначає рух планети по еліптичній орбіті.
Невідоми-
ми величинами тут є AG і AR: геліоцентрична довгота і
радіус-вектор – основ-
ні ефемериди планети з яких в подальшому будуть визначатися інші.
Отже перед початком роботи програми нам відомі елементи орбіти, що є
конс-
тантами, номер дати спостереження , початкові координати планети: геліоцентри-
чна довгота і радіус-вектор в початковий момент часу 9 січня 1990р. Використає-
мо 2 закон Кеплера для опису руху планети. Він говорить, що площа секторів
еліпса орбіти за одинаків проміжок часу однакова. Оскільки швидкість руху
планети по орбіті незмінна, то дуги цих секторів будуть також однакові .
S1 = S2 ; R1 = R2
Знаючи елементи орбіти можемо визначити площу всього еліпса орбіти і
поділивши на період обертання визначити площу еліпса за один день (n=1), або
за одну годину чи одну хвилину ( відповідно n=1/24, n=1/1440).
( в а.о.2
) ( 3 )
Знаючи орбітальну швидкість (км/с) можемо визначити лінійну довжину дуги
еліпса орбіти за один день ( відповідно за 1 год., за 1 хв. )
R:= vорб * 86400 / AO ( * n ) ( в а.о. ) ( 4 )
де:
86400 – кількість секунд у дні ( 60*60*24 )
AO – астрономічна одиниця
(середня відстань від Землі до Сонця)
Нам необхідно знайти j - кут переміщення планети за
n-днів.
( 5 )
(
6 )
Знайдемо довготу
на 10 січня 1990р. : b = bпоч + j . За формулою ( 2 ) визначимо
точніше r2 радіус-вектор на 10 січня 1990р.
На початку циклу обчислень ми посуваємо початковий момент на 1 день ( або
n-днів). В кінці циклу ми прирівнюємо r1:=r2 і перевіряємо чи початковий мо-
мент часу став рівним моменту спостереження.
Другим кроком програми буде знаходження видимих екваторіальних координат
планети: пряме піднесення a і схилення d. Пряме піднесення a - вимірюється від точки
весняного рівнодення вздовж небесного екватора назустріч видимому добовому
обертанню небесної сфери до кола схилень світила і вимірюється в годинній мірі
від 0 до 24h (
AA ). Схилення d - вимірюється в градусах від
небесного екватора вздовж кола схилень до світила (від–900 до+900
) ( AB ). Здавалось пряме
піднесення a легко визначити розділивши довготу AG на 15 ( 150 = 1 год. ).
Однак це було б правильно, якби Земля і планета рухалися на одній прямій від
Сонця. Насправді нам необхідно розрахувати зміщення Da скорегувавши таким чином
значення AG/15.
( 7 )
тоді AA:=a + Da/15
Схилення планет однозначно визначити не можна . Оскільки площина орбіти
планети нахилена до площини екліптики під кутом і ( Aei ) , то знаючи піднесення
АА визначимо, яке б було схилення планети якби вона рухалася по екліптиці, а
потім скорегуємо його відповідно до нахилу і на Dd.
Схилення d точки екліптики, знаючи його
піднесення a, можна визначити за формулою:
де e - кут
нахилу екліптики до небесного екватора ( 23,50 ).
Зміщення Dd можна знайти розв’язавши задачу стереометрії. Виведення
кінце-
вої формули досить велике, тому дамо остаточний результат:
( 8 )
де: a = b - W
t = l - b
g = arcsin
( sina * sini )
тоді: AB= d + Dd
Знаючи Z і R з формули ( 8 ) можемо визначити
лінійну відстань між Землею
і планетою
( 9 )
Знаючи AV і екваторіальний радіус планети
можемо визначити видимий кутовий
діаметр планети.
(
10 )
Фазу планети
визначають так:
Фаза планети – це її форма, що її
бачить спостерігач із Землі. Вона зумовлена
змінами в умовах освітленості планети Сонцем під час руху навколо нього. В ас-
трономії фазу описують числом – це відношення найбільшої ширини освітленої
частини диска планети до його діаметра.
Важливими ефемеридами планети
є умови її видимості, тобто час сходу і заходу азимути точок сходу і заходу на
горизонті.
Сходом і заходом світила – називають момент перетину світилом
математичного горизонту, коли воно переходить з невидимої півкулі в видиму і
навпаки. Годинний кут t сходу і заходу світила з координатами a і d на географічній широті j визначають з виразу:
(12)
де:
r -
рефракція на горизонті (0,590),
R – кутовий радіус світила (AYD/2),
p – горизонтальний паралакс (RЗ/(AV*AO))
Азимут А світила при сході і заході можна знайти з виразу:
(13)
Отже, нам потрібно знайти годинний кут. Годинний кут – це час, що минув з мо-
менту верхньої кульмінації. Годинний кут t визначають за місцевим зоряним ча-
сом спостерігача s і прямим
піднесенням a: t=s-a. Звідси час верхньої
кульмінації
можна знайти за умовою s=a.
оскільки: s = s0 + T0 + 0.0027*T0;
то: a = s0 + T0 * (1.0027);
T0 * (1.0027) = a - s0;
T0 = a - s0 / 1.0027 (14)
де:
s0 – місцевий зоряний час в 0h по всесвітньому часу,
T0 – час кульмінації.
Знаючи час кульмінації, додавши і
віднявши від нього годинний кут сходу і
заходу отримуємо відповідно час сходу і заходу, а далі за формулою (13) азимути
точок сходу і заходу.
Програма містить алгоритми,
які враховують особливості додавання і віднімання годинних величин, адже:
23h + 2h ¹ 25h
23h + 2h = 1h ( 25h – 24h )
2h - 3h ¹ -1h
2h - 3h =23h ( -1h + 24h )
Оскільки початкові координати планет взяті в 0h за всесвітнім часом то
кінцеві
результати також будуть відповідати йому. Щоб привести результати часових
вимірів до місцевого часу спостерігача треба врахувати географічну довготу l
місця спостереження:
Тм = Т0 - l/15 + n
Літній час зумовлює додавання ще однієї години ( n=1 літо, n=0 зима).
2. Розробка алгоритму та
структури програми.
Нижчеописана програма на мові Delphi є лише інструментом приблизного
обчислення руху планет Сонячної системи. Програма розбита на кілька структурниx
частин : Form1 ’Ефемериди планет Сонячної
системи’, Form2 ‘Обчислення ефемерид планет
Сонячної системи’, Form3
‘Огляд зоряного неба’, Form4 ‘Детальний огляд зоряного неба’.
У Form1 відображена загальна
інформація про курсову роботу. В полі Edit1 ми вводимо пароль і нажимаємо кнопку “Старт”(Button1) для запуску програми. У програмі процедура
TForm1.Button1Click порівнює правильність паролю. Якщо пароль вірний сворюється
Form2, в протилежному випадку
видається повідомлення про невірний пароль. Кнопка “Фініш”( Button2) закриває
програму.
У Form2 відбувається процес
обчислення. Першим кроком необхідно вибрати планету. Для цього у GroupBox1 зібрано 9 RadioButton. Процедури
TForm2.RadioButton1..9Click відповідають за вибір міток планет, які будуть в
подальшому використовуватись програмою в інших формах. Другим кроком ми
вибираємо дату моменту спостереження у формі день.місяць.рік. з трьох ComboBox, що зібрані в GroupBox2. Третім кроком вводимо
координати місця спостереження – широту в поле Edit1, довготу в поле Edit2, що зібрані у GroupBox3. При натискані кнопки “Help” запускається процедура
TForm2.Button4Click, яка створює інформаційне вікно про географічні координати
деяких міст України і світу. Слід врахувати що програма працює в межах від 8
січня 1990 року до 31 грудня 2099 року. Задання дат поза межами робочої зони,
не введення мітки планети , неправильне введення номера дня місяця, місяця ,
географічної широти місця спостереження вважається за помилку і виводить
програму на автоматичний вибір початкових даних.
При натисканні
кнопки “Обчислити”(Button1)
запускається весь процес обчислення. Запускається процедура Eagth1 з модуля Eagth. Необхідність введення модуля Eagth, де ми знаходимо координати Землі
відносно Сонця, зумовлена тим, що ми ведемо спостереження із Землі, внаслідок чого
ми спостерігаємо нерівномірний рух планети по небу, то він рухається, то раптом
стає і починає рухатись назад. Після цього запускається модуль Mars(для прикладу), де виконуються три
процедури.
В першій процедурі визначають геліоцентричну довготу і радіус вектор
Марса у циклі з кроком N4 днів з моменту 9.01.1990р. до
заданого моменту спостереження. Обчислення проводяться на основі 2 закону
Кеплера про рівність площ секторів еліпса орбіти за одинаків проміжок часу.
У другій процедурі визначають видимі координати Марса в заданий момент
на зоряному небі в екваторіальній системі координат. Для цього використовую-
чи дані з модуля Eagth і
процедури Mars1 розв’язують задачу
стереометрії: виз-
начають кутове зміщення Марса по прямому піднесенню від істинного і відхи-
лення схилення від площини екліптики. В процесі обчислення ми можемо виз-
начити лінійну відстань від Землі до Марса і знаючи лінійний радіус Марса мо-
жемо визначити видимий кутовий діаметр і фазу диска планети.
Третя процедура модуля Mars має більш зрозуміле значення для простого користувача програми оскільки
визначає час сходу, заходу і кульмінації Марса.
Кульмінація – це момент проходження небесного меридіана, коли планета зна-
ходиться в найвищій точці над горизонтом і має найкращі умови для спостере-
ження. Також визначається азимут точок сходу і заходу планети на горизонті.
Результати обчислення виводяться на форму як множина Label, що зібрані у GroupBox4. Кнопка Button3 запускає процедуру створення Form3.
У Form 3 на фоні зоряного неба відображається вибрана планета. У процедурі
procedure TForm3.FormCreate(Sender:
TObject); створюється фон зоряного неба через елемент Image1. Вводиться Canvas.Rectangle відовідного розміру заповняється Canvas.Brush чорним кольором і через масив координат і зоряних величин заповняється
зорями через побудову Image1.Canvas.Ellipse(x1,y1,x2,y2);
Через кнопку
“Показати” procedure SpeedButton1Click(Sender: TObject); відбувається перетворення зоряних
координат планети на пікселі відповідно масштабу Image1 і зображається сама планета відповідним кольором через
Image1.Canvas.Pen.Color і
Image1.Canvas.Ellipse(x4,y4,x5,y5);
Через кнопку
“Закрити” procedure TForm3.Button1Click(Sender: TObject); відбувається закриття форми.
Через кнопку
“Детальніше” procedure TForm3.SpeedButton2Click(Sender:
TObject); створюється Form4.
У Form4 зображається більш
детальніше фон зоряного неба. Завдяки збільшенню розмірів Image1, ми змушені використати полосу
прокрутки. Створення форми відбувається аналогічно Form3. Відмінність полягає у тому, що зображення планети миготить. Це
дозволяє наочно відрізнити планету від зірок. Досягається це в procedure TForm4.Timer1Timer(Sender: TObject);, де ми вводимо
рахівник і через порівняння чи він парний чи непарний зображення планети проявляється
то замальовується чорним кольором під колір фону.
3. Програма на мові програмування Delphi.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,Unit2, jpeg;
type
TForm1 = class(TForm)
Panel1: TPanel;
Image1: TImage;
StaticText1: TStaticText;
StaticText2: TStaticText;
StaticText3: TStaticText;
StaticText4: TStaticText;
StaticText5: TStaticText;
GroupBox1: TGroupBox;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
StaticText6: TStaticText;
Image2: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender:
TObject);
var PAR : string;
begin
PAR:=Edit1.Text;
If PAR='orion 17' Then
begin
Form2:=TForm2.Create(Application);
Form2.ShowModal;
Form2.Free;
Edit1.Clear;
end
else
begin
if MessageDlg('Пароль невірний! Значення " '+Edit1.Text+' " не є
паролем! Зверніться до розробника',
mtError,[mbOK],0)=mrOK then
Edit1.Clear;
end;
end;
procedure TForm1.Button2Click(Sender:
TObject);
begin
close;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Picture.LoadFromFile('star.jpg');
Image2.Picture.LoadFromFile('star2.jpg');
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,Math,
Dialogs, StdCtrls,
ExtCtrls,Unit3,KonstPLN,Eagth,Mars,Jupiter,Saturn,Mercury,
Venus,Uran,Neptun,Pluton, Common,Unit4;
type
TForm2 = class(TForm)
Panel1: TPanel;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
GroupBox3: TGroupBox;
GroupBox4: TGroupBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Image1: TImage;
Image2: TImage;
RadioButton1: TRadioButton;
---------------------------
RadioButton9: TRadioButton;
StaticText1: TStaticText;
----------------------------
StaticText5: TStaticText;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
ComboBox3: TComboBox;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
---------------------------
Label46: TLabel;
procedure RadioButton1Click(Sender:
TObject);
----------------------------------------------
procedure RadioButton9Click(Sender:
TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
Form3: TForm3;
PLN,D0,M0,R0,i,DR,n : integer;
FI,LB,k,S0,P0,RM,
ED,EG,ER,ER0,ESD,EH,ER1,EGD,
AD,AG,AR,x,AR0,ASD,AH,AR1,AGD,
AAD1,ARS,AZE,AZP,
ABD,AV,AYD,AYDS,AAD0,AAD,AA,AAM,AAS,AID1,AID2,AID,AB,ABM,AF, AT1,ATK,ATKL,
ATKLM,AP,AT2,AT3,ATG,ATS,ATSL,ATSLM,ATZ,ATZL,ATZLM,AZ,AAH,ABG,ATKLH,
ATSLH,ATZLH :real;
implementation
{$R *.dfm}
procedure TForm2.Button4Click(Sender:
TObject);
begin
MessageDlg('Інформація! Деякі географічні координати:'+#13+'Чортків FI=49.03, LB=25.83'+#13+'Тернопіль FI=49.6, LB=25.6'+#13+'Львів FI=49.8, LB=24'+#13+'Київ FI=50.5, LB=30.5'+#13+'Лондон(Грінвіч) FI=51.6, LB=0'
,mtInformation,[mbOK],0);
end;
procedure TForm2.Button3Click(Sender:
TObject);
begin
close;
end;
procedure TForm2.RadioButton1Click(Sender:
TObject);
begin
PLN:=1;ZPL:=1; ZPL1:=1;
Image1.Picture.LoadFromFile('mercury.jpg');
end;
------------------------------------------------------
procedure TForm2.RadioButton9Click(Sender:
TObject);
begin
PLN:=9; ZPL:=9; ZPL1:=9;
Image1.Picture.LoadFromFile('pluton.jpg');
end;
procedure TForm2.FormCreate(Sender:
TObject);
begin
Image1.Picture.LoadFromFile('star1.jpg');
Image2.Picture.LoadFromFile('sun.bmp');
ComboBox1.ItemIndex:=8;
ComboBox2.ItemIndex:=0;
ComboBox3.ItemIndex:=0;
Label4.Visible:=false;
----------------------
Label46.Visible:=false;
Button2.Enabled:=false;
end;
procedure TForm2.Button1Click(Sender:
TObject);
begin
Button2.Enabled:=false;
Label4.Visible:=false;
------------------------
Label46.Visible:=false;
if PLN=0 then //захист від помилки
begin
if MessageDlg(' Ви забули вибрати планету!'+#13+'По
замовчуванню буде вибрана Земля.'
,mtError,[mbOK],0)=mrOK
then
begin
RadioButton3.Checked:=true;
PLN:=3;
Image1.Picture.LoadFromFile('eath.jpg');
end;
end;
D0:=StrToInt(ComboBox1.Text);
ZD:=StrToInt(ComboBox1.Text);
ZD1:=StrToInt(ComboBox1.Text);
if (D0<=0) or( D0>31)
then //захист від дурня
begin
if MessageDlg('Помилка введення номера дня місяця!'
,mtError,[mbOK],0)=mrOK
then
begin
ComboBox1.ItemIndex:=8;
D0:=StrToInt(ComboBox1.Text);
ZD:=StrToInt(ComboBox1.Text);
ZD1:=StrToInt(ComboBox1.Text);
end;
end;
if ComboBox2.ItemIndex=0 then
begin
M0:=1;ZM:=1; ZM1:=1;
end;
-----------------------------------
if ComboBox2.ItemIndex=11 then
begin
M0:=12;ZM:=12; ZM1:=12;
end;
if M0=0 then //захист від помилки
begin
if MessageDlg('Введення значення місяця цифрою недопустиме!',
mtError,[mbOK],0)=mrOK then
begin
ComboBox2.ItemIndex:=0;
M0:=1;
ZM:=1;
ZM1:=1;
end;
end;
R0:=StrToInt(ComboBox3.Text);
ZR:=StrToInt(ComboBox3.Text);
ZR1:=StrToInt(ComboBox3.Text);
if (R0<1990) or (R0>2100)
then //захист від помилки
begin
if MessageDlg('Помилка граничних меж дат спостереження
1990-2100 рр.'
,mtError,[mbOK],0)=mrOK
then
begin
ComboBox3.ItemIndex:=0;
R0:=StrToInt(ComboBox3.Text);
ZR:=StrToInt(ComboBox3.Text);
ZR1:=StrToInt(ComboBox3.Text);
end;
end;
FI:=StrToFloat(Edit1.Text);
if abs(FI)>90
then //захист від помилки
begin
if MessageDlg('Помилка введення географічної широти місця спостереження!'+#13+' Має бути в межах +-90 градусів',
mtError,[mbOK],0)=mrOK then
begin
Edit1.Text:='56';
FI:=StrToFloat(Edit1.Text);
end;
end;
LB:=StrToFloat(Edit2.Text);
if LB<0 then
begin
LB:=360+LB;
end;
i:=0;
if R0=1992 or 1996 or 2000 or 2004 or
2008 or 2012 then //високосні роки
begin
i:=1
//29 лютого
end;
case M0 of //DR номер дня
моменту спостереження
1: begin DR:=D0 ; n:=0 ;
k:=-0.040;end; //з початку року
2:
begin DR:=31+D0; n:=0;k:=-0.094;end;
3: begin DR:=59+i+D0;
n:=0;k:=-0.13;end; //n мітка пори року 0-зима,1-літо
4: begin DR:=59+i+31+D0 ;
n:=1;k:=-0.131;end;
5: begin DR:=59+i+61+D0; n:=1;k:=-0.103;end; //k середня
поправка зоряного часу
6:
begin DR:=59+i+92+D0; n:=1;k:=-0.051;end;
7: begin DR:=59+i+122+D0;
n:=1;k:=0.013;end;
8: begin DR:=59+i+153+D0;
n:=1;k:=0.073;end;
9: begin DR:=59+i+184+D0;
n:=1;k:=0.107;end;
10: begin DR:=59+i+214+D0;
n:=0;k:=0.114;end;
11: begin DR:=59+i+245+D0;
n:=0;k:=0.083;end;
12: begin DR:=59+i+275+D0;
n:=0;k:=0.028;end;
end;
S0:=int((12-M0)/10); //формула
1
P0:=int((S0*12+M0-2)*30.59+D0);
RM:=int((R0-S0-1900)*365.25+P0); //номер дати
спостереження з 1 березня 1900р.
if RM<=32851 then //захист від помилки
begin
if MessageDlg('Помилка введення дати
спостереження!'+#13+' Має бути не раніше 9 січня 1990р.',
mtError,[mbOK],0)=mrOK then
begin
ComboBox1.ItemIndex:=8;
D0:=StrToInt(ComboBox1.Text);
ComboBox2.ItemIndex:=0;
M0:=1;
ComboBox3.ItemIndex:=0;
R0:=StrToInt(ComboBox3.Text);
end;
end;
case PLN of
1: begin
Eagth1(EG,ER,ER0,ESD,EH,ER1,EGD, ED,DR);
Mercury1(AD,AG,AR,x,AR0,ASD,AH,AR1,AGD,RM,EG);
Mercury2(AAD1,ARS,AZE,AZP,ABD,AV,AYD,AYDS,AAD0,AAD,AA,AAM,AAS,AID1,AID2,AID,AB,ABM,AF,
ER,AG,EG,AR, AAH,ABG,R0);
Mercury3(AT1,ATK,ATKL,ATKLM,AP,AT2,AT3,ATG,ATS,ATSL,ATSLM,ATZ,ATZL,ATZLM,AZ,AA,EG,k,LB,
AYD,AV,FI,AB,
ATKLH,ATSLH,ATZLH,n);end; //запуск процедур в модулях
2: begin
Eagth1(EG,ER,ER0,ESD,EH,ER1,EGD, ED,DR);
Venus1(AD,AG,AR,x,AR0,ASD,AH,AR1,AGD,RM,EG);
Venus2(AAD1,ARS,AZE,AZP,ABD,AV,AYD,AYDS,AAD0,AAD,AA,AAM,AAS,AID1,AID2,AID,AB,ABM,AF,
Venus3(AT1,ATK,ATKL,ATKLM,AP,AT2,AT3,ATG,ATS,ATSL,ATSLM,ATZ,ATZL,ATZLM,AZ,AA,EG,k,LB,
AYD,AV,FI,AB,
ATKLH,ATSLH,ATZLH,n);end;
3: Eagth1(EG,ER,ER0,ESD,EH,ER1,EGD,
ED,DR);
4: begin
Eagth1(EG,ER,ER0,ESD,EH,ER1,EGD, ED,DR);
Mars1(AD,AG,AR,x,AR0,ASD,AH,AR1,AGD,RM,EG);
Mars2(AAD1,ARS,AZE,AZP,ABD,AV,AYD,AYDS,AAD0,AAD,AA,AAM,AAS,AID1,AID2,AID,AB,ABM,AF,
ER,AG,EG,AR, AAH,ABG,R0);
Mars3(AT1,ATK,ATKL,ATKLM,AP,AT2,AT3,ATG,ATS,ATSL,ATSLM,ATZ,ATZL,ATZLM,AZ,AA,EG,k,LB,
AYD,AV,FI,AB,
ATKLH,ATSLH,ATZLH,n);end;
5: begin
Eagth1(EG,ER,ER0,ESD,EH,ER1,EGD, ED,DR);
Jupiter1(AD,AG,AR,x,AR0,ASD,AH,AR1,AGD,RM,EG);
Jupiter2(AAD1,ARS,AZE,AZP,ABD,AV,AYD,AYDS,AAD0,AAD,AA,AAM,AAS,AID1,AID2,AID,AB,ABM,AF,
ER,AG,EG,AR, AAH,ABG,R0);
Jupiter3(AT1,ATK,ATKL,ATKLM,AP,AT2,AT3,ATG,ATS,ATSL,ATSLM,ATZ,ATZL,ATZLM,AZ,AA,EG,k,LB,
AYD,AV,FI,AB, ATKLH,ATSLH,ATZLH,n);end;
6: begin
Eagth1(EG,ER,ER0,ESD,EH,ER1,EGD, ED,DR);
Saturn1(AD,AG,AR,x,AR0,ASD,AH,AR1,AGD,RM,EG);
Saturn2(AAD1,ARS,AZE,AZP,ABD,AV,AYD,AYDS,AAD0,AAD,AA,AAM,AAS,AID1,AID2,AID,AB,ABM,AF,
ER,AG,EG,AR, AAH,ABG,R0);
Saturn3(AT1,ATK,ATKL,ATKLM,AP,AT2,AT3,ATG,ATS,ATSL,ATSLM,ATZ,ATZL,ATZLM,AZ,AA,EG,k,LB,
AYD,AV,FI,AB,
ATKLH,ATSLH,ATZLH,n);end;
7: begin
Eagth1(EG,ER,ER0,ESD,EH,ER1,EGD, ED,DR);
Uran1(AD,AG,AR,x,AR0,ASD,AH,AR1,AGD,RM,EG);
Uran2(AAD1,ARS,AZE,AZP,ABD,AV,AYD,AYDS,AAD0,AAD,AA,AAM,AAS,AID1,AID2,AID,AB,ABM,AF,
ER,AG,EG,AR, AAH,ABG,R0);
Uran3(AT1,ATK,ATKL,ATKLM,AP,AT2,AT3,ATG,ATS,ATSL,ATSLM,ATZ,ATZL,ATZLM,AZ,AA,EG,k,LB,
AYD,AV,FI,AB,
ATKLH,ATSLH,ATZLH,n);end;
8: begin
Eagth1(EG,ER,ER0,ESD,EH,ER1,EGD, ED,DR);
Neptun1(AD,AG,AR,x,AR0,ASD,AH,AR1,AGD,RM,EG);
Neptun2(AAD1,ARS,AZE,AZP,ABD,AV,AYD,AYDS,AAD0,AAD,AA,AAM,AAS,AID1,AID2,AID,AB,ABM,AF,
ER,AG,EG,AR, AAH,ABG,R0);
Neptun3(AT1,ATK,ATKL,ATKLM,AP,AT2,AT3,ATG,ATS,ATSL,ATSLM,ATZ,ATZL,ATZLM,AZ,AA,EG,k,LB,
AYD,AV,FI,AB,
ATKLH,ATSLH,ATZLH,n);end;
9: begin
Eagth1(EG,ER,ER0,ESD,EH,ER1,EGD, ED,DR);
Pluton1(AD,AG,AR,x,AR0,ASD,AH,AR1,AGD,RM,EG);
Pluton2(AAD1,ARS,AZE,AZP,ABD,AV,AYD,AYDS,AAD0,AAD,AA,AAM,AAS,AID1,AID2,AID,AB,ABM,AF,
ER,AG,EG,AR, AAH,ABG,R0);
Pluton3(AT1,ATK,ATKL,ATKLM,AP,AT2,AT3,ATG,ATS,ATSL,ATSLM,ATZ,ATZL,ATZLM,AZ,AA,EG,k,LB,
AYD,AV,FI,AB,
ATKLH,ATSLH,ATZLH,n);end;
end;
if PLN=3 then
begin
Label4.Visible:=true;
Label14.Visible:=true;
Label27.Visible:=true;
Label27.Caption:=FloatToStrF(EG,ffGeneral,7,3);
Label5.Visible:=true;
Label15.Visible:=true;
Label28.Visible:=true;
Label28.Caption:=FloatToStrF(ER,ffGeneral,6,3);
D0:=0;
M0:=0;
R0:=0;
end
else
begin
Label4.Visible:=true;
Label14.Visible:=true;
Label27.Visible:=true;
Label27.Caption:=FloatToStrF(AG,ffGeneral,7,3);
Label5.Visible:=true;
Label15.Visible:=true;
Label28.Visible:=true;
Label28.Caption:=FloatToStrF(AR,ffGeneral,6,3);
Label6.Visible:=true;
Label29.Visible:=true;
Label16.Visible:=true;
Label30.Visible:=true;
Label17.Visible:=true;
Label29.Caption:=FloatToStrF(AAH,ffGeneral,2,0);
Label30.Caption:=FloatToStrF(AAM,ffGeneral,4,2);
Label7.Visible:=true;
Label31.Visible:=true;
Label18.Visible:=true;
Label41.Visible:=true;
Label42.Visible:=true;
Label31.Caption:=FloatToStrF(ABG,ffGeneral,2,0);
Label41.Caption:=FloatToStrF(ABM,ffGeneral,4,2);
Label8.Visible:=true;
Label32.Visible:=true;
Label19.Visible:=true;
Label32.Caption:=FloatToStrF(AYDS,ffGeneral,3,1);
Label9.Visible:=true;
Label33.Visible:=true;
Label33.Caption:=FloatToStrF(AF,ffGeneral,3,2);
Label10.Visible:=true;
Label34.Visible:=true;
Label21.Visible:=true;
Label35.Visible:=true;
Label23.Visible:=true;
Label34.Caption:=FloatToStrF(ATSLH,ffGeneral,2,0);
Label35.Caption:=FloatToStrF(ATSLM,ffGeneral,4,2);
Label11.Visible:=true;
Label36.Visible:=true;
Label20.Visible:=true;
Label37.Visible:=true;
Label24.Visible:=true;
Label36.Caption:=FloatToStrF(ATKLH,ffGeneral,2,0);
Label37.Caption:=FloatToStrF(ATKLM,ffGeneral,4,2);
Label12.Visible:=true;
Label38.Visible:=true;
Label22.Visible:=true;
Label39.Visible:=true;
Label25.Visible:=true;
Label38.Caption:=FloatToStrF(ATZLH,ffGeneral,2,0);
Label39.Caption:=FloatToStrF(ATZLM,ffGeneral,4,2);
Label13.Visible:=true;
Label40.Visible:=true;
Label26.Visible:=true;
Label40.Caption:=FloatToStrF(AZ,ffGeneral,4,2);
if abs(int(AG-EG))<=5
then
begin
Label43.Visible:=true;
end;
Label44.Visible:=true;
Label45.Visible:=true;
Label46.Visible:=true;
Label45.Caption:=FloatToStrF(AV,ffGeneral,6,3);
ZAA:=AA;
ZAB:=AB;
ZAA1:=AA;
ZAB1:=AB;
D0:=0;
M0:=0;
R0:=0;
Button2.Enabled:=true;
end;
end;
procedure TForm2.Button2Click(Sender:
TObject);
begin
Form3:=TForm3.Create(Application);
Form3.ShowModal;
Form3.Free;
Button2.Enabled:=false;
end;
end.
unit KonstPLN;
interface
Const AO=149597870; N0=0.01; //астрономічна одиниця км
Eri=23.452295;Ari=25.2;Jri=3.1;Mri=7;Vri=3.4;Sri=26.8;
Uri=98;Nri=29;Pri=1;//нахил екватора до
екліптики
Eao=1;Aao=1.523688;Jao=5.202803;Mao=0.387099;Vao=0.723322;Sao=9.538843;
Uao=19.190978;Nao=30.070672;Pao=39.51774;//велика піввісь орбіти
Eeo=0.016738;Aeo=0.09334;Jeo=0.048387;Meo=0.20562;Veo=0.006806;Seo=0.056;
Ueo=0.0472;Neo=0.008553;Peo=0.253;//ексцентриситет орбіти
Eap=104.24375;Aap=335.7197;Jap=15.2;Map=77.31552;Vap=131.53526;Sap=86.25;
Uap=171.14;Nap=45.5;Pap=225;//довгота перигелію орбіти
Etd=365.24219;Atd=686.9797;Jtd=4332.5879;Mtd=87.9693;Vtd=224.7008;Std=10759.201;
Utd=30685.93;Ntd=60187.65;Ptd=90731.2;//період
обертання навколо Сонця дн.
Ere=6378.14;Are=3390;Jre=71492;Mre=2440;Vre=6052;Sre=60268;
Ure=24300;Nre=25000;Pre=1500;//екваторіальний радіус планети км.
Evo=29.77;Avo=24.22;Jvo=13.07;Mvo=48.89;Vvo=35;Svo=9.65;
Uvo=6.8;Nvo=5.43;Pvo=4.74;//орбітальна
швидкість планети км/с
Avy=49.966942;Jvy=40.690276;Mvy=48.450552;Vvy=76.998886;Svy=113.99442;
Uvy=74.590276;Nvy=131.95776;Pvy=109.9036;//довгота висхідного вузла орбіти
Aie=1.85;Jie=1.3069442;Mie=7.0033332;Vie=3.3938886;Sie=2.491111;
Uie=0.772777;Nie=1.7763886;Pie=17.313332;//нахил орбіти до екліптики
implementation
begin
end.
unit Eagth;
interface
Uses Math,KonstPLN;
Const ED5=9; EG5=108.6; ER5=0.9833; // початкові координати Землі 9 січня 1990р.
Procedure Eagth1(var
EG,ER,ER0,ESD,EH,ER1,EGD,ED:real;var DR:integer);
implementation
Procedure Eagth1;
begin
ED:=ED5; EG:=EG5; ER:=ER5;
ER0:=Evo*86400/AO*N0; {формула 4} //шлях проходження за N3 дні
ESD:=(PI*sqr(Eao)*sqrt(1-sqr(Eeo))/Etd)*N0;//формула 3 площа еліпса орбіти за N3дні
Repeat
ED:=ED+N0; //2 закон Кеплера
EH:=2*ESD/ER;
//радіус-вектор через N3 днів
ER1:=sqrt(sqr(EH)+sqr(ER-sqrt(abs(sqr(ER0)-sqr(EH)))));//формула 5
EGD:=arctan((1/ER1*EH)/sqrt(1-sqr(1/ER1*EH)))*180/PI;
//формула 6
EG:=EG+EGD; //кут проходу за N3 дні
while EG>=360 do
begin
EG:=EG-360
end;
ER1:=(Eao*(1-sqr(Eeo)))/(1+Eeo*cos((EG-Eap)*PI/180)); //формула 2
ER:=ER1;
Until
DR<=ED; //обчислення до моменту
спостереження
end;
end.
unit Mars;
interface
Uses KonstPLN,Eagth,Math;
Const AD5=32852; //номер дня 9 січня 1990р. з 1
березня 1900р.
AG5=235.0; AR5=1.538; //початкове положення Марса 9
січня 1990р.
Procedure
Mars1(var AD,AG,AR,x,AR0,ASD,AH,AR1,AGD,RM,EG:real);
Procedure Mars2(var
AAD1,ARS,AZE,AZP,ABD,AV,AYD,AYDS,AAD0,AAD,AA,AAM,AAS,AID1,AID2,AID,AB,
ABM,AF,
ER,AG,EG,AR,AAH,ABG:real;var R0:integer);
Procedure Mars3(var AT1,ATK,ATKL,ATKLM,AP,AT2,AT3,ATG,ATS,ATSL,ATSLM,ATZ,ATZL,ATZLM,AZ,
AA,EG,k,LB,AYD,AV,FI,AB,ATKLH,ATSLH,ATZLH:real;var n:integer);
implementation
Procedure Mars1;
begin
AD:=AD5; AG:=AG5; AR:=AR5; x:=0;
AR0:=Avo*86400/AO*N0; //формула 4 шлях проходження
за N4 дні
ASD:=(PI*sqr(Aao)*sqrt(1-sqr(Aeo))/Atd)*N0;//формула 3
площа еліпса орбіти за N4 дні
Repeat
AD:=AD+N0; //2 закон Кеплера
AH:=2*ASD/AR; //радіус-вектор через N4 дні
AR1:=sqrt(sqr(AH)+sqr(AR-sqrt(abs(sqr(AR0)-sqr(AH)))));//формула 5
AGD:=arctan((1/AR1*AH)/sqrt(1-sqr(1/AR1*AH)))*180/PI;//формула 6
AG:=AG+AGD; //кут проходу
за N4 дні
While
AG>=360 do
begin
AG:=AG-360
end;
AR1:=(Aao*(1-sqr(Aeo)))/(1+Aeo*cos((AG-Aap)*PI/180));//формула 2
AR:=AR1;
x:=x+1 //кількість циклів обчислення
Until RM<=AD;
//обчислення до моменту спостереження
end;//Mars1
Procedure Mars2;
begin
AAD1:=arctan((ER*sin((AG-EG)*PI/180))/(AR-ER*cos((AG-EG)*PI/180)))*180/PI;//зміщення прямого
ARS:=sin((AG-Avy)*PI/180)*sin(Aie*PI/180);
//піднесення, формула 7
AZE:=AR*ARS;
AZP:=sqrt(sqr(ER*sin((EG-AG)*PI/180))+sqr(AR*sqrt(1-sqr(ARS))-ER*cos((EG-AG)*PI/180)));
ABD:=arctan(AZE/AZP)*180/PI; //зміщення схилення, формула 8
AV:=sqrt(sqr(AZE)+sqr(AZP));//лінійна відстань між Землею і Марсом, формула 9
AYD:=2*arctan(Are/(AV*AO))*180/PI;//кутовий діаметр Марса, формула 10
AYDS:=AYD*3600;
AAD0:=arctan(sqrt(1-sqr((sqr(AV)+sqr(AR)-sqr(ER))/(2*AV*AR)))/((sqr(AV)+sqr(AR)-sqr(ER))/
(2*AV*AR)))*180/PI;
AAD:=sqrt(abs(sqr(AAD0)-sqr(ABD)));
If AAD1<0 then
begin
AAD:=-AAD;
end;
AA:=(AG+AAD)/15; //пряме піднесення Марса
If AA>=24 then
begin
AA:=AA-24;
end;
If AA<0 then
begin
AA:=AA+24;
end;
AAH:=int(AA);
AAM:=frac(AA)*60;
AAS:=frac(AAM)*60;
AID1:=sin((AA*15)*PI/180)*(Eri-0.00013011111*(R0-1900));//схилення точки екліптики
AID2:=arctan((sin((180-AA*15)*PI/180)*sin((Eri-0.00013011111*(R0-1900))*PI/180))/
(sqrt(1-sqr(sin((180-AA*15)*PI/180)*sin((Eri-0.00013011111*(R0-1900))*PI/180)))))*
180/PI; //те саме
другим методом
AID:=(AID1+AID2)/2; //їх
середнє значення
AB:=AID+ABD; //Схилення Марса
ABG:=int(AB);
ABM:=frac(AB)*60;
AF:=(1/2)+(cos(AAD0*PI/180)/2); //фаза диска Марса,
формула 11
end;//Mars2
Procedure Mars3;
begin
AT1:=AA-(EG/15+k);
If AT1<0 then
begin
AT1:=AT1+24;
end;
ATK:=AT1/1.002738; //час кульмінації Марса, формула 14
ATKL:=ATK-LB/15+n; //місцевий час кульмінації
if
ATKL<0 then
begin
ATKL:=ATKL+24;
end;
ATKLH:=int(ATKL); ATKLM:=frac(ATKL)*60;
AP:=90+0.59+(AYD/2)-(arctan(Ere/(AV*AO))*180/PI);
AT2:=(cos(AP*PI/180)-sin(FI*PI/180)*sin(AB*PI/180))/(cos(FI*PI/180)*cos(AB*PI/180));
AT3:=arctan(sqrt(1-sqr(AT2))/AT2)*180/PI;//годинний кут сходу і заходу Марса
if AT3<=0
then //формула 12
begin
AT3:=AT3+180;
end;
ATG:=AT3/15;
ATS:=ATK-ATG; //час сходу Марса
if
ATS<0 then
begin
ATS:=ATS+24;
end;
ATSL:=ATS-LB/15+n; //місцевий час сходу
if
ATSL<0 then
begin
ATSL:=ATSL+24;
end;
ATSLH:=int(ATSL); ATSLM:=frac(ATSL)*60;
ATZ:=ATK+ATG; //час заходу Марса
if
ATZ>=24 then
begin
ATZ:=ATZ-24;
end;
ATZL:=ATZ-LB/15+n; //місцевий час заходу
if
ATZL<0 then
begin
ATZL:=ATZL+24;
end;
ATZLH:=int(ATZL); ATZLM:=frac(ATZL)*60;
AZ:=arctan((cos(AB*PI/180)*sin(AT3*PI/180)/sin(AP*PI/180))/sqrt(1-sqr((cos(AB*PI/180)*
sin(AT3*PI/180))/sin(AP*PI/180))))*180/PI; //азимут Марса при сході і заході
if AB>0
then //формула
13
begin
AZ:=180-AZ;
end;
end;//Mars3
end.
unit Common;
interface
var
ZPL,ZD,ZM,ZR,ZPL1,ZD1,ZM1,ZR1 : integer;
ZAA,ZAB,ZAA1,ZAB1 :real;
implementation
end.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons,
Common,Math,Unit4;
type
TForm3 = class(TForm)
Image1: TImage;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
Button1: TButton;
Label1: TLabel;
-----------------------
Label31: TLabel;
StaticText1: TStaticText;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure SpeedButton1Click(Sender:
TObject);
procedure SpeedButton2Click(Sender:
TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Mas = array[1..311] of real;
var
Form3: TForm3;
ZA,ZB,ZP : Mas;
ZAG,ZBG : integer;
ZAM,ZBM,x,y,x3,y3 : real;
x4,y4,x5,y5,x0,y0,x1,y1,x2,y2 :variant;
implementation
{$R *.dfm}
var i:integer;
begin
SpeedButton2.visible:=false;
Label1.Visible:=false;
Label2.Visible:=false;
Label3.Visible:=false;
Label4.Visible:=false;
Label5.Visible:=false;
Label6.Visible:=false;
Image1.Canvas.Brush.Color:=clBlack;
Image1.Canvas.Brush.Style:=bsSolid;
Image1.Canvas.Rectangle(0,0,1010,255);
Image1.Canvas.pen.color:=clWhite;
Image1.Canvas.Moveto (0,0);
Image1.Canvas.LineTo (1000,0);
Image1.Canvas.LineTo (1000,250);
Image1.Canvas.LineTo (0,250);
Image1.Canvas.LineTo (0,0);
Image1.Canvas.MoveTo(0,139);
Image1.Canvas.LineTo (1000,139);
//ruscu
Image1.Canvas.MoveTo(1000,0);
Image1.Canvas.LineTo (1005,0);
Image1.Canvas.MoveTo(1000,28);
Image1.Canvas.LineTo (1005,28);
Image1.Canvas.MoveTo(1000,56);
Image1.Canvas.LineTo (1005,56);
Image1.Canvas.MoveTo(1000,83);
Image1.Canvas.LineTo (1005,83);
Image1.Canvas.MoveTo(1000,111);
Image1.Canvas.LineTo (1005,111);
Image1.Canvas.MoveTo(1000,139);
Image1.Canvas.LineTo (1005,139);
Image1.Canvas.MoveTo(1000,167);
Image1.Canvas.LineTo (1005,167);
Image1.Canvas.MoveTo(1000,194);
Image1.Canvas.LineTo (1005,194);
Image1.Canvas.MoveTo(1000,222);
Image1.Canvas.LineTo (1005,222);
Image1.Canvas.MoveTo(1000,250);
Image1.Canvas.LineTo (1005,250);
//ruscu
Image1.Canvas.MoveTo(1000,250);
Image1.Canvas.LineTo (1000,255);
Image1.Canvas.MoveTo(958,250);
Image1.Canvas.LineTo (958,255);
Image1.Canvas.MoveTo(917,250);
Image1.Canvas.LineTo (917,255);
Image1.Canvas.MoveTo(875,250);
Image1.Canvas.LineTo (875,255);
Image1.Canvas.MoveTo(833,250);
Image1.Canvas.LineTo (833,255);
Image1.Canvas.MoveTo(792,250);
Image1.Canvas.LineTo (792,255);
Image1.Canvas.MoveTo(750,250);
Image1.Canvas.LineTo (750,255);
Image1.Canvas.MoveTo(708,250);
Image1.Canvas.LineTo (708,255);
Image1.Canvas.MoveTo(667,250);
Image1.Canvas.LineTo (667,255);
Image1.Canvas.MoveTo(625,250);
Image1.Canvas.LineTo (625,255);
Image1.Canvas.MoveTo(583,250);
Image1.Canvas.LineTo (583,255);
Image1.Canvas.MoveTo(542,250);
Image1.Canvas.LineTo (542,255);
Image1.Canvas.MoveTo(500,250);
Image1.Canvas.LineTo (500,255);
Image1.Canvas.MoveTo(458,250);
Image1.Canvas.LineTo (458,255);
Image1.Canvas.MoveTo(417,250);
Image1.Canvas.LineTo (417,255);
Image1.Canvas.MoveTo(375,250);
Image1.Canvas.LineTo (375,255);
Image1.Canvas.MoveTo(333,250);
Image1.Canvas.LineTo (333,255);
Image1.Canvas.MoveTo(292,250);
Image1.Canvas.LineTo (292,255);
Image1.Canvas.MoveTo(250,250);
Image1.Canvas.LineTo (250,255);
Image1.Canvas.MoveTo(208,250);
Image1.Canvas.LineTo (208,255);
Image1.Canvas.MoveTo(167,250);
Image1.Canvas.LineTo (167,255);
Image1.Canvas.MoveTo(125,250);
Image1.Canvas.LineTo (125,255);
Image1.Canvas.MoveTo(83,250);
Image1.Canvas.LineTo (83,255);
Image1.Canvas.MoveTo(42,250);
Image1.Canvas.LineTo (42,255);
Image1.Canvas.MoveTo(0,250);
Image1.Canvas.LineTo (0,255);
//And
ZA[1]:=0.07; ZB[1]:=29.02; ZP[1]:=1;
ZA[2]:=1.09; ZB[2]:=35.34; ZP[2]:=1;
ZA[3]:=2.03; ZB[3]:=42.17; ZP[3]:=1;
ZA[4]:=0.38; ZB[4]:=30.48; ZP[4]:=0.5;
ZA[5]:=0.56; ZB[5]:=38.26; ZP[5]:=0.5;
ZA[6]:=1.37; ZB[6]:=48.34; ZP[6]:=0.5;
ZA[7]:=23.01; ZB[7]:=42.16; ZP[7]:=0.5;
ZA[8]:=23.47; ZB[8]:=46.24; ZP[8]:=0.5;
--------------------------------------------
//Lup
ZA[311]:=15.21; ZB[311]:=-36.13; ZP[311]:=0.5;
//ZA[]:=; ZB[]:=; ZP[]:=;
for i:=1 to 311 do
begin
ZAG:=Trunc(ZA[i]);ZAM:=frac(ZA[i])/0.6;
ZA[i]:=ZAG+ZAM;
ZBG:=Trunc(ZB[i]);ZBM:=frac(ZB[i])/0.6;
ZB[i]:=ZBG+ZBM;
if ZB[i]<=0 then
ZB[i]:=abs(ZB[i])+50
else ZB[i]:=50-ZB[i];
y:=250-(((90-ZB[i])/90)*250);
x:=((24-ZA[i])/24)*1000;
x0:=int(x);
y0:=int(y);
if ZP[i]=0.5 then
Image1.Canvas.Pixels[x0,y0]:=clWhite
else begin
Image1.Canvas.Pen.Color:=clWhite;
Image1.Canvas.Brush.Style:=bsSolid;
Image1.Canvas.Brush.Color:=clWhite;
x1:=int(x-ZP[i]);
y1:=int(y-ZP[i]);
x2:=int(x+ZP[i]);
y2:=int(y+ZP[i]);
Image1.Canvas.Ellipse(x1,y1,x2,y2);
end;
end;
end;
procedure TForm3.Button1Click(Sender:
TObject);
begin
close;
end;
procedure TForm3.SpeedButton1Click(Sender:
TObject);
begin
SpeedButton2.visible:=true;
Label1.Visible:=true;
Label2.Visible:=true;
Label3.Visible:=true;
Label4.Visible:=true;
Label5.Visible:=true;
Label6.Visible:=true;
case ZPL of
1: Label1.Caption:='Меркурій';
2: Label1.Caption:='Венеру';
4: Label1.Caption:='Марс';
5: Label1.Caption:='Юпітер';
6: Label1.Caption:='Сатурн';
7: Label1.Caption:='Уран';
8: Label1.Caption:='Нептун';
9: Label1.Caption:='Плутон';
end;
Label3.Caption:=IntToStr(ZD);
Label5.Caption:=IntToStr(ZR);
case ZM of
1: Label4.Caption:='січня';
2: Label4.Caption:='лютого';
3: Label4.Caption:='березня';
4: Label4.Caption:='квітня';
5: Label4.Caption:='травня';
6: Label4.Caption:='червня';
7: Label4.Caption:='липня';
8: Label4.Caption:='серпня';
9: Label4.Caption:='вересня';
10: Label4.Caption:='жовтня';
11: Label4.Caption:='листопада';
12: Label4.Caption:='грудня';
end;
if ZAB<=0 then
ZAB:=abs(ZAB)+50
else ZAB:=50-ZAB;
y3:=250-(((90-ZAB)/90)*250);
x3:=((24-ZAA)/24)*1000;
x4:=int(x3-2);
y4:=int(y3-2);
x5:=int(x3+2);
y5:=int(y3+2);
case ZPL of
1:Image1.Canvas.Pen.Color:=clRed;
2:Image1.Canvas.Pen.Color:=clAqua;
4:Image1.Canvas.Pen.Color:=clRed;
5:Image1.Canvas.Pen.Color:=clYellow;
6:Image1.Canvas.Pen.Color:=clLime;
7:Image1.Canvas.Pen.Color:=clGreen;
8:Image1.Canvas.Pen.Color:=clBlue;
9:Image1.Canvas.Pen.Color:=clFuchsia;
end;
Image1.Canvas.Ellipse(x4,y4,x5,y5);
end;
procedure TForm3.SpeedButton2Click(Sender:
TObject);
begin
Form4:=TForm4.Create(Application);
Form4.ShowModal;
Form4.Free;
SpeedButton2.visible:=false;
end;
end.
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons,
Common,Math;
type
TForm4 = class(TForm)
Image1: TImage;
Timer1: TTimer;
Button1: TButton;
Label1: TLabel;
-----------------------
Label32: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Mas = array[1..311] of real;
var
Form4: TForm4;
ZA,ZB,ZP : Mas;
ZAG,ZBG : integer;
ZAM,ZBM,x,y,x3,y3 : real;
x4,y4,x5,y5,x0,y0,x1,y1,x2,y2,g :variant;
implementation
{$R *.dfm}
procedure TForm4.FormCreate(Sender: TObject);
var i : integer;
begin
Timer1.Enabled:=true;
Image1.Canvas.Brush.Color:=clBlack;
Image1.Canvas.Brush.Style:=bsSolid;
Image1.Canvas.Rectangle(0,0,2020,505);
Image1.Canvas.pen.color:=clWhite;
Image1.Canvas.Moveto (0,0);
Image1.Canvas.LineTo (2000,0);
Image1.Canvas.LineTo (2000,500);
Image1.Canvas.LineTo (0,500);
Image1.Canvas.LineTo (0,0);
Image1.Canvas.MoveTo(0,278);
Image1.Canvas.LineTo (2000,278);
//ruscu
Image1.Canvas.MoveTo(2000,0);
Image1.Canvas.LineTo (2005,0);
Image1.Canvas.MoveTo(2000,56);
Image1.Canvas.LineTo (2005,56);
Image1.Canvas.MoveTo(2000,111);
Image1.Canvas.LineTo (2005,111);
Image1.Canvas.MoveTo(2000,167);
Image1.Canvas.LineTo (2005,167);
Image1.Canvas.MoveTo(2000,222);
Image1.Canvas.LineTo (2005,222);
Image1.Canvas.MoveTo(2000,278);
Image1.Canvas.LineTo (2005,278);
Image1.Canvas.MoveTo(2000,334);
Image1.Canvas.LineTo (2005,334);
Image1.Canvas.MoveTo(2000,388);
Image1.Canvas.LineTo (2005,388);
Image1.Canvas.MoveTo(2000,444);
Image1.Canvas.LineTo (2005,444);
Image1.Canvas.MoveTo(2000,500);
Image1.Canvas.LineTo (2005,500);
//ruscu
Image1.Canvas.MoveTo(2000,500);
Image1.Canvas.LineTo (2000,505);
Image1.Canvas.MoveTo(1916,500);
Image1.Canvas.LineTo (1916,505);
Image1.Canvas.MoveTo(1834,500);
Image1.Canvas.LineTo (1834,505);
Image1.Canvas.MoveTo(1750,500);
Image1.Canvas.LineTo (1750,505);
Image1.Canvas.MoveTo(1666,500);
Image1.Canvas.LineTo (1666,505);
Image1.Canvas.MoveTo(1584,500);
Image1.Canvas.LineTo (1584,505);
Image1.Canvas.MoveTo(1500,500);
Image1.Canvas.LineTo (1500,505);
Image1.Canvas.MoveTo(1416,500);
Image1.Canvas.LineTo (1416,505);
Image1.Canvas.MoveTo(1334,500);
Image1.Canvas.LineTo (1334,505);
Image1.Canvas.MoveTo(1250,500);
Image1.Canvas.LineTo (1250,505);
Image1.Canvas.MoveTo(1166,500);
Image1.Canvas.LineTo (1166,505);
Image1.Canvas.MoveTo(1084,500);
Image1.Canvas.LineTo (1084,505);
Image1.Canvas.MoveTo(1000,500);
Image1.Canvas.LineTo (1000,505);
Image1.Canvas.MoveTo(916,500);
Image1.Canvas.LineTo (916,505);
Image1.Canvas.MoveTo(834,500);
Image1.Canvas.LineTo (834,505);
Image1.Canvas.MoveTo(750,500);
Image1.Canvas.LineTo (750,505);
Image1.Canvas.MoveTo(666,500);
Image1.Canvas.LineTo (666,505);
Image1.Canvas.MoveTo(584,500);
Image1.Canvas.LineTo (584,505);
Image1.Canvas.MoveTo(500,500);
Image1.Canvas.LineTo (500,505);
Image1.Canvas.MoveTo(416,500);
Image1.Canvas.LineTo (416,505);
Image1.Canvas.MoveTo(334,500);
Image1.Canvas.LineTo (334,505);
Image1.Canvas.MoveTo(250,500);
Image1.Canvas.LineTo (250,505);
Image1.Canvas.MoveTo(166,500);
Image1.Canvas.LineTo (166,505);
Image1.Canvas.MoveTo(84,500);
Image1.Canvas.LineTo (84,505);
Image1.Canvas.MoveTo(0,500);
Image1.Canvas.LineTo (0,505);
//Image1.Canvas.TextOut(10,30,'Boo');
//And
ZA[1]:=0.07; ZB[1]:=29.02; ZP[1]:=1.5;
ZA[2]:=1.09; ZB[2]:=35.34; ZP[2]:=1.5;
ZA[3]:=2.03; ZB[3]:=42.17; ZP[3]:=1.5;
ZA[4]:=0.38; ZB[4]:=30.48; ZP[4]:=0.5;
ZA[5]:=0.56; ZB[5]:=38.26; ZP[5]:=0.5;
ZA[6]:=1.37; ZB[6]:=48.34; ZP[6]:=0.5;
ZA[7]:=23.01; ZB[7]:=42.16; ZP[7]:=0.5;
ZA[8]:=23.47; ZB[8]:=46.24; ZP[8]:=0.5;
---------------------------------------------
//Lup
ZA[311]:=15.21; ZB[311]:=-36.13;
ZP[311]:=0.5;
//ZA[]:=; ZB[]:=; ZP[]:=;
for i:=1 to 311 do
begin
ZAG:=Trunc(ZA[i]);ZAM:=frac(ZA[i])/0.6;
ZA[i]:=ZAG+ZAM;
ZBG:=Trunc(ZB[i]);ZBM:=frac(ZB[i])/0.6;
ZB[i]:=ZBG+ZBM;
if ZB[i]<=0 then
ZB[i]:=abs(ZB[i])+50
else ZB[i]:=50-ZB[i];
y:=500-(((90-ZB[i])/90)*500);
x:=((24-ZA[i])/24)*2000;
x0:=int(x);
y0:=int(y);
if ZP[i]=0.5 then
Image1.Canvas.Pixels[x0,y0]:=clWhite
else begin
Image1.Canvas.Pen.Color:=clWhite;
Image1.Canvas.Brush.Style:=bsSolid;
x1:=int(x-ZP[i]);
y1:=int(y-ZP[i]);
x2:=int(x+ZP[i]);
y2:=int(y+ZP[i]);
Image1.Canvas.Ellipse(x1,y1,x2,y2);
end;
end;
case ZPL1 of
1: Label1.Caption:='Меркурій';
2: Label1.Caption:='Венеру';
4: Label1.Caption:='Марс';
5: Label1.Caption:='Юпітер';
6: Label1.Caption:='Сатурн';
7: Label1.Caption:='Уран';
8: Label1.Caption:='Нептун';
9: Label1.Caption:='Плутон';
end;
Label3.Caption:=IntToStr(ZD1);
Label5.Caption:=IntToStr(ZR1);
case ZM1 of
1: Label4.Caption:='січня';
2: Label4.Caption:='лютого';
3: Label4.Caption:='березня';
4: Label4.Caption:='квітня';
5: Label4.Caption:='травня';
6: Label4.Caption:='червня';
7: Label4.Caption:='липня';
8: Label4.Caption:='серпня';
9: Label4.Caption:='вересня';
10: Label4.Caption:='жовтня';
11: Label4.Caption:='листопада';
12: Label4.Caption:='грудня';
end;
if ZAB1<=0 then
ZAB1:=abs(ZAB1)+50
else ZAB1:=50-ZAB1;
y3:=500-(((90-ZAB1)/90)*500);
x3:=((24-ZAA1)/24)*2000;
x4:=int(x3-2.5);
y4:=int(y3-2.5);
x5:=int(x3+2.5);
y5:=int(y3+2.5);
case ZPL1 of
1:Image1.Canvas.Pen.Color:=clRed;
2:Image1.Canvas.Pen.Color:=clAqua;
4:Image1.Canvas.Pen.Color:=clRed;
5:Image1.Canvas.Pen.Color:=clYellow;
6:Image1.Canvas.Pen.Color:=clLime;
7:Image1.Canvas.Pen.Color:=clGreen;
8:Image1.Canvas.Pen.Color:=clBlue;
9:Image1.Canvas.Pen.Color:=clFuchsia;
end;
Image1.Canvas.Ellipse(x4,y4,x5,y5);
g:=0;
end;
procedure TForm4.Button1Click(Sender:
TObject);
begin
Timer1.Enabled:=false;
close;
end;
procedure TForm4.Timer1Timer(Sender:
TObject);
begin
begin
g:=g+1;
if g div 2=5 then
begin
Image1.Canvas.Pen.Color:=clBlack;
Image1.Canvas.Brush.Style:=bsSolid;
Image1.Canvas.Brush.Color:=clBlack;
Image1.Canvas.Ellipse(x4,y4,x5,y5);
g:=0;
end
else
begin
Image1.Canvas.Brush.Style:=bsSolid;
Image1.Canvas.Brush.Color:=clWhite;
case ZPL1 of
1:Image1.Canvas.Pen.Color:=clRed;
2:Image1.Canvas.Pen.Color:=clAqua;
4:Image1.Canvas.Pen.Color:=clRed;
5:Image1.Canvas.Pen.Color:=clYellow;
6:Image1.Canvas.Pen.Color:=clLime;
7:Image1.Canvas.Pen.Color:=clGreen;
8:Image1.Canvas.Pen.Color:=clBlue;
9:Image1.Canvas.Pen.Color:=clFuchsia;
end;
Image1.Canvas.Ellipse(x4,y4,x5,y5);
end;
end;
end;
end.
4. Тестування програми і
результати її виконання.
Здійснимо
тестування програми на предмет похибки результатів від істинних
значень. Для цього візьмемо з “
Астрономического календаря за 1990 г.” ефе-
мериди Марса на 31 жовтня 1990р. Результати, які видала програма на цю да-
ту приведенні в таблиці ( l = 0h, j = 560 ):
31.10.1990р.
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
істинне
значення
|
50.3
|
1.474
|
04h49.7m
|
+22031’
|
17.0’’
|
0.96
|
17h32m
|
02h13m
|
10h49m
|
+ -1350
|
програмне
значення
|
50.3
|
1.474
|
04h55.8m
|
+22032’
|
16.9’’
|
0.96
|
17h41m
|
02h18m
|
10h56m
|
+ -134.50
|
відносна
похибка
|
0.14%
|
0.14%
|
0.5%
|
0.05%
|
0.6%
|
0%
|
0.5%
|
0.3%
|
0.5%
|
0.2%
|
5.Висновки.
Отже повернімося до першого питання простої людини:” Куди направити свій погляд, щоб
побачити якусь планету?” Найпростіша відповідь: ”В
час кульмінації планети стати обличчям на південь ( напрям небесного меридіану
) і знаючи координату схилення d (AB) обчислити кут e між горизонтом і планетою за виразом:
e = j + ( d )
де: j - (FI) географічна широта місця
спостереження, яку приблизно можна виз-
начити за атласом світу.
Програма явно “сира” – що називається “demo-версія”. Середовище Delphi дозволило спростити
зовнішній інтерфейс програми, ввід-вивід інформації. Введення графічних
компонент дозволило наочно зобразити розміщення планет на фоні зоряного неба.
Використання принципово іншого обчислювального “ ядра “ дозволить не тільки досягти більш точних результатів, але й
визначити ефемериди для інших тіл Сонячної системи: астероїдів і комет.
6.Список літератури.
1.Астрономический календарь на 1990
г. / Под. Ред. Д.Н.Пономарева. – М.:
Наука. Гл. ред. физ-мат. лит. 1989. – 336с.
2.Бронштейн В.А. Как движется Луна?
– М.: Наука. Гл. ред. физ-мат. лит.,
1990 – 208с.
3.Климишин И.А. Жемчужины звездного неба . – К.: Рад.
шк., 1988. – 206с.
4.Климишин І.А., Тельнюк-Адамчук В.В.
Шкільний астрономічний довідник
Кн. Для вчителя. – К.: Рад. шк., 1990. – 287с.
5.Романовський Т.Б. Микрокалькуляторы в рассказах и играх
– К.: Рад. шк.,
1989. – 223с.
6.Хоровитц Н. Поиски жизни в
Солнечной системе: Пер. с англ./ Под ред. и
с предисл. М.С. Крихкого. – М.: Мир, 1988. – 187с.
P.S. Не судіть надто мою необізненість в
справах астрономії, тому що формули з цієї програми виводились мною будучи 15-
літнім хлопцем, коли в школі розпочинають вчити тригонометрію. Хто зацікавився
даною програмою може звернутися на vetoo@mail.ru , я з задоволенням вишлю її вам на шару.