Расчет посадки космического аппарата "Луна-Глоб" на Луну
Выбор места посадки космического аппарата на Луну. Поиск точек либрации. Определение видимости КА без учета лунного рельефа. Расчет угла места КА над горизонтом. Реализация алгоритма на языке С++. Разработка программы для оптимального места посадки.
Рубрика | Астрономия и космонавтика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 08.02.2017 |
Размер файла | 1,8 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
//Нахождение длины вектора по координатам.
double length(double * vect)
{double l;
l = sqrt(pow(vect[0], 2) + pow(vect[1], 2) + pow(vect[2], 2));
return l;}
//Нахождение угла между векторами
double angle(double *v1, double *v2)
{double ang;
ang = acos((v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]) / (length(v1)*length(v2)));
return ang;}
//Расчет угла места КА над горизонтом относительно точки point
//point[3] - массив координат x y z точки на поверхности Луны
//KA[3] - массив координат x y z КА
double elevation_angle(double * point, double * KA)
{double Rl,Ra,r, betta, b, gamma, g, alpha;
double R[3];
double rtd = 57.295779513082320876798161804285;
Rl = length(point);//длина вектора Rl
Ra = length(KA);//длина вектора Ra
//Вектор R
R[0] = KA[0] - point[0];
R[1] = KA[1] - point[1];
R[2] = KA[2] - point[2];
r = length(R);//длина вектора R
betta = angle(point, KA);//угол между векторами Rl и Ra
gamma = angle(R, KA);//угол между векторами R и Ra
//Перевод из радиан в градусы.
b = betta*rtd;
g = gamma*rtd;
alpha = 90 - g - b;
return alpha;}
//умножение строки на матрицу
double * str_on_matrix(double m1[3], double m2[3][3])
{double * result = (double *)malloc(3 * sizeof(double));
result[0] = m1[0] * m2[0][0] + m1[1] * m2[1][0] + m1[2] * m2[2][0];
result[1] = m1[0] * m2[0][1] + m1[1] * m2[1][1] + m1[2] * m2[2][1];
result[2] = m1[0] * m2[0][2] + m1[1] * m2[1][2] + m1[2] * m2[2][2];
return result;}
// Перевод из СК SG в СК J2000.
double * SG_to_J(double Rsg[], double dt)
{double * Rj = (double *)malloc(3 * sizeof(double));
int i, j;//i-строка, j-столбец
double T, alph, bet, w, e[13], M1[3][3], M2[3][3];
int p = 10;
double dtr = 0.017453292519943295769236905555556; // коэффициент перевода градусов в радианы
double gaml = 13.17635815; // угл. скорость вращения Луны в градусах.
dt = dt - 2415020.0;
e[0] = (125.045 - 0.0529921*dt)*dtr;
e[1] = (250.089 - 0.1059842*dt)*dtr;
e[2] = (260.008 + 13.0120009*dt)*dtr;
e[3] = (176.625 + 13.3407154*dt)*dtr;
e[4] = (357.529 + 0.9856003*dt)*dtr;
e[5] = (311.589 + 26.4057084*dt)*dtr;
e[6] = (134.963 + 13.0649930*dt)*dtr;
e[7] = (276.617 + 0.3287146*dt)*dtr;
e[8] = (34.226 + 1.7484877*dt)*dtr;
e[9] = (15.134 - 0.1589763*dt)*dtr;
e[10] = (119.743 + 0.0036096*dt)*dtr;
e[11] = (239.961 + 0.1643573*dt)*dtr;
e[12] = (25.053 + 12.9590088*dt)*dtr;
T = dt / 36525;
alph = (269.9949 + 0.0031*T - 3.8787*sin(e[0]) - 0.1204*sin(e[1]) + 0.07*sin(e[2]) - 0.0172*sin(e[3]) + 0.0072*sin(e[5]) - 0.0052*sin(e[9]) - 0.0043*sin(e[12]))*dtr;
bet = (66.5392 + 0.013*T + 1.5419*cos(e[0]) + 0.0239*cos(e[1]) - 0.0278*cos(e[2]) + 0.0068*cos(e[3]) - 0.0029*cos(e[5]) + 0.0009*cos(e[6]) + 0.0008*cos(e[9]) - 0.0009*cos(e[12]))*dtr;
w = (38.3213 + gaml*dt + gaml + dt - 1.4*(p, (-12))*pow(dt, 2) + 3.561*sin(e[0]) + 0.1208*sin(e[1]) - 0.0642*sin(e[2]) + 0.0158*sin(e[3]) + 0.0252*sin(e[4]) - 0.0066*sin(e[5]) - 0.0047*sin(e[6]) - 0.0046*sin(e[7]) + 0.0028*sin(e[8]) + 0.0052*sin(e[9]) + 0.004*sin(e[10]) + 0.0019*sin(e[11]) - 0.0044*sin(e[12]))*dtr;
M1[0][0] = -sin(alph)*cos(w) - cos(alph)*sin(bet)*sin(w);
M1[0][1] = cos(alph)*cos(w) - sin(alph)*sin(bet)*sin(w);
M1[0][2] = sin(w)*cos(bet);
M1[1][0] = sin(alph)*sin(w) - cos(alph)*sin(bet)*cos(w);
M1[1][1] = -cos(alph)*sin(w) - sin(alph)*sin(bet)*cos(w);
M1[1][2] = cos(w)*cos(bet);
M1[2][0] = cos(alph)*cos(bet);
M1[2][1] = sin(alph)*cos(bet);
M1[2][2] = sin(bet);
//Траспонирование матрицы
for (i = 0; i < 3; i++)
{for (j = 0; j < 3; j++)
{M2[i][j] = M1[j][i];}
}
Rj = str_on_matrix(Rsg, M2);
return Rj;}
int read_line(FILE * STREAM, char *line){
int i;
if (fgets(line, 256, STREAM) == NULL)
return (-1);
i = strlen(line);
while (i>0 && (line[i - 1] == '\r' || line[i - 1] == '\n')){
i--; line[i] = '\0';}
return i;}
/*Перевод из сферических в декартовы*/
void S_to_D(double sph[], double dec[])
{//широта долгота радиус
dec[0] = sph[2] * sin(sph[0])*sin(sph[1]);
dec[1] = sph[2] * cos(sph[0])*sin(sph[1]);
dec[2] = sph[2] * cos(sph[1]);}
int main()
{
setlocale(LC_ALL, "RUSSIAN");
int sch = 0, Nstr = 0;// sch-счетчик для case; Nstr-номер строки
char string[300], *pch;
//Объявление переменных
double R_Moon = 1738.57;// радиус Луны
double point[3] = { 175, 74, R_Moon };// точка на поверхности Луны
double decpoint[3] = { 0 };
double *p;
double x_sc, y_sc, z_sc;//координаты КА в СК J200
int year, month, day, hour, min, sec;
double KA[3];
char line[1024];
double JD = 0;//Юлианская дата
double ugol = 0;//угол места
double moon[3];
int npl = 10;
double Rl, Ra;//радиус Луны и расстояние до КА
double * shir, * dolg;//диапозоны по широте и долготе
char flag[10];//флаг. Если КА виден, пишет "да", если нет - "нет"
FILE * f;//f-файл, куда будем записывать
if ((f = fopen("D:\\image\\Катя\\Documents\\Visual Studio 2013\\Projects\\vidimost_bes_reliefa\\угол_места.txt", "wt")) == 0)
{printf("Ошибка!");
return 0;}
fprintf(f, " \t\t\t\t point \t\t\t\t\t\t\t\t\t\t KA J200 \t\t\t\t\t\t time \t\t\t\t угол места \t\t виден? \n");
fprintf(f, " point x \t point y \t\t point z \t\t KA J2000 x \t KA J2000 y \t KA J200 z \n");
//Переводим из сферических в декартовы
S_to_D(point, decpoint);
FILE * o;//o-файл, откуда читаемл
if ((o = fopen("D:\\image\\Катя\\Documents\\Visual Studio 2013\\Projects\\Проект 8(с файлами)\\ОРБИТА.txt", "rt")) == 0)
{printf("Ошибка!");
return 0;}
fgets(string, 300, o);
while (!feof(o))
{fgets(string, 300, o);
if (string != NULL)
{pch = strtok(string, " ");
KA[0] = atof(pch);
while (pch != NULL){
if (sch<5) pch = strtok(NULL, " ");
if ((sch>5) && (sch<9)) pch = strtok(NULL, " .");
if (sch >= 9) pch = strtok(NULL, ":");
switch (sch) {
case 0: KA[1] = atof(pch); break;
case 1: KA[2] = atof(pch); break;
case 6: day = atof(pch); break;
case 7: month = atof(pch); break;
case 8: year = atof(pch); break;
case 9: hour = atof(pch); break;
case 10: min = atof(pch); break;
case 11: sec = atof(pch); break;}
sch++;}
sch = 0;
//Переводим из UTC в Юлианскую дату
JD = DateTimeToJulDate(year, month, day, hour, min, sec);
//Переводим из SG в СК J2000
p = SG_to_J(decpoint, JD);
//Находим угол места
ugol = elevation_angle(p, KA);
//Определяем виден КА или нет.
if (ugol > 0)
{flag[0] = 'д';
flag[1] = 'а';
flag[2] = ' ';}
else
{flag[0] = 'н';
flag[1] = 'е';
flag[2] = 'т';}
fprintf(f, "%lf\t %lf\t %lf\t %15.5lf %15.5lf %15.5lf\t\t %d.%d.%d %d:%d:%d\t %15.5lf \t %5.5c%c%c \n", point[0], point[1], point[2], KA[0], KA[1], KA[2], year, month, day, hour, min, sec, ugol, flag[0], flag[1], flag[2]);
Nstr++;}}
fclose(f);
fclose(o);
return 0;}
Файл «main.cpp».
/*нахождение угла места КА и угла места высот и максимального времени виденья для заданной точки*/
#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>
#include <cstdio>
#include <conio.h>
#include <locale.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "orbita.h"
#include "moon.h"
#include "dop.h"
#define FILE_ORBIT "D:\\image\\Катя\\Documents\\Visual Studio 2013\\Projects\\vidimost_s_reliefom\\ОРБИТА.txt"
#define FILE_MOON "D:\\image\\Катя\\Desktop\\ДИПЛОМ\\Moon\\moon.txt"
#define FILE_ANGLES "D:\\image\\Катя\\Documents\\Visual Studio 2013\\Projects\\vidimost_s_reliefom\\углы.csv"
//"D:\\image\\Катя\\Documents\\Visual Studio 2013\\Projects\\vidimost_s_reliefom\\видимость.txt"
#define MoonRadius 1738.57
#define AngleStep 0.5e0
int main()
{int i, j, k;
orbita_point*KA;
int NKA;
int iO; // index of Orbit point
moon_height*MoonHeight;
double*angle_KA;
double*angle_Moon;
//Объявление переменных
double point_S[3] = { 65, 87, MoonRadius };// точка на поверхности Луны P'(lat,lon,R_Moon)
double point_J[3];
double MoonCenterSG[3];
double MoonCenterJ[3];
double vecOP[3],vecOK[3],vecN[3],vecOS[3];
double pointS_J[3],pointS_S[3];
double MatrixRotation[3][3];
double AngleNStep;
double a;
orbit_read(FILE_ORBIT, &KA, &NKA);
moon_height_read(FILE_MOON, 60, 90, 0, 360, -15520, 15520, &MoonHeight);
MoonCenterSG[0] = 0.e0;
MoonCenterSG[1] = 0.e0;
MoonCenterSG[2] = 0.e0;
angle_KA = (double*)calloc(NKA, sizeof(double));
angle_Moon = (double*)calloc(NKA, sizeof(double));
for (iO = 0; iO < NKA; iO++){
point_S[2] = MoonRadius + moon_height_get(MoonHeight, point_S[0], point_S[1]);
S_to_J(point_S, point_J, KA[iO].time);
SG_to_J(MoonCenterSG, MoonCenterJ, KA[iO].time);
for (k = 0; k < 3; k++) vecOP[k] = point_J[k] - MoonCenterJ[k];
for (k = 0; k < 3; k++) vecOK[k] = KA[iO].coords[k] - MoonCenterJ[k];
if (fabs(angle(vecOP, vecOK)) < 1.e-10){
//TODO видно, угол 90
angle_KA[iO] = 90.e0;
angle_Moon[iO] = 0.e0;
continue;}
angle_KA[iO] = elevation_angle(vecOP, vecOK);
mvector(vecOP, vecOK, vecN);
vec_norm(vecN);
AngleNStep = (int)(angle(vecOP, vecOK) / AngleStep + 1);
for (i = 1; i <= AngleNStep; i++){
matrix_rotation(vecN, i*AngleStep, MatrixRotation);
vec_on_matrix(vecOP, MatrixRotation, vecOS);
for (k = 0; k < 3; k++) pointS_J[k] = MoonCenterJ[k] + vecOS[k];
J_to_S(pointS_J, pointS_S,KA[iO].time);
pointS_S[2] = MoonRadius + moon_height_get(MoonHeight, pointS_S[0], pointS_S[1]);
S_to_J(pointS_S, pointS_J, KA[iO].time);
for (k = 0; k < 3; k++) vecOS[k] = pointS_J[k] - MoonCenterJ[k];
a = elevation_angle(vecOP, vecOS);
if (i == 1){
angle_Moon[iO] = a;
}else{
if (angle_Moon[iO] < a) angle_Moon[iO] = a;}}
printf("i=%d\tangle_KA=%g\tangle_Moon=%g\n", iO, angle_KA[iO], angle_Moon[iO]);}
setlocale(LC_ALL, "RUSSIAN");
FILE * fd;
if ((fd = fopen(FILE_ANGLES, "wt")) == 0){
printf("Can't open file Angels to write '%s'\n",FILE_ANGLES);
getch();
return 0;}
fprintf(fd, "Итерация;Дата;Время;Угол КА;Угол рельефа\n");
for (i = 0; i < NKA; i++){
fprintf(fd, "%d;%d-%d-%d;%d:%d:%d;%g;%g\n", i,
KA[i].time[0], KA[i].time[1], KA[i].time[2],
KA[i].time[3], KA[i].time[4], KA[i].time[5],
angle_KA[i], angle_Moon[i]);}
fclose(fd);
double TimeMax,Time,TimeStart,TimeFinish;
TimeMax = 0.e0;;
TimeStart = -1.e0;
for (i = 0; i < NKA; i++){
Time = DateTimeToJulDate(KA[i].time[0], KA[i].time[1], KA[i].time[2], KA[i].time[3], KA[i].time[4], KA[i].time[5]);
if (angle_KA[i] > angle_Moon[i]){
if (TimeStart < 0){
TimeStart = Time;
TimeFinish = Time;
}else{
TimeFinish = Time;}
}else{
if (TimeStart>0){
if (TimeFinish - TimeStart > TimeMax)
TimeMax = TimeFinish - TimeStart;
}else{//do nothing}
}}
if (TimeStart > 0){
if (TimeFinish - TimeStart > TimeMax)
TimeMax = TimeFinish - TimeStart;}
printf("Time max = %g days = %g sec\n", TimeMax,TimeMax*24*60*60);
getch();
return 0;}
Файл с вспомогательными программами «dop.cpp».
#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>
#include <cstdio>
#include <conio.h>
#include <locale.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "dop.h"
typedef struct{
double coord[3];
double JDtime;
}vector;
typedef struct{
double teta, fi, r;
//Получение Юлианской даты по Дате и Времени
double DateTimeToJulDate(int Year, int Month, int Day, int Hour, int Min, double Sec){ long MjdMidnight;
int b;
if (Month <= 2){ Month += 12; --Year; }
if ((10000L * Year + 100L * Month + Day) <= 15821004L)
b = -2 + ((Year + 4716) / 4) - 1179;
else
b = (Year / 400) - (Year / 100) + (Year / 4);
MjdMidnight = 365L * Year - 679004 + b + int(30.6001*(Month + 1)) + Day;
return MjdMidnight + ((Hour + Min / 60.0 + Sec / 3600.0) / 24.0) + 2400000.5;}
//Нахождение длины вектора по координатам.
double length(double * vect)
{double l;
l = sqrt(pow(vect[0], 2) + pow(vect[1], 2) + pow(vect[2], 2));
return l;}
//Скалярное произведение векторов
double skalyr(double *v1, double *v2){
return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];}
//Нахождение угла между векторами
double angle(double *v1, double *v2){
return RTD*acos(skalyr(v1, v2) / (length(v1)*length(v2)));}
//Векторное произведение векторов
void mvector(double v1[3], double v2[3],double v3[3]){
v3[0] = v1[1] * v2[2] - v1[2] * v2[1];
v3[1] = v1[2] * v2[0] - v1[0] * v2[2];
v3[2] = v1[0] * v2[1] - v1[1] * v2[0];}
//Нормировать вектор
void vec_norm(double v[3]){
double len;
len = length(v);
v[0] = v[0] / len;
v[1] = v[1] / len;
v[2] = v[2] / len;}
//Получить матрицу поворота вокруг вектора v на угол angle
void matrix_rotation(double v[3], double angle, double M[3][3]){
double cosa, sina;
double x, y, z;
cosa = cos(angle*DTR);
sina = sin(angle*DTR);
x = v[0];
y = v[1];
z = v[2];
M[0][0] = cosa + (1 - cosa)*x*x;
M[0][1] = (1 - cosa)*x*y - sina*z;
M[0][2] = (1 - cosa)*x*z + sina*y;
M[1][0] = (1-cosa)*y*x + sina*z;
M[1][1] = cosa + (1 -cosa)*y*y;
M[1][2] = (1 - cosa)*y*z - sina*x;
M[2][0] = (1-cosa)*z*x - sina*y;
M[2][1] = (1 - cosa)*z*y + sina*x;
M[2][2] = cosa+(1 - cosa)*z*z;}
//Расчет угла места
// OP - векртор в J2000 из центра Луны в точку на поверхности Луны;
// OK - вектор в J2000 из центра Луны в координаты КА на гало-орбите.
double elevation_angle(double * OP, double * OK)
{int k;
double lenOP, lenOK, lenPK, betta, gamma, alpha;
double PK[3];// вектор от точки на поверхности луны в положение КА
lenOP = length(OP);//длина вектора OP
lenOK = length(OK);//длина вектора OK
for (k = 0; k < 3; k++) PK[k] = OK[k] - OP[k];
lenPK = length(PK);//длина вектора PK
betta = angle(OP, OK);//угол между векторами OP и OK
gamma = angle(PK, OK);//угол между векторами PK и OK
alpha = 90.e0 - gamma - betta;
return alpha;}
//умножение вектора на матрицу
void vec_on_matrix(double m1[3], double m2[3][3], double m3[3]){
m3[0] = m1[0] * m2[0][0] + m1[1] * m2[0][1] + m1[2] * m2[0][2];
m3[1] = m1[0] * m2[1][0] + m1[1] * m2[1][1] + m1[2] * m2[1][2];
m3[2] = m1[0] * m2[2][0] + m1[1] * m2[2][1] + m1[2] * m2[2][2];
}
//Траспонирование матрицы
void trans_matrix(double M[3][3]){
double M2[3][3];
int i, j;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
M2[i][j] = M[j][i];
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
M[i][j] = M2[i][j];}
void martix_J_to_SG(double Rj[3], double M[3][3], int time[6]){
double dt, T, alph, bet, w, e[13];
int p = 10;
double gaml = 13.17635815;
dt = DateTimeToJulDate(time[0], time[1], time[2], time[3], time[4], time[5]) - 2415020.0;
e[0] = (125.045 - 0.0529921*dt)*DTR;
e[1] = (250.089 - 0.1059842*dt)*DTR;
e[2] = (260.008 + 13.0120009*dt)*DTR;
e[3] = (176.625 + 13.3407154*dt)*DTR;
e[4] = (357.529 + 0.9856003*dt)*DTR;
e[5] = (311.589 + 26.4057084*dt)*DTR;
e[6] = (134.963 + 13.0649930*dt)*DTR;
e[7] = (276.617 + 0.3287146*dt)*DTR;
e[8] = (34.226 + 1.7484877*dt)*DTR;
e[9] = (15.134 - 0.1589763*dt)*DTR;
e[10] = (119.743 + 0.0036096*dt)*DTR;
e[11] = (239.961 + 0.1643573*dt)*DTR;
e[12] = (25.053 + 12.9590088*dt)*DTR;
T = dt / 36525;
alph = (269.9949 + 0.0031*T - 3.8787*sin(e[0]) - 0.1204*sin(e[1]) + 0.07*sin(e[2]) - 0.0172*sin(e[3]) + 0.0072*sin(e[5]) - 0.0052*sin(e[9]) - 0.0043*sin(e[12]))*DTR;
bet = (66.5392 + 0.013*T + 1.5419*cos(e[0]) + 0.0239*cos(e[1]) - 0.0278*cos(e[2]) + 0.0068*cos(e[3]) - 0.0029*cos(e[5]) + 0.0009*cos(e[6]) + 0.0008*cos(e[9]) - 0.0009*cos(e[12]))*DTR;
w = (38.3213 + gaml*dt + gaml + dt - 1.4*(p, (-12))*pow(dt, 2) + 3.561*sin(e[0]) + 0.1208*sin(e[1]) - 0.0642*sin(e[2]) + 0.0158*sin(e[3]) + 0.0252*sin(e[4]) - 0.0066*sin(e[5]) - 0.0047*sin(e[6]) - 0.0046*sin(e[7]) + 0.0028*sin(e[8]) + 0.0052*sin(e[9]) + 0.004*sin(e[10]) + 0.0019*sin(e[11]) - 0.0044*sin(e[12]))*DTR;
M[0][0] = -sin(alph)*cos(w) - cos(alph)*sin(bet)*sin(w);
M[0][1] = cos(alph)*cos(w) - sin(alph)*sin(bet)*sin(w);
M[0][2] = sin(w)*cos(bet);
M[1][0] = sin(alph)*sin(w) - cos(alph)*sin(bet)*cos(w);
M[1][1] = -cos(alph)*sin(w) - sin(alph)*sin(bet)*cos(w);
M[1][2] = cos(w)*cos(bet);
M[2][0] = cos(alph)*cos(bet);
M[2][1] = sin(alph)*cos(bet);
M[2][2] = sin(bet);}
/*Перевод из СК SG(декартовых) в сферические*/
void SG_to_S(double dec[3], double sph[3])
{double x, y, z;
x = dec[0];
y = dec[1];
z = dec[2];
sph[0] = RTD*atan2(x, y); // lat
sph[1] = RTD*atan2(sqrt(x*x + y*y),z); // lon
sph[2] = sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2)); }
void J_to_S(double Rj[3], double Rs[3], int time[6]){
double Rsg[3];
J_to_SG(Rj, Rsg, time);
SG_to_S(Rsg, Rs);}
void S_to_J(double Rs[3], double Rj[3], int time[6]){
double Rsg[3];
S_to_SG(Rs, Rsg);
SG_to_J(Rsg, Rj, time);}
int read_line(FILE * STREAM, char *line){
int i;
if (fgets(line, 256, STREAM) == NULL)
return (-1);
i = strlen(line);
while (i>0 && (line[i - 1] == '\r' || line[i - 1] == '\n')){
i--; line[i] = '\0';}
return i;}
Файл «moon.cpp».
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "moon.h"
int moon_height_read(char*file,
double lat_min, double lat_max,
double lon_min, double lon_max,
int lat_N, int lon_N, moon_height**_Height){
FILE * fd;//o-файл, откуда читаем
int i, j, i2,j2;
double h;
moon_height*Height;
Height = (moon_height*)calloc(1, sizeof(moon_height));
Height->lat_min = lat_min;
Height->lat_max = lat_max;
Height->lon_min = lon_min;
Height->lon_max = lon_max;
Height->lat_N = abs(lat_N);
Height->lon_N = abs(lon_N);
Height->height = (double**)calloc(Height->lat_N , sizeof(double*));
for (i = 0; i < Height->lat_N;i++)
Height->height[i] = (double*)calloc(Height->lon_N, sizeof(double));
if ((fd = fopen(file, "rt")) == 0){
printf("Can't read moon file '%s'\n", file);
return 0;}
for (i = 0; i < Height->lat_N; i++){
for (j = 0; j < Height->lon_N; j++){
i2 = (lat_N < 0) ? (Height->lat_N - 1 - i) : i;
j2 = (lon_N < 0) ? (Height->lon_N - 1 - j) : j;
fscanf(fd, "%lf", &h);
Height->height[i2][j2] = h;}}
*_Height = Height;
printf("Readed file moon. Read %dx%d from lat[%lf, %lf] x lon[%lf, %lf].\n", Height->lat_N,Height->lon_N,
Height->lat_min,Height->lat_max,Height->lon_min,Height->lon_max);
fclose(fd);
return 0;}
double moon_height_get(moon_height*Height, double lat, double lon){
int iLat, iLon;
iLat = (int)(Height->lat_N * (lat - Height->lat_min) / (Height->lat_max - Height->lat_min));
if (iLat < 0) iLat = 0;
if (iLat >= Height->lat_N) iLat = Height->lat_N - 1;
iLon = (int)(Height->lon_N * (lon - Height->lon_min) / (Height->lon_max - Height->lon_min));
if (iLon < 0) iLon = 0;
if (iLon >= Height->lon_N) iLon = Height->lon_N - 1;
return Height->height[iLat][iLon];}
Файл «orbita.cpp».
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "orbita.h"
// Считать орбиту спутника
int orbit_read(char*file, orbita_point**_KA,int*_NKA){
FILE * o;//o-файл, откуда читаем
orbita_point*KA;
int NKA;
int NKA_allocated;
int sch = 0, Nstr = 0;// sch-счетчик для case; Nstr-номер строки
char string[301], *pch;
if ((o = fopen(file, "rt")) == 0){
printf("Can't read orbit file '%s'\n", file);
return 0;}
KA = 0;
NKA = 0;
NKA_allocated = 0;
//считываем координаты KA в СК J2000 и время из "ОРБИТА.txt"
// пропускаем заголовки
fgets(string, 300, o);
while (!feof(o)){
fgets(string, 300, o);
if (string != NULL){
if (NKA + 1 >= NKA_allocated){
if (NKA_allocated == 0){
NKA_allocated = 16;
KA = (orbita_point*)calloc(NKA_allocated, sizeof(orbita_point));}
else{
while (NKA + 1 >= NKA_allocated) NKA_allocated = NKA_allocated * 2;
KA = (orbita_point*)realloc(KA, NKA_allocated * sizeof(orbita_point));}}
pch = strtok(string, " ");
KA[NKA].coords[0] = atof(pch); // X
while (pch != NULL){
if (sch<5) pch = strtok(NULL, " ");
if ((sch>5) && (sch < 9)) pch = strtok(NULL, " .");
if (sch >= 9) pch = strtok(NULL, ":");
switch (sch) {
case 0: KA[NKA].coords[1] = atof(pch); break; // Y
case 1: KA[NKA].coords[2] = atof(pch); break; // Z
case 6: KA[NKA].time[2] = atoi(pch); break; // Day
case 7: KA[NKA].time[1] = atoi(pch); break; // Month
case 8: KA[NKA].time[0] = atoi(pch); break; // Year
case 9: KA[NKA].time[3] = atoi(pch); break; // Hour
case 10: KA[NKA].time[4] = atoi(pch); break; // Min
case 11: KA[NKA].time[5] = atoi(pch); break; // Sec
}
sch++;}
sch = 0;
NKA++;
Nstr++;}}
printf("Readed file orbit. Count of points %d.\n", NKA);
*_KA = KA;
*_NKA = NKA;
return 0;}
Размещено на Allbest.ru
Подобные документы
Исследование космического пространства при помощи автоматических и пилотируемых космических аппаратов. Первые экспериментальные суборбитальные космические полёты. Высадка американских астронавтов на Луну. Падение на Землю космического тела (астероида).
презентация [571,3 K], добавлен 03.02.2011Содержание программы полета космического аппарата. Стадия разработки рабочей документации и изготовления космического аппарата. Задачи управления эксплуатацией ЛК. Программа поддержания ЛК в готовности к применению, структура системы эксплуатации.
контрольная работа [179,5 K], добавлен 15.10.2010Разработка конструкции двигателей летательных аппаратов. Выбор оптимальных материалов корпуса и соплового блока на примере тормозного ракетного твердотопливного двигателя трехблочной системы посадки космического летательного аппарата "Восход" на Землю.
курсовая работа [1,9 M], добавлен 07.03.2013Обзор миссий к точкам либрации. Методы моделирования движения космического аппарата вблизи точек либрации. Моделирование орбитального движения спутника в окрестности первой точки либрации L1 системы Солнце-Земля. Осуществление непрерывной связи.
дипломная работа [2,2 M], добавлен 17.10.2016Ограниченная круговая задача трех тел и уравнения движения. Типы ограниченных орбит в окрестности точек либрации и гравитационная задача. Затенённость орбит и моделирование движения космического аппарата. Проекция долгопериодической орбиты на плоскость.
курсовая работа [3,6 M], добавлен 01.07.2017Понятие и особенности спускаемой капсулы, ее назначение и компоновка, процесс спуска с орбиты. Конструкция спускаемой капсулы, контейнер для носителя информации, корпус, теплозащитное покрытие, двигатель мягкой посадки. Размещение аппаратуры и агрегатов.
реферат [1,2 M], добавлен 31.07.2010История развития космонавтики с древнейших времен до наших дней. Работы и исследования ученых. Ранняя советская ракетно-космическая программа. Первый орбитальный полет в космос. Перелет космического аппарата с Земли на другую планету. Высадка на Луну.
презентация [5,5 M], добавлен 01.05.2014Каковы размеры Луны. Как человек изучал Луну. Почему мы видим Луну в разных формах. Как происходит лунное затмение. Наблюдения фаз Луны, ее влияние на рост растений, на самочувствие человека, на успешность обучения. Реакция учителей на фазы Луны.
реферат [279,4 K], добавлен 10.03.2013Закон всемирного тяготения и гравитационные силы. Можно ли силу, с которой Земля притягивает Луну, назвать весом Луны. Есть ли центробежная сила в системе Земля-Луна, на что она действует. Вокруг чего обращается Луна. Могут Земля и Луна столкнуться.
реферат [39,7 K], добавлен 21.03.2008Изучение факторов, действующих на организм в условиях космического полета и изменений в различных системах организма. Особенности протекания физических процессов и бытовых действий на борту космического аппарата. Подготовка космонавтов к невесомости.
реферат [682,1 K], добавлен 23.10.2013