Спутник вращается вокруг земли, при нажатии кнопки, он переходит в эллипсоидную орбиту - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Хотел попросить помощи с задачками, похожих не нашел, создал тему. Заранее спасибо! Задача 2. Анимация: «Спутник вращается вокруг земли, при нажатии кнопки, он переходит в эллипсоидную орбиту, относительно той точки в которой находится.» (т.е. начать двигаться по наклонному эллипсу, из той точки в которой он находится). У меня получилось только так:

Решение задачи: «Спутник вращается вокруг земли, при нажатии кнопки, он переходит в эллипсоидную орбиту»

textual
Листинг программы
uses graphABC,crt;
var x,y,x1,y1,n,x2,y2, k:integer;
    ox, oy, oz: real;
    u:real;
//движение по эллипсам
procedure DvOsX(var x,y,x1,y1,x2: integer; u:real);
begin
repeat
  delay(50);
  setpencolor(clWhite);
  circle(x2,y1,10);
  u:=u+0.04;
  setpencolor(clRed);
  x2:=2*x-x1+round(200*cos(u));
  y1:=y-round(150*sin(u));
  circle(x2,y1,10);
  FloodFill(x2,y1,clblack)      ;
  textout(20,370,'Нажмите "Enter" для запуска двигателей');
  until k=1000
end;
procedure DvOsY(var x,y,x1,y1,y2: integer; u:real);
begin
repeat
  delay(50);
  setpencolor(clWhite);
  circle(x1,y2,10);
  u:=u+0.04;
  setpencolor(clRed);
  x1:=x+round(150*cos(u));
  y2:=2*y-y1-round(200*sin(u));
  circle(x1,y2,10);
  FloodFill(x1,y2,clblack)  ;     {цвет спутника}
  textout(20,370,'Нажмите "Enter" для запуска двигателей');
  until k=1000
  end;
procedure DvOsi(var x,y,x1,y1,x2,y2: integer; u:real);
begin
repeat
  delay(50);
  setpencolor(clWhite);
  circle(x2,y2,10);
  u:=u+0.04;
  setpencolor(clRed);
  x2:=2*x-x1+round(200*cos(u));
  y2:=2*y-y1-round(200*sin(u));
  circle(x2,y2,10);
  FloodFill(x2,y2,clblack);
  textout(20,370,'Нажмите "Enter" для запуска двигателей');
  until k=1000
end;
 
begin
//описание картинки
textout(20,370,'Нажмите "Enter" для запуска двигателей');
circle(320,200,75);               {Земля}
FloodFill(320,200,clskyblue)  ;   {цвет земли}
hidecursor;
x:=320;
y:=200;
u:=0;
setpencolor(clRed);
x1:=x+round(100*cos(u));
y1:=y-round(100*sin(u));
//если поменять синус и косинус, вращение в другую сторону
circle(x1,y1,10);
FloodFill(x1,y1,clblack)  ;     {цвет спутника}
repeat
delay(50);
setpencolor(clWhite);
circle(x1,y1,10);
u:=u+0.04;
setpencolor(clRed);
x1:=x+round(100*cos(u));
y1:=y-round(100*sin(u));
circle(x1,y1,10);
FloodFill(x1,y1,clblack)  ;     {цвет спутника}
until keypressed;
hidecursor;
//замазка
setpencolor(clWhite);
circle(x1,y1,10);
//выход на нужную ось
oz:= 7800;
ox:= Sqr(x-x1);
oy:= Sqr(y-y1);
if (ox > oy) and ( ox > oz)
then  DvOsX (x,y,x1,y1,x2,u)
else  if (ox < oy) and (oy > oz)
      then DvOsY (x,y,x1,y1,y2,u)
      else DvOsi (x,y,x1,y1,x2,y2,u)
end.

Объяснение кода листинга программы

  1. В этом коде спутник движется по эллиптической орбите вокруг Земли.
  2. При нажатии кнопки Enter двигатели спутника включаются.
  3. Синяя точка на экране представляет Землю, а красная точка - спутник.
  4. Цвет спутника устанавливается через переменную clblack.
  5. Движение спутника можно изменить, поменяв значения синуса и косинуса в функциях DvOsX, DvOsY и DvOsi.
  6. Вращение спутника происходит против часовой стрелки, если смотреть сверху на Землю.
  7. Для выхода на нужную ось используется функция DvOsi.
  8. Значения переменных ox, oy и oz используются для определения текущего положения спутника относительно Земли.
  9. Если расстояние от спутника до Земли по оси X больше, чем по оси Y и Z, то выполняется функция DvOsX.
  10. Если расстояние от спутника до Земли по оси X меньше, чем по оси Y, но больше, чем по оси Z, то выполняется функция DvOsY.
  11. Во всех остальных случаях выполняется функция DvOsi.

Оцени полезность:

6   голосов , оценка 3.333 из 5
Похожие ответы