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;
Отображение текущих параметров ка.
Для отображения периода обращения КА добавим в модуле рисования в области 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);