Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CCC.doc
Скачиваний:
6
Добавлен:
09.08.2019
Размер:
146.43 Кб
Скачать

2. В области 2d-отображения.

Для того, чтобы отображать проекцию трассы КА на поверхность Земли необходимо сначала преобразовать координаты. Для этого создаём функцию Translate3DTo2D которая выполняет операции, обратные тем, которые использовались в функции Translate2DTo3D:

function TOrbit.Translate3DTo2D(Point3D:TPoint3D):TPoint2D;

begin

Result[2]:=arcsin(Point3D[3]/EARTH_RAD)/Pi+0.5;

Result[1]:=arccos(Point3D[1]/(cos((Result[2]-0.5)*pi)*EARTH_RAD))/(2*pi);

end;

Также добавим функцию TranslatePoint:

function TOrbit.TranslatePoint(CTime:real):TPoint3D;

var Point:Tpoint3D;

begin

Point:=GetCurrentPos(CTime);

Result[1]:=arccos(Point[1]/sqrt(sqr(Point[1])+sqr(Point[2])));

if(Point[2]>0) then

Result[1]:=Result[1]/Pi

else

Result[1]:=2-Result[1]/Pi;

Result[1]:=Result[1]-frac(CTime/SEC_PER_DAY)*2+1;

while(Result[1]<1) do Result[1]:=Result[1]+2;

while(Result[1]>1) do Result[1]:=Result[1]-2;

Result[2]:=2*ArcSin(Point[3]/sqrt(sqr(Point[1])+sqr(Point[2])+sqr(Point[3])))/Pi;

Result[3]:=0;

end;

Рисуем проекцию орбиты спутника на поверхность Земли в двумерном пространстве:

glBegin(GL_LINES);

PrevPoint[1]:=-10;

CTime:=Orbit.CurrentTime-Orbit.Period;

for q1:=0 to 500 do

begin

Cord:=Orbit.TranslatePoint(CTime);

if(abs(Cord[1]-PrevPoint[1])<1.5) then

begin

glColor4f(0,0,0,exp(-sqr((q1-100)*0.01)));

glVertex3f(PrevPoint[1],PrevPoint[2],-0.01);

glVertex3f(Cord[1],Cord[2],-0.01);

end;

PrevPoint:=Cord;

CTime:=CTime+Orbit.Period/100;

end;

glEnd;

Для того, чтобы нарисовать проекцию спутника на поверхность Земли в пространстве 2D, воспользуемся уже написанной функцией TranslatePoint:

glcolor3f(0,0,0);

glBegin(GL_TRIANGLE_STRIP);

Cord:=Orbit.TranslatePoint(Orbit.CurrentTime);

glVertex3f(Cord[1],Cord[2],-0.01);

glVertex3f(Cord[1]-0.05,Cord[2]+0.1,-0.01);

glVertex3f(Cord[1]+0.05,Cord[2]+0.1,-0.01);

end;

glEnd;

  1. Отображение текущих параметров ка.

Для отображения периода обращения КА добавим в модуле рисования в области 3D следующее:

Label45.Caption:=floattostr(Orbit.Period);

Для отображения координат и длинны радиус-вектора добавим туда же:

// Координата X

X:=round(cord[1])/1000;

Label12.Caption:=floattostr(X);

// Координата Y

Y:=round(cord[2])/1000;

Label13.Caption:=floattostr(Y);

// Координата Z

Z:=round(cord[3])/1000;

Label14.Caption:=floattostr(Z);

// Вывод радиус вектора

Rad:=round(sqrt(sqr(X)+sqr(Y)+sqr(Z)));

//Rad:=(rad-frac(rad))/1000;

Label18.Caption:=floattostr(rad);

Рассчитаем и выведем значения широты и долготы:

// Получение кординат на карте

Cord:=Orbit.TranslatePoint(Orbit.CurrentTime);

// Вычисление долготы

Longitude:=Cord[1]*180;

// Вычисление широты

Latitude:=Cord[2]*90;

Label24.Caption:=inttostr(round(Longitude));

Label26.Caption:=inttostr(round(Latitude));

Рассчитаем составляющие вектора скорости и абсолютную скорость:

//Вывод скоростей

Cord:=Orbit.GetCurrentPos(Orbit.CurrentTime);

// Расчет абсолютной скорости

Speed:=round(sqrt(EARTH_MU/(EARTH_RAD+rad*1000))*1000)/1000 ;

// Расчет скорости по осям

SpeedX:=round(Speed*Cord[1]/(Rad*1000)*1000)/1000;

SpeedY:=round(Speed*Cord[2]/(Rad*1000)*1000)/1000;

SpeedZ:=round(Speed*Cord[3]/(Rad*1000)*1000)/1000;

Label29.Caption:=floattostr(Speed);

Label32.Caption:=floattostr(SpeedX);

Label33.Caption:=floattostr(SpeedY);

Label34.Caption:=floattostr(SpeedZ);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]